diff --git a/drivers/net/wireless/realtek/Kconfig b/drivers/net/wireless/realtek/Kconfig index 7690a0bec08c13..dc305096333464 100644 --- a/drivers/net/wireless/realtek/Kconfig +++ b/drivers/net/wireless/realtek/Kconfig @@ -17,9 +17,9 @@ source "drivers/net/wireless/realtek/rtlwifi/Kconfig" source "drivers/net/wireless/realtek/rtl8xxxu/Kconfig" source "drivers/net/wireless/realtek/rtw88/Kconfig" source "drivers/net/wireless/realtek/rtw89/Kconfig" -source "drivers/net/wireless/realtek/rtl8812au/Kconfig" source "drivers/net/wireless/realtek/rtl8192eu/Kconfig" source "drivers/net/wireless/realtek/rtl8723bu/Kconfig" source "drivers/net/wireless/realtek/rtl88x2bu/Kconfig" +source "drivers/net/wireless/realtek/rtl8821au/Kconfig" endif # WLAN_VENDOR_REALTEK diff --git a/drivers/net/wireless/realtek/Makefile b/drivers/net/wireless/realtek/Makefile index f176483505392d..3135f4f5f7bc69 100644 --- a/drivers/net/wireless/realtek/Makefile +++ b/drivers/net/wireless/realtek/Makefile @@ -9,8 +9,7 @@ obj-$(CONFIG_RTLWIFI) += rtlwifi/ obj-$(CONFIG_RTL8XXXU) += rtl8xxxu/ obj-$(CONFIG_RTW88) += rtw88/ obj-$(CONFIG_RTW89) += rtw89/ -obj-$(CONFIG_88XXAU) += rtl8812au/ obj-$(CONFIG_RTL8192EU) += rtl8192eu/ obj-$(CONFIG_RTL8723BU) += rtl8723bu/ obj-$(CONFIG_RTL8822BU) += rtl88x2bu/ - +obj-$(CONFIG_RTL8821AU) += rtl8821au/ diff --git a/drivers/net/wireless/realtek/rtl8812au/Kconfig b/drivers/net/wireless/realtek/rtl8812au/Kconfig deleted file mode 100644 index 59e3f3594531ac..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/Kconfig +++ /dev/null @@ -1,6 +0,0 @@ -config 88XXAU - tristate "Realtek 88XXau USB WiFi" - depends on USB - help - Help message of 88XXau - diff --git a/drivers/net/wireless/realtek/rtl8812au/LICENSE b/drivers/net/wireless/realtek/rtl8812au/LICENSE deleted file mode 100644 index d159169d105089..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/LICENSE +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program'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 Program a copy of this License -along with the Program. - -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 Program or any portion -of it, thus forming a work based on the Program, 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 Program 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 program 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 program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program 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 Program, -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 Program, 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. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (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 program 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. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies 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 Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program 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. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program 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 Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -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. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "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 PROGRAM IS WITH YOU. SHOULD THE -PROGRAM 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 PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - 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., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/drivers/net/wireless/realtek/rtl8812au/README.md b/drivers/net/wireless/realtek/rtl8812au/README.md deleted file mode 100644 index 3a0617b631b756..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/README.md +++ /dev/null @@ -1,216 +0,0 @@ -## RTL8812AU/21AU and RTL8814AU Wireless drivers -Only for use with Linux & Android - -[![Monitor mode](https://img.shields.io/badge/monitor%20mode-working-brightgreen.svg)](#) -[![Frame Injection](https://img.shields.io/badge/frame%20injection-working-brightgreen.svg)](#) -[![GitHub version](https://raster.shields.io/badge/version-v5.6.4.2-lightgrey.svg)](#) -[![GitHub issues](https://img.shields.io/github/issues/aircrack-ng/rtl8812au.svg)](https://github.com/aircrack-ng/rtl8812au/issues) -[![GitHub forks](https://img.shields.io/github/forks/aircrack-ng/rtl8812au.svg)](https://github.com/aircrack-ng/rtl8812au/network) -[![GitHub stars](https://img.shields.io/github/stars/aircrack-ng/rtl8812au.svg)](https://github.com/aircrack-ng/rtl8812au/stargazers) -[![Build Status](https://travis-ci.org/aircrack-ng/rtl8812au.svg?branch=v5.6.4.2)](https://travis-ci.org/aircrack-ng/rtl8812au) -[![GitHub license](https://img.shields.io/github/license/aircrack-ng/rtl8812au.svg)](https://github.com/aircrack-ng/rtl8812au/blob/master/LICENSE) -
-[![Kali](https://img.shields.io/badge/Kali-supported-blue.svg)](https://www.kali.org) -[![Arch](https://img.shields.io/badge/Arch-supported-blue.svg)](https://www.archlinux.org) -[![Armbian](https://img.shields.io/badge/Armbian-supported-blue.svg)](https://www.armbian.com) -[![ArchLinux](https://img.shields.io/badge/ArchLinux-supported-blue.svg)](https://img.shields.io/badge/ArchLinux-supported-blue.svg) -[![aircrack-ng](https://img.shields.io/badge/aircrack--ng-supported-blue.svg)](https://github.com/aircrack-ng/aircrack-ng) -[![wifite2](https://img.shields.io/badge/wifite2-supported-blue.svg)](https://github.com/kimocoder/wifite2) - - -### Important! - -``` -* Use "ip" and "iw" instead of "ifconfig" and "iwconfig" - It's described further down, READ THE README! -``` - -### IPERF3 benchmark - -**[Device]** Alfa Networks AWUS036ACH
-**[Chipset]** 88XXau (rtl8812au)
-**[Branch]** v5.6.4.1
-**[Distance]** 10m free sight - -``` -[ ID] Interval Transfer Bitrate Retr Cwnd -[ 5] 0.00-1.00 sec 11.6 MBytes 97.4 Mbits/sec 0 96.2 KBytes -[ 5] 1.00-2.00 sec 11.2 MBytes 93.8 Mbits/sec 0 100 KBytes -[ 5] 2.00-3.00 sec 11.2 MBytes 93.8 Mbits/sec 0 100 KBytes -[ 5] 3.00-4.00 sec 11.2 MBytes 93.8 Mbits/sec 0 100 KBytes -[ 5] 4.00-5.00 sec 11.2 MBytes 93.8 Mbits/sec 0 100 KBytes -[ 5] 5.00-6.00 sec 11.4 MBytes 95.9 Mbits/sec 0 105 KBytes -[ 5] 6.00-7.00 sec 11.2 MBytes 93.8 Mbits/sec 0 105 KBytes -[ 5] 7.00-8.00 sec 11.3 MBytes 94.9 Mbits/sec 0 157 KBytes -[ 5] 8.00-9.00 sec 11.2 MBytes 93.8 Mbits/sec 0 157 KBytes -[ 5] 9.00-10.00 sec 11.2 MBytes 94.3 Mbits/sec 0 157 KBytes -[ 5] 10.00-11.00 sec 11.2 MBytes 93.8 Mbits/sec 0 157 KBytes -[ 5] 11.00-12.00 sec 11.2 MBytes 93.8 Mbits/sec 0 157 KBytes -[ 5] 12.00-13.00 sec 11.2 MBytes 94.4 Mbits/sec 0 157 KBytes -[ 5] 13.00-14.00 sec 11.2 MBytes 93.8 Mbits/sec 0 157 KBytes -[ 5] 14.00-15.00 sec 11.2 MBytes 94.4 Mbits/sec 0 157 KBytes -[ 5] 15.00-16.00 sec 10.9 MBytes 91.7 Mbits/sec 0 157 KBytes -[ 5] 16.00-17.00 sec 11.2 MBytes 94.4 Mbits/sec 0 157 KBytes -[ 5] 17.00-18.00 sec 11.2 MBytes 94.4 Mbits/sec 0 157 KBytes -[ 5] 18.00-19.00 sec 11.2 MBytes 94.4 Mbits/sec 0 157 KBytes -[ 5] 19.00-20.00 sec 11.2 MBytes 93.8 Mbits/sec 0 157 KBytes -[ 5] 20.00-21.00 sec 11.2 MBytes 93.8 Mbits/sec 0 157 KBytes -[ 5] 21.00-22.00 sec 11.2 MBytes 93.8 Mbits/sec 0 157 KBytes -[ 5] 22.00-23.00 sec 11.2 MBytes 93.8 Mbits/sec 0 157 KBytes -- - - - - - - - - - - - - - - - - - - - - - - - - -[ ID] Interval Transfer Bitrate Retr -[ 5] 0.00-23.15 sec 260 MBytes 94.2 Mbits/sec 0 sender -[ 5] 0.00-23.15 sec 0.00 Bytes 0.00 bits/sec receiver -``` - -### DKMS -This driver can be installed using [DKMS]. This is a system which will automatically recompile and install a kernel module when a new kernel gets installed or updated. To make use of DKMS, install the `dkms` package, which on Debian (based) systems is done like this: -``` -$ sudo apt-get install dkms -``` - -### Download -``` -$ git clone -b v5.6.4.2 https://github.com/aircrack-ng/rtl8812au.git -cd rtl* -``` - -### Installation of Driver -In order to install the driver open a terminal in the directory with the source code and execute the following command: -``` -$ sudo make dkms_install -``` - -### Removal of Driver -In order to remove the driver from your system open a terminal in the directory with the source code and execute the following command: -``` -$ sudo make dkms_remove -``` - -### Make -For building & installing the driver with 'make' use -``` -$ make && make install -``` - -Package / Build dependencies (Kali) -``` -$ sudo apt-get update -$ sudo apt-get install bc mokutil build-essential libelf-dev linux-headers-`uname -r` -``` -#### For Raspberry (RPI) - -``` -$ sudo apt-get install raspberrypi-kernel-headers -``` - -Then change the platform in Makefile to 32-bit `ARM` architecture (RPi 1/2/3/ & 0/Zero): -``` -$ sed -i 's/CONFIG_PLATFORM_I386_PC = y/CONFIG_PLATFORM_I386_PC = n/g' Makefile -$ sed -i 's/CONFIG_PLATFORM_ARM_RPI = n/CONFIG_PLATFORM_ARM_RPI = y/g' Makefile -``` - -Or, for `ARM64` (RPI 3B+, 4B and Zero2) you will need to run: -``` -$ sed -i 's/CONFIG_PLATFORM_I386_PC = y/CONFIG_PLATFORM_I386_PC = n/g' Makefile -$ sed -i 's/CONFIG_PLATFORM_ARM64_RPI = n/CONFIG_PLATFORM_ARM64_RPI = y/g' Makefile -``` - -In addition, if you receive an error message about `unrecognized command line option ‘-mgeneral-regs-only’` (i.e., Raspbian Buster), you will need to run the following commands for `ARM` architecture, then retry building and installing: -``` -$ export ARCH=arm -$ sed -i 's/^MAKE="/MAKE="ARCH=arm\ /' dkms.conf -``` - -Or, for `ARM64` run the following before re-building: - -``` -$ export ARCH=arm64 -$ sed -i 's/^MAKE="/MAKE="ARCH=arm64\ /' dkms.conf -``` - -Building the driver may exceed RAM on some RPi's resulting in a `gcc: fatal error: Killed signal terminated program cc1` error. Swap space can be increased in `/etc/dphys-swapfile` e.g. to `2000` megabytes, followed by `/etc/init.d/dphys-swapfile restart`. Building on swap is very slow, however. - -For setting monitor mode - 1. Fix problematic interference in monitor mode. - ``` - $ airmon-ng check kill - ``` - You may also uncheck the box "Automatically connect to this network when it is avaiable" in nm-connection-editor. This only works if you have a saved wifi connection. - - 2. Set interface down - ``` - $ sudo ip link set wlan0 down - ``` - 3. Set monitor mode - ``` - $ sudo iw dev wlan0 set type monitor - ``` - 4. Set interface up - ``` - $ sudo ip link set wlan0 up - ``` -For setting TX power -``` -$ sudo iw wlan0 set txpower fixed 3000 -``` - -### LED control - -#### statically by module parameter in /etc/modprobe.d/8812au.conf or wherever, for example: - -```sh -options 88XXau rtw_led_ctrl=0 -``` -value can be 0 or 1 - -#### or dynamically by writing to /proc/net/rtl8812au/$(your interface name)/led_ctrl, for example: - -```sh -$ echo "0" > /proc/net/rtl8812au/$(your interface name)/led_ctrl -``` -value can be 0 or 1 - -#### check current value: - -```sh -$ cat /proc/net/rtl8812au/$(your interface name)/led_ctrl -``` - -### USB Mode Switch - -0: doesn't switch, 1: switch from usb2.0 to usb 3.0 2: switch from usb3.0 to usb 2.0 -```sh -$ rmmod 88XXau -$ modprobe 88XXau rtw_switch_usb_mode=int (0: no switch 1: switch from usb2 to usb3 2: switch from usb3 to usb2) -``` - -### NetworkManager - -Newer versions of NetworkManager switches to random MAC address. Some users would prefer to use a fixed address. -Simply add these lines below -``` -[device] -wifi.scan-rand-mac-address=no -``` -at the end of file /etc/NetworkManager/NetworkManager.conf and restart NetworkManager with the command: -``` -$ sudo service NetworkManager restart -``` - -### Credits / Contributors - -``` -Alfa Networks - https://www.alfa.com.tw/ -Realtek. - https://www.realtek.com -aircrack-ng - https://www.aircrack-ng.org - -astsam - https://github.com/astsam -evilphish - https://github.com/evilphish -fariouche - https://github.com/fariouche -CGarces - https://github.com/CGarces -ZerBea - https://github.com/ZerBea -lwfinger - https://github.com/lwfinger -Ulli-Kroll. - https://github.com/Ulli-Kroll - -``` diff --git a/drivers/net/wireless/realtek/rtl8812au/ReleaseNotes.pdf b/drivers/net/wireless/realtek/rtl8812au/ReleaseNotes.pdf deleted file mode 100644 index 6ead272e30823d..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/ReleaseNotes.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_10.x/Realtek_Wi-Fi_SDK_for_Android_10.pdf b/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_10.x/Realtek_Wi-Fi_SDK_for_Android_10.pdf deleted file mode 100644 index c82966e994530f..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_10.x/Realtek_Wi-Fi_SDK_for_Android_10.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_10.x/realtek_wifi_SDK_for_android_10_x_20191008.tgz b/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_10.x/realtek_wifi_SDK_for_android_10_x_20191008.tgz deleted file mode 100644 index e580811b2ba2d0..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_10.x/realtek_wifi_SDK_for_android_10_x_20191008.tgz and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_10.x/wpa_supplicant_8_10.x_rtw_29226.20191002.tgz b/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_10.x/wpa_supplicant_8_10.x_rtw_29226.20191002.tgz deleted file mode 100644 index 844457472452bb..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_10.x/wpa_supplicant_8_10.x_rtw_29226.20191002.tgz and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_11.x/Realtek_Wi-Fi_SDK_for_Android_11.pdf b/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_11.x/Realtek_Wi-Fi_SDK_for_Android_11.pdf deleted file mode 100644 index f3db2ffc5b0906..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_11.x/Realtek_Wi-Fi_SDK_for_Android_11.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_JB_4.2/Realtek_Wi-Fi_SDK_for_Android_JB_4.pdf b/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_JB_4.2/Realtek_Wi-Fi_SDK_for_Android_JB_4.pdf deleted file mode 100644 index eec1d3e64d3ae6..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_JB_4.2/Realtek_Wi-Fi_SDK_for_Android_JB_4.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_JB_4.2/linux-3.0.42_STATION_INFO_ASSOC_REQ_IES.diff b/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_JB_4.2/linux-3.0.42_STATION_INFO_ASSOC_REQ_IES.diff deleted file mode 100644 index 6298f27a611ac7..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_JB_4.2/linux-3.0.42_STATION_INFO_ASSOC_REQ_IES.diff +++ /dev/null @@ -1,57 +0,0 @@ -diff -urN linux-3.0.42/include/net/cfg80211.h linux-3.0.42-patch/include/net/cfg80211.h ---- linux-3.0.42/include/net/cfg80211.h 2012-09-05 21:02:06.960467827 +0800 -+++ linux-3.0.42-patch/include/net/cfg80211.h 2012-09-05 21:00:09.775049000 +0800 -@@ -426,6 +426,7 @@ - * @STATION_INFO_RX_BITRATE: @rxrate fields are filled - * @STATION_INFO_BSS_PARAM: @bss_param filled - * @STATION_INFO_CONNECTED_TIME: @connected_time filled -+ * @STATION_INFO_ASSOC_REQ_IES: @assoc_req_ies filled - */ - enum station_info_flags { - STATION_INFO_INACTIVE_TIME = 1<<0, -@@ -444,7 +445,8 @@ - STATION_INFO_SIGNAL_AVG = 1<<13, - STATION_INFO_RX_BITRATE = 1<<14, - STATION_INFO_BSS_PARAM = 1<<15, -- STATION_INFO_CONNECTED_TIME = 1<<16 -+ STATION_INFO_CONNECTED_TIME = 1<<16, -+ STATION_INFO_ASSOC_REQ_IES = 1<<17 - }; - - /** -@@ -536,6 +538,11 @@ - * This number should increase every time the list of stations - * changes, i.e. when a station is added or removed, so that - * userspace can tell whether it got a consistent snapshot. -+ * @assoc_req_ies: IEs from (Re)Association Request. -+ * This is used only when in AP mode with drivers that do not use -+ * user space MLME/SME implementation. The information is provided for -+ * the cfg80211_new_sta() calls to notify user space of the IEs. -+ * @assoc_req_ies_len: Length of assoc_req_ies buffer in octets. - */ - struct station_info { - u32 filled; -@@ -558,6 +565,9 @@ - struct sta_bss_parameters bss_param; - - int generation; -+ -+ const u8 *assoc_req_ies; -+ size_t assoc_req_ies_len; - }; - - /** -diff -urN linux-3.0.42/net/wireless/nl80211.c linux-3.0.42-patch/net/wireless/nl80211.c ---- linux-3.0.42/net/wireless/nl80211.c 2012-09-05 21:03:25.528853240 +0800 -+++ linux-3.0.42-patch/net/wireless/nl80211.c 2012-09-05 20:47:08.472824000 +0800 -@@ -2213,6 +2213,10 @@ - } - nla_nest_end(msg, sinfoattr); - -+ if (sinfo->filled & STATION_INFO_ASSOC_REQ_IES) -+ NLA_PUT(msg, NL80211_ATTR_IE, sinfo->assoc_req_ies_len, -+ sinfo->assoc_req_ies); -+ - return genlmsg_end(msg, hdr); - - nla_put_failure: diff --git a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_KK_4.4/Realtek_Wi-Fi_SDK_for_Android_KK_4.4.pdf b/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_KK_4.4/Realtek_Wi-Fi_SDK_for_Android_KK_4.4.pdf deleted file mode 100644 index 91fd50f2a9fdcf..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_KK_4.4/Realtek_Wi-Fi_SDK_for_Android_KK_4.4.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_KK_4.4/linux-3.0.42_STATION_INFO_ASSOC_REQ_IES.diff b/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_KK_4.4/linux-3.0.42_STATION_INFO_ASSOC_REQ_IES.diff deleted file mode 100644 index 6298f27a611ac7..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_KK_4.4/linux-3.0.42_STATION_INFO_ASSOC_REQ_IES.diff +++ /dev/null @@ -1,57 +0,0 @@ -diff -urN linux-3.0.42/include/net/cfg80211.h linux-3.0.42-patch/include/net/cfg80211.h ---- linux-3.0.42/include/net/cfg80211.h 2012-09-05 21:02:06.960467827 +0800 -+++ linux-3.0.42-patch/include/net/cfg80211.h 2012-09-05 21:00:09.775049000 +0800 -@@ -426,6 +426,7 @@ - * @STATION_INFO_RX_BITRATE: @rxrate fields are filled - * @STATION_INFO_BSS_PARAM: @bss_param filled - * @STATION_INFO_CONNECTED_TIME: @connected_time filled -+ * @STATION_INFO_ASSOC_REQ_IES: @assoc_req_ies filled - */ - enum station_info_flags { - STATION_INFO_INACTIVE_TIME = 1<<0, -@@ -444,7 +445,8 @@ - STATION_INFO_SIGNAL_AVG = 1<<13, - STATION_INFO_RX_BITRATE = 1<<14, - STATION_INFO_BSS_PARAM = 1<<15, -- STATION_INFO_CONNECTED_TIME = 1<<16 -+ STATION_INFO_CONNECTED_TIME = 1<<16, -+ STATION_INFO_ASSOC_REQ_IES = 1<<17 - }; - - /** -@@ -536,6 +538,11 @@ - * This number should increase every time the list of stations - * changes, i.e. when a station is added or removed, so that - * userspace can tell whether it got a consistent snapshot. -+ * @assoc_req_ies: IEs from (Re)Association Request. -+ * This is used only when in AP mode with drivers that do not use -+ * user space MLME/SME implementation. The information is provided for -+ * the cfg80211_new_sta() calls to notify user space of the IEs. -+ * @assoc_req_ies_len: Length of assoc_req_ies buffer in octets. - */ - struct station_info { - u32 filled; -@@ -558,6 +565,9 @@ - struct sta_bss_parameters bss_param; - - int generation; -+ -+ const u8 *assoc_req_ies; -+ size_t assoc_req_ies_len; - }; - - /** -diff -urN linux-3.0.42/net/wireless/nl80211.c linux-3.0.42-patch/net/wireless/nl80211.c ---- linux-3.0.42/net/wireless/nl80211.c 2012-09-05 21:03:25.528853240 +0800 -+++ linux-3.0.42-patch/net/wireless/nl80211.c 2012-09-05 20:47:08.472824000 +0800 -@@ -2213,6 +2213,10 @@ - } - nla_nest_end(msg, sinfoattr); - -+ if (sinfo->filled & STATION_INFO_ASSOC_REQ_IES) -+ NLA_PUT(msg, NL80211_ATTR_IE, sinfo->assoc_req_ies_len, -+ sinfo->assoc_req_ies); -+ - return genlmsg_end(msg, hdr); - - nla_put_failure: diff --git a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_L_5.x/Realtek_Wi-Fi_SDK_for_Android_L_5.pdf b/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_L_5.x/Realtek_Wi-Fi_SDK_for_Android_L_5.pdf deleted file mode 100644 index a0bb64530f9eac..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_L_5.x/Realtek_Wi-Fi_SDK_for_Android_L_5.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_L_5.x/linux-3.0.42_STATION_INFO_ASSOC_REQ_IES.diff b/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_L_5.x/linux-3.0.42_STATION_INFO_ASSOC_REQ_IES.diff deleted file mode 100644 index 6298f27a611ac7..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_L_5.x/linux-3.0.42_STATION_INFO_ASSOC_REQ_IES.diff +++ /dev/null @@ -1,57 +0,0 @@ -diff -urN linux-3.0.42/include/net/cfg80211.h linux-3.0.42-patch/include/net/cfg80211.h ---- linux-3.0.42/include/net/cfg80211.h 2012-09-05 21:02:06.960467827 +0800 -+++ linux-3.0.42-patch/include/net/cfg80211.h 2012-09-05 21:00:09.775049000 +0800 -@@ -426,6 +426,7 @@ - * @STATION_INFO_RX_BITRATE: @rxrate fields are filled - * @STATION_INFO_BSS_PARAM: @bss_param filled - * @STATION_INFO_CONNECTED_TIME: @connected_time filled -+ * @STATION_INFO_ASSOC_REQ_IES: @assoc_req_ies filled - */ - enum station_info_flags { - STATION_INFO_INACTIVE_TIME = 1<<0, -@@ -444,7 +445,8 @@ - STATION_INFO_SIGNAL_AVG = 1<<13, - STATION_INFO_RX_BITRATE = 1<<14, - STATION_INFO_BSS_PARAM = 1<<15, -- STATION_INFO_CONNECTED_TIME = 1<<16 -+ STATION_INFO_CONNECTED_TIME = 1<<16, -+ STATION_INFO_ASSOC_REQ_IES = 1<<17 - }; - - /** -@@ -536,6 +538,11 @@ - * This number should increase every time the list of stations - * changes, i.e. when a station is added or removed, so that - * userspace can tell whether it got a consistent snapshot. -+ * @assoc_req_ies: IEs from (Re)Association Request. -+ * This is used only when in AP mode with drivers that do not use -+ * user space MLME/SME implementation. The information is provided for -+ * the cfg80211_new_sta() calls to notify user space of the IEs. -+ * @assoc_req_ies_len: Length of assoc_req_ies buffer in octets. - */ - struct station_info { - u32 filled; -@@ -558,6 +565,9 @@ - struct sta_bss_parameters bss_param; - - int generation; -+ -+ const u8 *assoc_req_ies; -+ size_t assoc_req_ies_len; - }; - - /** -diff -urN linux-3.0.42/net/wireless/nl80211.c linux-3.0.42-patch/net/wireless/nl80211.c ---- linux-3.0.42/net/wireless/nl80211.c 2012-09-05 21:03:25.528853240 +0800 -+++ linux-3.0.42-patch/net/wireless/nl80211.c 2012-09-05 20:47:08.472824000 +0800 -@@ -2213,6 +2213,10 @@ - } - nla_nest_end(msg, sinfoattr); - -+ if (sinfo->filled & STATION_INFO_ASSOC_REQ_IES) -+ NLA_PUT(msg, NL80211_ATTR_IE, sinfo->assoc_req_ies_len, -+ sinfo->assoc_req_ies); -+ - return genlmsg_end(msg, hdr); - - nla_put_failure: diff --git a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_L_5.x/realtek_wifi_SDK_for_android_L_5.x_20150811.tgz b/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_L_5.x/realtek_wifi_SDK_for_android_L_5.x_20150811.tgz deleted file mode 100644 index 70b6eb98ff7ead..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_L_5.x/realtek_wifi_SDK_for_android_L_5.x_20150811.tgz and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_M_6.x/Realtek_Wi-Fi_SDK_for_Android_M_6.pdf b/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_M_6.x/Realtek_Wi-Fi_SDK_for_Android_M_6.pdf deleted file mode 100644 index 954f418f80551e..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_M_6.x/Realtek_Wi-Fi_SDK_for_Android_M_6.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_M_6.x/linux-3.0.42_STATION_INFO_ASSOC_REQ_IES.diff b/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_M_6.x/linux-3.0.42_STATION_INFO_ASSOC_REQ_IES.diff deleted file mode 100644 index 6298f27a611ac7..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_M_6.x/linux-3.0.42_STATION_INFO_ASSOC_REQ_IES.diff +++ /dev/null @@ -1,57 +0,0 @@ -diff -urN linux-3.0.42/include/net/cfg80211.h linux-3.0.42-patch/include/net/cfg80211.h ---- linux-3.0.42/include/net/cfg80211.h 2012-09-05 21:02:06.960467827 +0800 -+++ linux-3.0.42-patch/include/net/cfg80211.h 2012-09-05 21:00:09.775049000 +0800 -@@ -426,6 +426,7 @@ - * @STATION_INFO_RX_BITRATE: @rxrate fields are filled - * @STATION_INFO_BSS_PARAM: @bss_param filled - * @STATION_INFO_CONNECTED_TIME: @connected_time filled -+ * @STATION_INFO_ASSOC_REQ_IES: @assoc_req_ies filled - */ - enum station_info_flags { - STATION_INFO_INACTIVE_TIME = 1<<0, -@@ -444,7 +445,8 @@ - STATION_INFO_SIGNAL_AVG = 1<<13, - STATION_INFO_RX_BITRATE = 1<<14, - STATION_INFO_BSS_PARAM = 1<<15, -- STATION_INFO_CONNECTED_TIME = 1<<16 -+ STATION_INFO_CONNECTED_TIME = 1<<16, -+ STATION_INFO_ASSOC_REQ_IES = 1<<17 - }; - - /** -@@ -536,6 +538,11 @@ - * This number should increase every time the list of stations - * changes, i.e. when a station is added or removed, so that - * userspace can tell whether it got a consistent snapshot. -+ * @assoc_req_ies: IEs from (Re)Association Request. -+ * This is used only when in AP mode with drivers that do not use -+ * user space MLME/SME implementation. The information is provided for -+ * the cfg80211_new_sta() calls to notify user space of the IEs. -+ * @assoc_req_ies_len: Length of assoc_req_ies buffer in octets. - */ - struct station_info { - u32 filled; -@@ -558,6 +565,9 @@ - struct sta_bss_parameters bss_param; - - int generation; -+ -+ const u8 *assoc_req_ies; -+ size_t assoc_req_ies_len; - }; - - /** -diff -urN linux-3.0.42/net/wireless/nl80211.c linux-3.0.42-patch/net/wireless/nl80211.c ---- linux-3.0.42/net/wireless/nl80211.c 2012-09-05 21:03:25.528853240 +0800 -+++ linux-3.0.42-patch/net/wireless/nl80211.c 2012-09-05 20:47:08.472824000 +0800 -@@ -2213,6 +2213,10 @@ - } - nla_nest_end(msg, sinfoattr); - -+ if (sinfo->filled & STATION_INFO_ASSOC_REQ_IES) -+ NLA_PUT(msg, NL80211_ATTR_IE, sinfo->assoc_req_ies_len, -+ sinfo->assoc_req_ies); -+ - return genlmsg_end(msg, hdr); - - nla_put_failure: diff --git a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_M_6.x/realtek_wifi_SDK_for_android_M_6.x_20151116.tgz b/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_M_6.x/realtek_wifi_SDK_for_android_M_6.x_20151116.tgz deleted file mode 100644 index b9dff4488a402d..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_M_6.x/realtek_wifi_SDK_for_android_M_6.x_20151116.tgz and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_N_7.0/Realtek_Wi-Fi_SDK_for_Android_N_7.0.pdf b/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_N_7.0/Realtek_Wi-Fi_SDK_for_Android_N_7.0.pdf deleted file mode 100644 index 43d39a2871c77e..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_N_7.0/Realtek_Wi-Fi_SDK_for_Android_N_7.0.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_N_7.0/linux-3.0.42_STATION_INFO_ASSOC_REQ_IES.diff b/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_N_7.0/linux-3.0.42_STATION_INFO_ASSOC_REQ_IES.diff deleted file mode 100644 index 6298f27a611ac7..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_N_7.0/linux-3.0.42_STATION_INFO_ASSOC_REQ_IES.diff +++ /dev/null @@ -1,57 +0,0 @@ -diff -urN linux-3.0.42/include/net/cfg80211.h linux-3.0.42-patch/include/net/cfg80211.h ---- linux-3.0.42/include/net/cfg80211.h 2012-09-05 21:02:06.960467827 +0800 -+++ linux-3.0.42-patch/include/net/cfg80211.h 2012-09-05 21:00:09.775049000 +0800 -@@ -426,6 +426,7 @@ - * @STATION_INFO_RX_BITRATE: @rxrate fields are filled - * @STATION_INFO_BSS_PARAM: @bss_param filled - * @STATION_INFO_CONNECTED_TIME: @connected_time filled -+ * @STATION_INFO_ASSOC_REQ_IES: @assoc_req_ies filled - */ - enum station_info_flags { - STATION_INFO_INACTIVE_TIME = 1<<0, -@@ -444,7 +445,8 @@ - STATION_INFO_SIGNAL_AVG = 1<<13, - STATION_INFO_RX_BITRATE = 1<<14, - STATION_INFO_BSS_PARAM = 1<<15, -- STATION_INFO_CONNECTED_TIME = 1<<16 -+ STATION_INFO_CONNECTED_TIME = 1<<16, -+ STATION_INFO_ASSOC_REQ_IES = 1<<17 - }; - - /** -@@ -536,6 +538,11 @@ - * This number should increase every time the list of stations - * changes, i.e. when a station is added or removed, so that - * userspace can tell whether it got a consistent snapshot. -+ * @assoc_req_ies: IEs from (Re)Association Request. -+ * This is used only when in AP mode with drivers that do not use -+ * user space MLME/SME implementation. The information is provided for -+ * the cfg80211_new_sta() calls to notify user space of the IEs. -+ * @assoc_req_ies_len: Length of assoc_req_ies buffer in octets. - */ - struct station_info { - u32 filled; -@@ -558,6 +565,9 @@ - struct sta_bss_parameters bss_param; - - int generation; -+ -+ const u8 *assoc_req_ies; -+ size_t assoc_req_ies_len; - }; - - /** -diff -urN linux-3.0.42/net/wireless/nl80211.c linux-3.0.42-patch/net/wireless/nl80211.c ---- linux-3.0.42/net/wireless/nl80211.c 2012-09-05 21:03:25.528853240 +0800 -+++ linux-3.0.42-patch/net/wireless/nl80211.c 2012-09-05 20:47:08.472824000 +0800 -@@ -2213,6 +2213,10 @@ - } - nla_nest_end(msg, sinfoattr); - -+ if (sinfo->filled & STATION_INFO_ASSOC_REQ_IES) -+ NLA_PUT(msg, NL80211_ATTR_IE, sinfo->assoc_req_ies_len, -+ sinfo->assoc_req_ies); -+ - return genlmsg_end(msg, hdr); - - nla_put_failure: diff --git a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_N_7.0/realtek_wifi_SDK_for_android_N_7.0_20161024.zip b/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_N_7.0/realtek_wifi_SDK_for_android_N_7.0_20161024.zip deleted file mode 100644 index e5a675ccd37d4f..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_N_7.0/realtek_wifi_SDK_for_android_N_7.0_20161024.zip and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_O_8.0/Realtek_Wi-Fi_SDK_for_Android_O_8.0.pdf b/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_O_8.0/Realtek_Wi-Fi_SDK_for_Android_O_8.0.pdf deleted file mode 100644 index 59ca1e78c568f9..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_O_8.0/Realtek_Wi-Fi_SDK_for_Android_O_8.0.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_O_8.0/linux-3.0.42_STATION_INFO_ASSOC_REQ_IES.diff b/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_O_8.0/linux-3.0.42_STATION_INFO_ASSOC_REQ_IES.diff deleted file mode 100644 index 6298f27a611ac7..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_O_8.0/linux-3.0.42_STATION_INFO_ASSOC_REQ_IES.diff +++ /dev/null @@ -1,57 +0,0 @@ -diff -urN linux-3.0.42/include/net/cfg80211.h linux-3.0.42-patch/include/net/cfg80211.h ---- linux-3.0.42/include/net/cfg80211.h 2012-09-05 21:02:06.960467827 +0800 -+++ linux-3.0.42-patch/include/net/cfg80211.h 2012-09-05 21:00:09.775049000 +0800 -@@ -426,6 +426,7 @@ - * @STATION_INFO_RX_BITRATE: @rxrate fields are filled - * @STATION_INFO_BSS_PARAM: @bss_param filled - * @STATION_INFO_CONNECTED_TIME: @connected_time filled -+ * @STATION_INFO_ASSOC_REQ_IES: @assoc_req_ies filled - */ - enum station_info_flags { - STATION_INFO_INACTIVE_TIME = 1<<0, -@@ -444,7 +445,8 @@ - STATION_INFO_SIGNAL_AVG = 1<<13, - STATION_INFO_RX_BITRATE = 1<<14, - STATION_INFO_BSS_PARAM = 1<<15, -- STATION_INFO_CONNECTED_TIME = 1<<16 -+ STATION_INFO_CONNECTED_TIME = 1<<16, -+ STATION_INFO_ASSOC_REQ_IES = 1<<17 - }; - - /** -@@ -536,6 +538,11 @@ - * This number should increase every time the list of stations - * changes, i.e. when a station is added or removed, so that - * userspace can tell whether it got a consistent snapshot. -+ * @assoc_req_ies: IEs from (Re)Association Request. -+ * This is used only when in AP mode with drivers that do not use -+ * user space MLME/SME implementation. The information is provided for -+ * the cfg80211_new_sta() calls to notify user space of the IEs. -+ * @assoc_req_ies_len: Length of assoc_req_ies buffer in octets. - */ - struct station_info { - u32 filled; -@@ -558,6 +565,9 @@ - struct sta_bss_parameters bss_param; - - int generation; -+ -+ const u8 *assoc_req_ies; -+ size_t assoc_req_ies_len; - }; - - /** -diff -urN linux-3.0.42/net/wireless/nl80211.c linux-3.0.42-patch/net/wireless/nl80211.c ---- linux-3.0.42/net/wireless/nl80211.c 2012-09-05 21:03:25.528853240 +0800 -+++ linux-3.0.42-patch/net/wireless/nl80211.c 2012-09-05 20:47:08.472824000 +0800 -@@ -2213,6 +2213,10 @@ - } - nla_nest_end(msg, sinfoattr); - -+ if (sinfo->filled & STATION_INFO_ASSOC_REQ_IES) -+ NLA_PUT(msg, NL80211_ATTR_IE, sinfo->assoc_req_ies_len, -+ sinfo->assoc_req_ies); -+ - return genlmsg_end(msg, hdr); - - nla_put_failure: diff --git a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_P_9.x/Realtek_Wi-Fi_SDK_for_Android_P_9.pdf b/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_P_9.x/Realtek_Wi-Fi_SDK_for_Android_P_9.pdf deleted file mode 100644 index 01626ec2b48ed3..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_P_9.x/Realtek_Wi-Fi_SDK_for_Android_P_9.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_P_9.x/linux-3.0.42_STATION_INFO_ASSOC_REQ_IES.diff b/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_P_9.x/linux-3.0.42_STATION_INFO_ASSOC_REQ_IES.diff deleted file mode 100644 index 6298f27a611ac7..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/android/android_ref_codes_P_9.x/linux-3.0.42_STATION_INFO_ASSOC_REQ_IES.diff +++ /dev/null @@ -1,57 +0,0 @@ -diff -urN linux-3.0.42/include/net/cfg80211.h linux-3.0.42-patch/include/net/cfg80211.h ---- linux-3.0.42/include/net/cfg80211.h 2012-09-05 21:02:06.960467827 +0800 -+++ linux-3.0.42-patch/include/net/cfg80211.h 2012-09-05 21:00:09.775049000 +0800 -@@ -426,6 +426,7 @@ - * @STATION_INFO_RX_BITRATE: @rxrate fields are filled - * @STATION_INFO_BSS_PARAM: @bss_param filled - * @STATION_INFO_CONNECTED_TIME: @connected_time filled -+ * @STATION_INFO_ASSOC_REQ_IES: @assoc_req_ies filled - */ - enum station_info_flags { - STATION_INFO_INACTIVE_TIME = 1<<0, -@@ -444,7 +445,8 @@ - STATION_INFO_SIGNAL_AVG = 1<<13, - STATION_INFO_RX_BITRATE = 1<<14, - STATION_INFO_BSS_PARAM = 1<<15, -- STATION_INFO_CONNECTED_TIME = 1<<16 -+ STATION_INFO_CONNECTED_TIME = 1<<16, -+ STATION_INFO_ASSOC_REQ_IES = 1<<17 - }; - - /** -@@ -536,6 +538,11 @@ - * This number should increase every time the list of stations - * changes, i.e. when a station is added or removed, so that - * userspace can tell whether it got a consistent snapshot. -+ * @assoc_req_ies: IEs from (Re)Association Request. -+ * This is used only when in AP mode with drivers that do not use -+ * user space MLME/SME implementation. The information is provided for -+ * the cfg80211_new_sta() calls to notify user space of the IEs. -+ * @assoc_req_ies_len: Length of assoc_req_ies buffer in octets. - */ - struct station_info { - u32 filled; -@@ -558,6 +565,9 @@ - struct sta_bss_parameters bss_param; - - int generation; -+ -+ const u8 *assoc_req_ies; -+ size_t assoc_req_ies_len; - }; - - /** -diff -urN linux-3.0.42/net/wireless/nl80211.c linux-3.0.42-patch/net/wireless/nl80211.c ---- linux-3.0.42/net/wireless/nl80211.c 2012-09-05 21:03:25.528853240 +0800 -+++ linux-3.0.42-patch/net/wireless/nl80211.c 2012-09-05 20:47:08.472824000 +0800 -@@ -2213,6 +2213,10 @@ - } - nla_nest_end(msg, sinfoattr); - -+ if (sinfo->filled & STATION_INFO_ASSOC_REQ_IES) -+ NLA_PUT(msg, NL80211_ATTR_IE, sinfo->assoc_req_ies_len, -+ sinfo->assoc_req_ies); -+ - return genlmsg_end(msg, hdr); - - nla_put_failure: diff --git a/drivers/net/wireless/realtek/rtl8812au/android/wpa_supplicant_hostapd/p2p_hostapd.conf b/drivers/net/wireless/realtek/rtl8812au/android/wpa_supplicant_hostapd/p2p_hostapd.conf deleted file mode 100644 index 720e4e701c3d6d..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/android/wpa_supplicant_hostapd/p2p_hostapd.conf +++ /dev/null @@ -1,79 +0,0 @@ -##### hostapd configuration file ############################################## - -interface=wlan0 -ctrl_interface=/var/run/hostapd -ssid=DIRECT-RT -channel=6 -wpa=2 -wpa_passphrase=12345678 - - - -##### Wi-Fi Protected Setup (WPS) ############################################# - -eap_server=1 - -# WPS state -# 0 = WPS disabled (default) -# 1 = WPS enabled, not configured -# 2 = WPS enabled, configured -wps_state=2 - -uuid=12345678-9abc-def0-1234-56789abcdef0 - -# Device Name -# User-friendly description of device; up to 32 octets encoded in UTF-8 -device_name=RTL8192CU - -# Manufacturer -# The manufacturer of the device (up to 64 ASCII characters) -manufacturer=Realtek - -# Model Name -# Model of the device (up to 32 ASCII characters) -model_name=RTW_SOFTAP - -# Model Number -# Additional device description (up to 32 ASCII characters) -model_number=WLAN_CU - -# Serial Number -# Serial number of the device (up to 32 characters) -serial_number=12345 - -# Primary Device Type -# Used format: -- -# categ = Category as an integer value -# OUI = OUI and type octet as a 4-octet hex-encoded value; 0050F204 for -# default WPS OUI -# subcateg = OUI-specific Sub Category as an integer value -# Examples: -# 1-0050F204-1 (Computer / PC) -# 1-0050F204-2 (Computer / Server) -# 5-0050F204-1 (Storage / NAS) -# 6-0050F204-1 (Network Infrastructure / AP) -device_type=6-0050F204-1 - -# OS Version -# 4-octet operating system version number (hex string) -os_version=01020300 - -# Config Methods -# List of the supported configuration methods -config_methods=label display push_button keypad - - -##### default configuration ####################################### - -driver=rtl871xdrv -beacon_int=100 -hw_mode=g -ieee80211n=1 -wme_enabled=1 -ht_capab=[SHORT-GI-20][SHORT-GI-40][HT40+] -wpa_key_mgmt=WPA-PSK -wpa_pairwise=CCMP -max_num_sta=8 -wpa_group_rekey=86400 -supported_rates=60 90 120 180 240 360 480 540 -basic_rates=60 120 240 diff --git a/drivers/net/wireless/realtek/rtl8812au/android/wpa_supplicant_hostapd/rtl_hostapd_2G.conf b/drivers/net/wireless/realtek/rtl8812au/android/wpa_supplicant_hostapd/rtl_hostapd_2G.conf deleted file mode 100644 index 0f703e5c280e76..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/android/wpa_supplicant_hostapd/rtl_hostapd_2G.conf +++ /dev/null @@ -1,79 +0,0 @@ -##### hostapd configuration file ############################################## - -interface=wlan0 -ctrl_interface=/var/run/hostapd -ssid=rtwap -channel=6 -wpa=2 -wpa_passphrase=87654321 -#bridge=br0 - - - -##### Wi-Fi Protected Setup (WPS) ############################################# - -eap_server=1 - -# WPS state -# 0 = WPS disabled (default) -# 1 = WPS enabled, not configured -# 2 = WPS enabled, configured -wps_state=2 - -uuid=12345678-9abc-def0-1234-56789abcdef0 - -# Device Name -# User-friendly description of device; up to 32 octets encoded in UTF-8 -device_name=RTL8192CU - -# Manufacturer -# The manufacturer of the device (up to 64 ASCII characters) -manufacturer=Realtek - -# Model Name -# Model of the device (up to 32 ASCII characters) -model_name=RTW_SOFTAP - -# Model Number -# Additional device description (up to 32 ASCII characters) -model_number=WLAN_CU - -# Serial Number -# Serial number of the device (up to 32 characters) -serial_number=12345 - -# Primary Device Type -# Used format: -- -# categ = Category as an integer value -# OUI = OUI and type octet as a 4-octet hex-encoded value; 0050F204 for -# default WPS OUI -# subcateg = OUI-specific Sub Category as an integer value -# Examples: -# 1-0050F204-1 (Computer / PC) -# 1-0050F204-2 (Computer / Server) -# 5-0050F204-1 (Storage / NAS) -# 6-0050F204-1 (Network Infrastructure / AP) -device_type=6-0050F204-1 - -# OS Version -# 4-octet operating system version number (hex string) -os_version=01020300 - -# Config Methods -# List of the supported configuration methods -config_methods=label display push_button keypad - - -##### default configuration ####################################### - -driver=rtl871xdrv -beacon_int=100 -hw_mode=g -ieee80211n=1 -wme_enabled=1 -ht_capab=[SHORT-GI-20][SHORT-GI-40][HT40+] -wpa_key_mgmt=WPA-PSK -wpa_pairwise=CCMP -max_num_sta=8 -wpa_group_rekey=86400 - diff --git a/drivers/net/wireless/realtek/rtl8812au/android/wpa_supplicant_hostapd/rtl_hostapd_5G.conf b/drivers/net/wireless/realtek/rtl8812au/android/wpa_supplicant_hostapd/rtl_hostapd_5G.conf deleted file mode 100644 index 78d7388b7690ca..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/android/wpa_supplicant_hostapd/rtl_hostapd_5G.conf +++ /dev/null @@ -1,78 +0,0 @@ -##### hostapd configuration file ############################################## - -interface=wlan0 -ctrl_interface=/var/run/hostapd -ssid=rtwap -channel=36 -wpa=2 -wpa_passphrase=87654321 -#bridge=br0 - - -##### Wi-Fi Protected Setup (WPS) ############################################# - -eap_server=1 - -# WPS state -# 0 = WPS disabled (default) -# 1 = WPS enabled, not configured -# 2 = WPS enabled, configured -wps_state=2 - -uuid=12345678-9abc-def0-1234-56789abcdef0 - -# Device Name -# User-friendly description of device; up to 32 octets encoded in UTF-8 -device_name=RTL8192CU - -# Manufacturer -# The manufacturer of the device (up to 64 ASCII characters) -manufacturer=Realtek - -# Model Name -# Model of the device (up to 32 ASCII characters) -model_name=RTW_SOFTAP - -# Model Number -# Additional device description (up to 32 ASCII characters) -model_number=WLAN_CU - -# Serial Number -# Serial number of the device (up to 32 characters) -serial_number=12345 - -# Primary Device Type -# Used format: -- -# categ = Category as an integer value -# OUI = OUI and type octet as a 4-octet hex-encoded value; 0050F204 for -# default WPS OUI -# subcateg = OUI-specific Sub Category as an integer value -# Examples: -# 1-0050F204-1 (Computer / PC) -# 1-0050F204-2 (Computer / Server) -# 5-0050F204-1 (Storage / NAS) -# 6-0050F204-1 (Network Infrastructure / AP) -device_type=6-0050F204-1 - -# OS Version -# 4-octet operating system version number (hex string) -os_version=01020300 - -# Config Methods -# List of the supported configuration methods -config_methods=label display push_button keypad - - -##### default configuration ####################################### - -driver=rtl871xdrv -beacon_int=100 -hw_mode=a -ieee80211n=1 -wme_enabled=1 -ht_capab=[SHORT-GI-20][SHORT-GI-40][HT40+] -wpa_key_mgmt=WPA-PSK -wpa_pairwise=CCMP -max_num_sta=8 -wpa_group_rekey=86400 - diff --git a/drivers/net/wireless/realtek/rtl8812au/android/wpa_supplicant_hostapd/wpa_0_8.conf b/drivers/net/wireless/realtek/rtl8812au/android/wpa_supplicant_hostapd/wpa_0_8.conf deleted file mode 100644 index eb87058f5a1239..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/android/wpa_supplicant_hostapd/wpa_0_8.conf +++ /dev/null @@ -1,51 +0,0 @@ -ctrl_interface=/var/run/wpa_supplicant -update_config=1 - -# Wi-Fi Protected Setup (WPS) parameters - -# Device Name -# User-friendly description of device; up to 32 octets encoded in UTF-8 -device_name=RTL8192CU - -# Manufacturer -# The manufacturer of the device (up to 64 ASCII characters) -manufacturer=Realtek - -# Model Name -# Model of the device (up to 32 ASCII characters) -model_name=RTW_STA - -# Model Number -# Additional device description (up to 32 ASCII characters) -model_number=WLAN_CU - -# Serial Number -# Serial number of the device (up to 32 characters) -serial_number=12345 - -# Primary Device Type -# Used format: -- -# categ = Category as an integer value -# OUI = OUI and type octet as a 4-octet hex-encoded value; 0050F204 for -# default WPS OUI -# subcateg = OUI-specific Sub Category as an integer value -# Examples: -# 1-0050F204-1 (Computer / PC) -# 1-0050F204-2 (Computer / Server) -# 5-0050F204-1 (Storage / NAS) -# 6-0050F204-1 (Network Infrastructure / AP) -device_type=1-0050F204-1 - -# OS Version -# 4-octet operating system version number (hex string) -os_version=01020300 - -# Config Methods -# List of the supported configuration methods -# Available methods: usba ethernet label display ext_nfc_token int_nfc_token -# nfc_interface push_button keypad virtual_display physical_display -# virtual_push_button physical_push_button -# For WSC 1.0: -#config_methods=display push_button keypad -# For WSC 2.0: -config_methods=virtual_display virtual_push_button keypad diff --git a/drivers/net/wireless/realtek/rtl8812au/core/rtw_chplan.c b/drivers/net/wireless/realtek/rtl8812au/core/rtw_chplan.c deleted file mode 100644 index 34263a5fd1b4b4..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/core/rtw_chplan.c +++ /dev/null @@ -1,1193 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2018 Realtek Corporation. - * - * 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 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 _RTW_CHPLAN_C_ - -#include - -#define RTW_DOMAIN_MAP_VER "37e" -#define RTW_COUNTRY_MAP_VER "22" - -#ifdef LEGACY_CHANNEL_PLAN_REF -/******************************************************** -ChannelPlan definitions -*********************************************************/ -static RT_CHANNEL_PLAN legacy_channel_plan[] = { - /* 0x00, RTW_CHPLAN_FCC */ {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 132, 136, 140, 149, 153, 157, 161, 165}, 32}, - /* 0x01, RTW_CHPLAN_IC */ {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 136, 140, 149, 153, 157, 161, 165}, 31}, - /* 0x02, RTW_CHPLAN_ETSI */ {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140}, 32}, - /* 0x03, RTW_CHPLAN_SPAIN */ {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, 13}, - /* 0x04, RTW_CHPLAN_FRANCE */ {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, 13}, - /* 0x05, RTW_CHPLAN_MKK */ {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, 13}, - /* 0x06, RTW_CHPLAN_MKK1 */ {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, 13}, - /* 0x07, RTW_CHPLAN_ISRAEL */ {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 36, 40, 44, 48, 52, 56, 60, 64}, 21}, - /* 0x08, RTW_CHPLAN_TELEC */ {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 36, 40, 44, 48, 52, 56, 60, 64}, 22}, - /* 0x09, RTW_CHPLAN_GLOBAL_DOAMIN */ {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}, 14}, - /* 0x0A, RTW_CHPLAN_WORLD_WIDE_13 */ {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, 13}, - /* 0x0B, RTW_CHPLAN_TAIWAN */ {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 56, 60, 64, 100, 104, 108, 112, 116, 136, 140, 149, 153, 157, 161, 165}, 26}, - /* 0x0C, RTW_CHPLAN_CHINA */ {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 149, 153, 157, 161, 165}, 18}, - /* 0x0D, RTW_CHPLAN_SINGAPORE_INDIA_MEXICO */ {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 36, 40, 44, 48, 52, 56, 60, 64, 149, 153, 157, 161, 165}, 24}, - /* 0x0E, RTW_CHPLAN_KOREA */ {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 149, 153, 157, 161, 165}, 31}, - /* 0x0F, RTW_CHPLAN_TURKEY */ {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 36, 40, 44, 48, 52, 56, 60, 64}, 19}, - /* 0x10, RTW_CHPLAN_JAPAN */ {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140}, 32}, - /* 0x11, RTW_CHPLAN_FCC_NO_DFS */ {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 36, 40, 44, 48, 149, 153, 157, 161, 165}, 20}, - /* 0x12, RTW_CHPLAN_JAPAN_NO_DFS */ {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 36, 40, 44, 48}, 17}, - /* 0x13, RTW_CHPLAN_WORLD_WIDE_5G */ {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165}, 37}, - /* 0x14, RTW_CHPLAN_TAIWAN_NO_DFS */ {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 56, 60, 64, 149, 153, 157, 161, 165}, 19}, -}; -#endif - -enum rtw_rd_2g { - RTW_RD_2G_NULL = 0, - RTW_RD_2G_WORLD = 1, /* Worldwird 13 */ - RTW_RD_2G_ETSI1 = 2, /* Europe */ - RTW_RD_2G_FCC1 = 3, /* US */ - RTW_RD_2G_MKK1 = 4, /* Japan */ - RTW_RD_2G_ETSI2 = 5, /* France */ - RTW_RD_2G_GLOBAL = 6, /* Global domain */ - RTW_RD_2G_MKK2 = 7, /* Japan */ - RTW_RD_2G_FCC2 = 8, /* US */ - RTW_RD_2G_IC1 = 9, /* Canada */ - RTW_RD_2G_WORLD1 = 10, /* Worldwide 11 */ - RTW_RD_2G_KCC1 = 11, /* Korea */ - RTW_RD_2G_IC2 = 12, /* Canada */ - - RTW_RD_2G_MAX, -}; - -enum rtw_rd_5g { - RTW_RD_5G_NULL = 0, /* */ - RTW_RD_5G_ETSI1 = 1, /* Europe */ - RTW_RD_5G_ETSI2 = 2, /* Australia, New Zealand */ - RTW_RD_5G_ETSI3 = 3, /* Russia */ - RTW_RD_5G_FCC1 = 4, /* US */ - RTW_RD_5G_FCC2 = 5, /* FCC w/o DFS Channels */ - RTW_RD_5G_FCC3 = 6, /* Bolivia, Chile, El Salvador, Venezuela */ - RTW_RD_5G_FCC4 = 7, /* Venezuela */ - RTW_RD_5G_FCC5 = 8, /* China */ - RTW_RD_5G_FCC6 = 9, /* */ - RTW_RD_5G_FCC7 = 10, /* US(w/o Weather radar) */ - RTW_RD_5G_IC1 = 11, /* Canada(w/o Weather radar) */ - RTW_RD_5G_KCC1 = 12, /* Korea */ - RTW_RD_5G_MKK1 = 13, /* Japan */ - RTW_RD_5G_MKK2 = 14, /* Japan (W52, W53) */ - RTW_RD_5G_MKK3 = 15, /* Japan (W56) */ - RTW_RD_5G_NCC1 = 16, /* Taiwan, (w/o Weather radar) */ - RTW_RD_5G_NCC2 = 17, /* Taiwan, Band2, Band4 */ - RTW_RD_5G_NCC3 = 18, /* Taiwan w/o DFS, Band4 only */ - RTW_RD_5G_ETSI4 = 19, /* Europe w/o DFS, Band1 only */ - RTW_RD_5G_ETSI5 = 20, /* Australia, New Zealand(w/o Weather radar) */ - RTW_RD_5G_FCC8 = 21, /* Latin America */ - RTW_RD_5G_ETSI6 = 22, /* Israel, Bahrain, Egypt, India, China, Malaysia */ - RTW_RD_5G_ETSI7 = 23, /* China */ - RTW_RD_5G_ETSI8 = 24, /* Jordan */ - RTW_RD_5G_ETSI9 = 25, /* Lebanon */ - RTW_RD_5G_ETSI10 = 26, /* Qatar */ - RTW_RD_5G_ETSI11 = 27, /* Russia */ - RTW_RD_5G_NCC4 = 28, /* Taiwan, (w/o Weather radar) */ - RTW_RD_5G_ETSI12 = 29, /* Indonesia */ - RTW_RD_5G_FCC9 = 30, /* (w/o Weather radar) */ - RTW_RD_5G_ETSI13 = 31, /* (w/o Weather radar) */ - RTW_RD_5G_FCC10 = 32, /* Argentina(w/o Weather radar) */ - RTW_RD_5G_MKK4 = 33, /* Japan (W52) */ - RTW_RD_5G_ETSI14 = 34, /* Russia */ - RTW_RD_5G_FCC11 = 35, /* US(include CH144) */ - RTW_RD_5G_ETSI15 = 36, /* Malaysia */ - RTW_RD_5G_MKK5 = 37, /* Japan */ - RTW_RD_5G_ETSI16 = 38, /* Europe */ - RTW_RD_5G_ETSI17 = 39, /* Europe */ - RTW_RD_5G_FCC12 = 40, /* FCC */ - RTW_RD_5G_FCC13 = 41, /* FCC */ - RTW_RD_5G_FCC14 = 42, /* FCC w/o Weather radar(w/o 5600~5650MHz) */ - RTW_RD_5G_FCC15 = 43, /* FCC w/o Band3 */ - RTW_RD_5G_FCC16 = 44, /* FCC w/o Band3 */ - RTW_RD_5G_ETSI18 = 45, /* ETSI w/o DFS Band2&3 */ - RTW_RD_5G_ETSI19 = 46, /* Europe */ - RTW_RD_5G_FCC17 = 47, /* FCC w/o Weather radar(w/o 5600~5650MHz) */ - RTW_RD_5G_ETSI20 = 48, /* Europe */ - RTW_RD_5G_IC2 = 49, /* Canada(w/o Weather radar), include ch144 */ - RTW_RD_5G_ETSI21 = 50, /* Australia, New Zealand(w/o Weather radar) */ - RTW_RD_5G_FCC18 = 51, /* */ - RTW_RD_5G_WORLD = 52, /* Worldwide */ - RTW_RD_5G_CHILE1 = 53, /* Chile */ - RTW_RD_5G_ACMA1 = 54, /* Australia, New Zealand (w/o Weather radar) (w/o Ch120~Ch128) */ - RTW_RD_5G_WORLD1 = 55, /* 5G Worldwide Band1&2 */ - RTW_RD_5G_CHILE2 = 56, /* Chile (Band2,Band3) */ - RTW_RD_5G_KCC2 = 57, /* Korea (New standard) */ - - /* === Below are driver defined for legacy channel plan compatible, DON'T assign index ==== */ - RTW_RD_5G_OLD_FCC1, - RTW_RD_5G_OLD_NCC1, - RTW_RD_5G_OLD_KCC1, - - RTW_RD_5G_MAX, -}; - -struct ch_list_t { - u8 *len_ch; -}; - -#define CH_LIST_ENT(_len, arg...) \ - {.len_ch = (u8[_len + 1]) {_len, ##arg}, } - -#define CH_LIST_LEN(_ch_list) (_ch_list.len_ch[0]) -#define CH_LIST_CH(_ch_list, _i) (_ch_list.len_ch[_i + 1]) - -struct chplan_ent_t { - u8 rd_2g; -#ifdef CONFIG_IEEE80211_BAND_5GHZ - u8 rd_5g; -#endif - u8 regd; /* value of REGULATION_TXPWR_LMT */ -}; - -#ifdef CONFIG_IEEE80211_BAND_5GHZ -#define CHPLAN_ENT(i2g, i5g, regd) {i2g, i5g, regd} -#else -#define CHPLAN_ENT(i2g, i5g, regd) {i2g, regd} -#endif - -static struct ch_list_t RTW_ChannelPlan2G[] = { - /* 0, RTW_RD_2G_NULL */ CH_LIST_ENT(0), - /* 1, RTW_RD_2G_WORLD */ CH_LIST_ENT(13, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13), - /* 2, RTW_RD_2G_ETSI1 */ CH_LIST_ENT(13, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13), - /* 3, RTW_RD_2G_FCC1 */ CH_LIST_ENT(11, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11), - /* 4, RTW_RD_2G_MKK1 */ CH_LIST_ENT(14, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14), - /* 5, RTW_RD_2G_ETSI2 */ CH_LIST_ENT(4, 10, 11, 12, 13), - /* 6, RTW_RD_2G_GLOBAL */ CH_LIST_ENT(14, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14), - /* 7, RTW_RD_2G_MKK2 */ CH_LIST_ENT(13, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13), - /* 8, RTW_RD_2G_FCC2 */ CH_LIST_ENT(13, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13), - /* 9, RTW_RD_2G_IC1 */ CH_LIST_ENT(13, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13), - /* 10, RTW_RD_2G_WORLD1 */ CH_LIST_ENT(11, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11), - /* 11, RTW_RD_2G_KCC1 */ CH_LIST_ENT(13, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13), - /* 12, RTW_RD_2G_IC2 */ CH_LIST_ENT(11, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11), -}; - -#ifdef CONFIG_IEEE80211_BAND_5GHZ -static struct ch_list_t RTW_ChannelPlan5G[] = { - /* 0, RTW_RD_5G_NULL */ CH_LIST_ENT(0), - /* 1, RTW_RD_5G_ETSI1 */ CH_LIST_ENT(19, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140), - /* 2, RTW_RD_5G_ETSI2 */ CH_LIST_ENT(24, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165), - /* 3, RTW_RD_5G_ETSI3 */ CH_LIST_ENT(22, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 149, 153, 157, 161, 165), - /* 4, RTW_RD_5G_FCC1 */ CH_LIST_ENT(24, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165), - /* 5, RTW_RD_5G_FCC2 */ CH_LIST_ENT(9, 36, 40, 44, 48, 149, 153, 157, 161, 165), - /* 6, RTW_RD_5G_FCC3 */ CH_LIST_ENT(13, 36, 40, 44, 48, 52, 56, 60, 64, 149, 153, 157, 161, 165), - /* 7, RTW_RD_5G_FCC4 */ CH_LIST_ENT(12, 36, 40, 44, 48, 52, 56, 60, 64, 149, 153, 157, 161), - /* 8, RTW_RD_5G_FCC5 */ CH_LIST_ENT(5, 149, 153, 157, 161, 165), - /* 9, RTW_RD_5G_FCC6 */ CH_LIST_ENT(8, 36, 40, 44, 48, 52, 56, 60, 64), - /* 10, RTW_RD_5G_FCC7 */ CH_LIST_ENT(21, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 132, 136, 140, 149, 153, 157, 161, 165), - /* 11, RTW_RD_5G_IC1 */ CH_LIST_ENT(21, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 132, 136, 140, 149, 153, 157, 161, 165), - /* 12, RTW_RD_5G_KCC1 */ CH_LIST_ENT(19, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 149, 153, 157, 161), - /* 13, RTW_RD_5G_MKK1 */ CH_LIST_ENT(19, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140), - /* 14, RTW_RD_5G_MKK2 */ CH_LIST_ENT(8, 36, 40, 44, 48, 52, 56, 60, 64), - /* 15, RTW_RD_5G_MKK3 */ CH_LIST_ENT(11, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140), - /* 16, RTW_RD_5G_NCC1 */ CH_LIST_ENT(16, 56, 60, 64, 100, 104, 108, 112, 116, 132, 136, 140, 149, 153, 157, 161, 165), - /* 17, RTW_RD_5G_NCC2 */ CH_LIST_ENT(8, 56, 60, 64, 149, 153, 157, 161, 165), - /* 18, RTW_RD_5G_NCC3 */ CH_LIST_ENT(5, 149, 153, 157, 161, 165), - /* 19, RTW_RD_5G_ETSI4 */ CH_LIST_ENT(4, 36, 40, 44, 48), - /* 20, RTW_RD_5G_ETSI5 */ CH_LIST_ENT(21, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 132, 136, 140, 149, 153, 157, 161, 165), - /* 21, RTW_RD_5G_FCC8 */ CH_LIST_ENT(4, 149, 153, 157, 161), - /* 22, RTW_RD_5G_ETSI6 */ CH_LIST_ENT(8, 36, 40, 44, 48, 52, 56, 60, 64), - /* 23, RTW_RD_5G_ETSI7 */ CH_LIST_ENT(13, 36, 40, 44, 48, 52, 56, 60, 64, 149, 153, 157, 161, 165), - /* 24, RTW_RD_5G_ETSI8 */ CH_LIST_ENT(9, 36, 40, 44, 48, 149, 153, 157, 161, 165), - /* 25, RTW_RD_5G_ETSI9 */ CH_LIST_ENT(11, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140), - /* 26, RTW_RD_5G_ETSI10 */ CH_LIST_ENT(5, 149, 153, 157, 161, 165), - /* 27, RTW_RD_5G_ETSI11 */ CH_LIST_ENT(16, 36, 40, 44, 48, 52, 56, 60, 64, 132, 136, 140, 149, 153, 157, 161, 165), - /* 28, RTW_RD_5G_NCC4 */ CH_LIST_ENT(17, 52, 56, 60, 64, 100, 104, 108, 112, 116, 132, 136, 140, 149, 153, 157, 161, 165), - /* 29, RTW_RD_5G_ETSI12 */ CH_LIST_ENT(4, 149, 153, 157, 161), - /* 30, RTW_RD_5G_FCC9 */ CH_LIST_ENT(21, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 132, 136, 140, 149, 153, 157, 161, 165), - /* 31, RTW_RD_5G_ETSI13 */ CH_LIST_ENT(16, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 132, 136, 140), - /* 32, RTW_RD_5G_FCC10 */ CH_LIST_ENT(20, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 132, 136, 140, 149, 153, 157, 161), - /* 33, RTW_RD_5G_MKK4 */ CH_LIST_ENT(4, 36, 40, 44, 48), - /* 34, RTW_RD_5G_ETSI14 */ CH_LIST_ENT(11, 36, 40, 44, 48, 52, 56, 60, 64, 132, 136, 140), - /* 35, RTW_RD_5G_FCC11 */ CH_LIST_ENT(25, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144, 149, 153, 157, 161, 165), - /* 36, RTW_RD_5G_ETSI15 */ CH_LIST_ENT(21, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 149, 153, 157, 161, 165), - /* 37, RTW_RD_5G_MKK5 */ CH_LIST_ENT(24, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165), - /* 38, RTW_RD_5G_ETSI16 */ CH_LIST_ENT(24, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165), - /* 39, RTW_RD_5G_ETSI17 */ CH_LIST_ENT(24, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165), - /* 40, RTW_RD_5G_FCC12*/ CH_LIST_ENT(24, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165), - /* 41, RTW_RD_5G_FCC13 */ CH_LIST_ENT(24, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165), - /* 42, RTW_RD_5G_FCC14 */ CH_LIST_ENT(21, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 132, 136, 140, 149, 153, 157, 161, 165), - /* 43, RTW_RD_5G_FCC15 */ CH_LIST_ENT(13, 36, 40, 44, 48, 52, 56, 60, 64, 149, 153, 157, 161, 165), - /* 44, RTW_RD_5G_FCC16 */ CH_LIST_ENT(13, 36, 40, 44, 48, 52, 56, 60, 64, 149, 153, 157, 161, 165), - /* 45, RTW_RD_5G_ETSI18 */ CH_LIST_ENT(9, 36, 40, 44, 48, 149, 153, 157, 161, 165), - /* 46, RTW_RD_5G_ETSI19 */ CH_LIST_ENT(24, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165), - /* 47, RTW_RD_5G_FCC17 */ CH_LIST_ENT(16, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 132, 136, 140), - /* 48, RTW_RD_5G_ETSI20 */ CH_LIST_ENT(9, 52, 56, 60, 64, 149, 153, 157, 161, 165), - /* 49, RTW_RD_5G_IC2 */ CH_LIST_ENT(22, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 132, 136, 140, 144, 149, 153, 157, 161, 165), - /* 50, RTW_RD_5G_ETSI21 */ CH_LIST_ENT(13, 100, 104, 108, 112, 116, 132, 136, 140, 149, 153, 157, 161, 165), - /* 51, RTW_RD_5G_FCC18 */ CH_LIST_ENT(8, 100, 104, 108, 112, 116, 132, 136, 140), - /* 52, RTW_RD_5G_WORLD */ CH_LIST_ENT(25, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144, 149, 153, 157, 161, 165), - /* 53, RTW_RD_5G_CHILE1 */ CH_LIST_ENT(25, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144, 149, 153, 157, 161, 165), - /* 54, RTW_RD_5G_ACMA1 */ CH_LIST_ENT(21, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 132, 136, 140, 149, 153, 157, 161, 165), - /* 55, RTW_RD_5G_WORLD1 */ CH_LIST_ENT(8, 36, 40, 44, 48, 52, 56, 60, 64), - /* 56, RTW_RD_5G_CHILE2 */ CH_LIST_ENT(16, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144), - /* 57, RTW_RD_5G_KCC2 */ CH_LIST_ENT(24, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165), - - /* === Below are driver defined for legacy channel plan compatible, NO static index assigned ==== */ - /* RTW_RD_5G_OLD_FCC1 */ CH_LIST_ENT(20, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 136, 140, 149, 153, 157, 161, 165), - /* RTW_RD_5G_OLD_NCC1 */ CH_LIST_ENT(15, 56, 60, 64, 100, 104, 108, 112, 116, 136, 140, 149, 153, 157, 161, 165), - /* RTW_RD_5G_OLD_KCC1 */ CH_LIST_ENT(20, 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 149, 153, 157, 161, 165), -}; -#endif /* CONFIG_IEEE80211_BAND_5GHZ */ - -static struct chplan_ent_t RTW_ChannelPlanMap[RTW_CHPLAN_MAX] = { - /* ===== 0x00 ~ 0x1F, legacy channel plan ===== */ - CHPLAN_ENT(RTW_RD_2G_FCC1, RTW_RD_5G_KCC1, TXPWR_LMT_FCC), /* 0x00, RTW_CHPLAN_FCC */ - CHPLAN_ENT(RTW_RD_2G_FCC1, RTW_RD_5G_OLD_FCC1, TXPWR_LMT_FCC), /* 0x01, RTW_CHPLAN_IC */ - CHPLAN_ENT(RTW_RD_2G_ETSI1, RTW_RD_5G_ETSI1, TXPWR_LMT_ETSI), /* 0x02, RTW_CHPLAN_ETSI */ - CHPLAN_ENT(RTW_RD_2G_ETSI1, RTW_RD_5G_NULL, TXPWR_LMT_ETSI), /* 0x03, RTW_CHPLAN_SPAIN */ - CHPLAN_ENT(RTW_RD_2G_ETSI1, RTW_RD_5G_NULL, TXPWR_LMT_ETSI), /* 0x04, RTW_CHPLAN_FRANCE */ - CHPLAN_ENT(RTW_RD_2G_MKK1, RTW_RD_5G_NULL, TXPWR_LMT_MKK), /* 0x05, RTW_CHPLAN_MKK */ - CHPLAN_ENT(RTW_RD_2G_MKK1, RTW_RD_5G_NULL, TXPWR_LMT_MKK), /* 0x06, RTW_CHPLAN_MKK1 */ - CHPLAN_ENT(RTW_RD_2G_ETSI1, RTW_RD_5G_FCC6, TXPWR_LMT_ETSI), /* 0x07, RTW_CHPLAN_ISRAEL */ - CHPLAN_ENT(RTW_RD_2G_MKK1, RTW_RD_5G_FCC6, TXPWR_LMT_MKK), /* 0x08, RTW_CHPLAN_TELEC */ - CHPLAN_ENT(RTW_RD_2G_MKK1, RTW_RD_5G_NULL, TXPWR_LMT_WW), /* 0x09, RTW_CHPLAN_GLOBAL_DOAMIN */ - CHPLAN_ENT(RTW_RD_2G_WORLD, RTW_RD_5G_NULL, TXPWR_LMT_WW), /* 0x0A, RTW_CHPLAN_WORLD_WIDE_13 */ - CHPLAN_ENT(RTW_RD_2G_FCC1, RTW_RD_5G_OLD_NCC1, TXPWR_LMT_FCC), /* 0x0B, RTW_CHPLAN_TAIWAN */ - CHPLAN_ENT(RTW_RD_2G_ETSI1, RTW_RD_5G_FCC5, TXPWR_LMT_ETSI), /* 0x0C, RTW_CHPLAN_CHINA */ - CHPLAN_ENT(RTW_RD_2G_FCC1, RTW_RD_5G_FCC3, TXPWR_LMT_WW), /* 0x0D, RTW_CHPLAN_SINGAPORE_INDIA_MEXICO */ /* ETSI:Singapore, India. FCC:Mexico => WW */ - CHPLAN_ENT(RTW_RD_2G_FCC1, RTW_RD_5G_OLD_KCC1, TXPWR_LMT_ETSI), /* 0x0E, RTW_CHPLAN_KOREA */ - CHPLAN_ENT(RTW_RD_2G_FCC1, RTW_RD_5G_FCC6, TXPWR_LMT_ETSI), /* 0x0F, RTW_CHPLAN_TURKEY */ - CHPLAN_ENT(RTW_RD_2G_ETSI1, RTW_RD_5G_ETSI1, TXPWR_LMT_MKK), /* 0x10, RTW_CHPLAN_JAPAN */ - CHPLAN_ENT(RTW_RD_2G_FCC1, RTW_RD_5G_FCC2, TXPWR_LMT_FCC), /* 0x11, RTW_CHPLAN_FCC_NO_DFS */ - CHPLAN_ENT(RTW_RD_2G_ETSI1, RTW_RD_5G_FCC7, TXPWR_LMT_MKK), /* 0x12, RTW_CHPLAN_JAPAN_NO_DFS */ - CHPLAN_ENT(RTW_RD_2G_WORLD, RTW_RD_5G_FCC1, TXPWR_LMT_WW), /* 0x13, RTW_CHPLAN_WORLD_WIDE_5G */ - CHPLAN_ENT(RTW_RD_2G_FCC1, RTW_RD_5G_NCC2, TXPWR_LMT_FCC), /* 0x14, RTW_CHPLAN_TAIWAN_NO_DFS */ - CHPLAN_ENT(RTW_RD_2G_WORLD, RTW_RD_5G_FCC7, TXPWR_LMT_ETSI), /* 0x15, RTW_CHPLAN_ETSI_NO_DFS */ - CHPLAN_ENT(RTW_RD_2G_WORLD, RTW_RD_5G_NCC1, TXPWR_LMT_ETSI), /* 0x16, RTW_CHPLAN_KOREA_NO_DFS */ - CHPLAN_ENT(RTW_RD_2G_MKK1, RTW_RD_5G_FCC7, TXPWR_LMT_MKK), /* 0x17, RTW_CHPLAN_JAPAN_NO_DFS */ - CHPLAN_ENT(RTW_RD_2G_NULL, RTW_RD_5G_FCC5, TXPWR_LMT_ETSI), /* 0x18, RTW_CHPLAN_PAKISTAN_NO_DFS */ - CHPLAN_ENT(RTW_RD_2G_FCC1, RTW_RD_5G_FCC5, TXPWR_LMT_FCC), /* 0x19, RTW_CHPLAN_TAIWAN2_NO_DFS */ - CHPLAN_ENT(RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW), /* 0x1A, */ - CHPLAN_ENT(RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW), /* 0x1B, */ - CHPLAN_ENT(RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW), /* 0x1C, */ - CHPLAN_ENT(RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW), /* 0x1D, */ - CHPLAN_ENT(RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW), /* 0x1E, */ - CHPLAN_ENT(RTW_RD_2G_NULL, RTW_RD_5G_FCC1, TXPWR_LMT_WW), /* 0x1F, RTW_CHPLAN_WORLD_WIDE_ONLY_5G */ - - /* ===== 0x20 ~ 0x7F, new channel plan ===== */ - CHPLAN_ENT(RTW_RD_2G_WORLD, RTW_RD_5G_NULL, TXPWR_LMT_WW), /* 0x20, RTW_CHPLAN_WORLD_NULL */ - CHPLAN_ENT(RTW_RD_2G_ETSI1, RTW_RD_5G_NULL, TXPWR_LMT_ETSI), /* 0x21, RTW_CHPLAN_ETSI1_NULL */ - CHPLAN_ENT(RTW_RD_2G_FCC1, RTW_RD_5G_NULL, TXPWR_LMT_FCC), /* 0x22, RTW_CHPLAN_FCC1_NULL */ - CHPLAN_ENT(RTW_RD_2G_MKK1, RTW_RD_5G_NULL, TXPWR_LMT_MKK), /* 0x23, RTW_CHPLAN_MKK1_NULL */ - CHPLAN_ENT(RTW_RD_2G_ETSI2, RTW_RD_5G_NULL, TXPWR_LMT_ETSI), /* 0x24, RTW_CHPLAN_ETSI2_NULL */ - CHPLAN_ENT(RTW_RD_2G_FCC1, RTW_RD_5G_FCC1, TXPWR_LMT_FCC), /* 0x25, RTW_CHPLAN_FCC1_FCC1 */ - CHPLAN_ENT(RTW_RD_2G_WORLD, RTW_RD_5G_ETSI1, TXPWR_LMT_ETSI), /* 0x26, RTW_CHPLAN_WORLD_ETSI1 */ - CHPLAN_ENT(RTW_RD_2G_MKK1, RTW_RD_5G_MKK1, TXPWR_LMT_MKK), /* 0x27, RTW_CHPLAN_MKK1_MKK1 */ - CHPLAN_ENT(RTW_RD_2G_WORLD, RTW_RD_5G_KCC1, TXPWR_LMT_KCC), /* 0x28, RTW_CHPLAN_WORLD_KCC1 */ - CHPLAN_ENT(RTW_RD_2G_WORLD, RTW_RD_5G_FCC2, TXPWR_LMT_FCC), /* 0x29, RTW_CHPLAN_WORLD_FCC2 */ - CHPLAN_ENT(RTW_RD_2G_FCC2, RTW_RD_5G_NULL, TXPWR_LMT_FCC), /* 0x2A, RTW_CHPLAN_FCC2_NULL */ - CHPLAN_ENT(RTW_RD_2G_IC1, RTW_RD_5G_IC2, TXPWR_LMT_IC), /* 0x2B, RTW_CHPLAN_IC1_IC2 */ - CHPLAN_ENT(RTW_RD_2G_MKK2, RTW_RD_5G_NULL, TXPWR_LMT_MKK), /* 0x2C, RTW_CHPLAN_MKK2_NULL */ - CHPLAN_ENT(RTW_RD_2G_WORLD, RTW_RD_5G_CHILE1, TXPWR_LMT_CHILE), /* 0x2D, RTW_CHPLAN_WORLD_CHILE1 */ - CHPLAN_ENT(RTW_RD_2G_WORLD1, RTW_RD_5G_WORLD1, TXPWR_LMT_WW), /* 0x2E, RTW_CHPLAN_WORLD1_WORLD1 */ - CHPLAN_ENT(RTW_RD_2G_WORLD, RTW_RD_5G_CHILE2, TXPWR_LMT_CHILE), /* 0x2F, RTW_CHPLAN_WORLD_CHILE2 */ - CHPLAN_ENT(RTW_RD_2G_WORLD, RTW_RD_5G_FCC3, TXPWR_LMT_FCC), /* 0x30, RTW_CHPLAN_WORLD_FCC3 */ - CHPLAN_ENT(RTW_RD_2G_WORLD, RTW_RD_5G_FCC4, TXPWR_LMT_FCC), /* 0x31, RTW_CHPLAN_WORLD_FCC4 */ - CHPLAN_ENT(RTW_RD_2G_WORLD, RTW_RD_5G_FCC5, TXPWR_LMT_FCC), /* 0x32, RTW_CHPLAN_WORLD_FCC5 */ - CHPLAN_ENT(RTW_RD_2G_WORLD, RTW_RD_5G_FCC6, TXPWR_LMT_FCC), /* 0x33, RTW_CHPLAN_WORLD_FCC6 */ - CHPLAN_ENT(RTW_RD_2G_FCC1, RTW_RD_5G_FCC7, TXPWR_LMT_FCC), /* 0x34, RTW_CHPLAN_FCC1_FCC7 */ - CHPLAN_ENT(RTW_RD_2G_WORLD, RTW_RD_5G_ETSI2, TXPWR_LMT_ETSI), /* 0x35, RTW_CHPLAN_WORLD_ETSI2 */ - CHPLAN_ENT(RTW_RD_2G_WORLD, RTW_RD_5G_ETSI3, TXPWR_LMT_ETSI), /* 0x36, RTW_CHPLAN_WORLD_ETSI3 */ - CHPLAN_ENT(RTW_RD_2G_MKK1, RTW_RD_5G_MKK2, TXPWR_LMT_MKK), /* 0x37, RTW_CHPLAN_MKK1_MKK2 */ - CHPLAN_ENT(RTW_RD_2G_MKK1, RTW_RD_5G_MKK3, TXPWR_LMT_MKK), /* 0x38, RTW_CHPLAN_MKK1_MKK3 */ - CHPLAN_ENT(RTW_RD_2G_FCC1, RTW_RD_5G_NCC1, TXPWR_LMT_FCC), /* 0x39, RTW_CHPLAN_FCC1_NCC1 */ - CHPLAN_ENT(RTW_RD_2G_ETSI1, RTW_RD_5G_ETSI1, TXPWR_LMT_ETSI), /* 0x3A, RTW_CHPLAN_ETSI1_ETSI1 */ - CHPLAN_ENT(RTW_RD_2G_ETSI1, RTW_RD_5G_ACMA1, TXPWR_LMT_ACMA), /* 0x3B, RTW_CHPLAN_ETSI1_ACMA1 */ - CHPLAN_ENT(RTW_RD_2G_ETSI1, RTW_RD_5G_ETSI6, TXPWR_LMT_ETSI), /* 0x3C, RTW_CHPLAN_ETSI1_ETSI6 */ - CHPLAN_ENT(RTW_RD_2G_ETSI1, RTW_RD_5G_ETSI12, TXPWR_LMT_ETSI), /* 0x3D, RTW_CHPLAN_ETSI1_ETSI12 */ - CHPLAN_ENT(RTW_RD_2G_KCC1, RTW_RD_5G_KCC2, TXPWR_LMT_KCC), /* 0x3E, RTW_CHPLAN_KCC1_KCC2 */ - CHPLAN_ENT(RTW_RD_2G_FCC1, RTW_RD_5G_FCC11, TXPWR_LMT_FCC), /* 0x3F, RTW_CHPLAN_FCC1_FCC11*/ - CHPLAN_ENT(RTW_RD_2G_FCC1, RTW_RD_5G_NCC2, TXPWR_LMT_FCC), /* 0x40, RTW_CHPLAN_FCC1_NCC2 */ - CHPLAN_ENT(RTW_RD_2G_GLOBAL, RTW_RD_5G_NULL, TXPWR_LMT_WW), /* 0x41, RTW_CHPLAN_GLOBAL_NULL */ - CHPLAN_ENT(RTW_RD_2G_ETSI1, RTW_RD_5G_ETSI4, TXPWR_LMT_ETSI), /* 0x42, RTW_CHPLAN_ETSI1_ETSI4 */ - CHPLAN_ENT(RTW_RD_2G_FCC1, RTW_RD_5G_FCC2, TXPWR_LMT_FCC), /* 0x43, RTW_CHPLAN_FCC1_FCC2 */ - CHPLAN_ENT(RTW_RD_2G_FCC1, RTW_RD_5G_NCC3, TXPWR_LMT_FCC), /* 0x44, RTW_CHPLAN_FCC1_NCC3 */ - CHPLAN_ENT(RTW_RD_2G_WORLD, RTW_RD_5G_ACMA1, TXPWR_LMT_ACMA), /* 0x45, RTW_CHPLAN_WORLD_ACMA1 */ - CHPLAN_ENT(RTW_RD_2G_FCC1, RTW_RD_5G_FCC8, TXPWR_LMT_FCC), /* 0x46, RTW_CHPLAN_FCC1_FCC8 */ - CHPLAN_ENT(RTW_RD_2G_WORLD, RTW_RD_5G_ETSI6, TXPWR_LMT_ETSI), /* 0x47, RTW_CHPLAN_WORLD_ETSI6 */ - CHPLAN_ENT(RTW_RD_2G_WORLD, RTW_RD_5G_ETSI7, TXPWR_LMT_ETSI), /* 0x48, RTW_CHPLAN_WORLD_ETSI7 */ - CHPLAN_ENT(RTW_RD_2G_WORLD, RTW_RD_5G_ETSI8, TXPWR_LMT_ETSI), /* 0x49, RTW_CHPLAN_WORLD_ETSI8 */ - CHPLAN_ENT(RTW_RD_2G_IC2, RTW_RD_5G_IC2, TXPWR_LMT_IC), /* 0x4A, RTW_CHPLAN_IC2_IC2 */ - CHPLAN_ENT(RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW), /* 0x4B, */ - CHPLAN_ENT(RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW), /* 0x4C, */ - CHPLAN_ENT(RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW), /* 0x4D, */ - CHPLAN_ENT(RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW), /* 0x4E, */ - CHPLAN_ENT(RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW), /* 0x4F, */ - CHPLAN_ENT(RTW_RD_2G_WORLD, RTW_RD_5G_ETSI9, TXPWR_LMT_ETSI), /* 0x50, RTW_CHPLAN_WORLD_ETSI9 */ - CHPLAN_ENT(RTW_RD_2G_WORLD, RTW_RD_5G_ETSI10, TXPWR_LMT_ETSI), /* 0x51, RTW_CHPLAN_WORLD_ETSI10 */ - CHPLAN_ENT(RTW_RD_2G_WORLD, RTW_RD_5G_ETSI11, TXPWR_LMT_ETSI), /* 0x52, RTW_CHPLAN_WORLD_ETSI11 */ - CHPLAN_ENT(RTW_RD_2G_FCC1, RTW_RD_5G_NCC4, TXPWR_LMT_FCC), /* 0x53, RTW_CHPLAN_FCC1_NCC4 */ - CHPLAN_ENT(RTW_RD_2G_WORLD, RTW_RD_5G_ETSI12, TXPWR_LMT_ETSI), /* 0x54, RTW_CHPLAN_WORLD_ETSI12 */ - CHPLAN_ENT(RTW_RD_2G_FCC1, RTW_RD_5G_FCC9, TXPWR_LMT_FCC), /* 0x55, RTW_CHPLAN_FCC1_FCC9 */ - CHPLAN_ENT(RTW_RD_2G_WORLD, RTW_RD_5G_ETSI13, TXPWR_LMT_ETSI), /* 0x56, RTW_CHPLAN_WORLD_ETSI13 */ - CHPLAN_ENT(RTW_RD_2G_FCC1, RTW_RD_5G_FCC10, TXPWR_LMT_FCC), /* 0x57, RTW_CHPLAN_FCC1_FCC10 */ - CHPLAN_ENT(RTW_RD_2G_MKK2, RTW_RD_5G_MKK4, TXPWR_LMT_MKK), /* 0x58, RTW_CHPLAN_MKK2_MKK4 */ - CHPLAN_ENT(RTW_RD_2G_WORLD, RTW_RD_5G_ETSI14, TXPWR_LMT_ETSI), /* 0x59, RTW_CHPLAN_WORLD_ETSI14 */ - CHPLAN_ENT(RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW), /* 0x5A, */ - CHPLAN_ENT(RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW), /* 0x5B, */ - CHPLAN_ENT(RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW), /* 0x5C, */ - CHPLAN_ENT(RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW), /* 0x5D, */ - CHPLAN_ENT(RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW), /* 0x5E, */ - CHPLAN_ENT(RTW_RD_2G_NULL, RTW_RD_5G_NULL, TXPWR_LMT_WW), /* 0x5F, */ - CHPLAN_ENT(RTW_RD_2G_FCC1, RTW_RD_5G_FCC5, TXPWR_LMT_FCC), /* 0x60, RTW_CHPLAN_FCC1_FCC5 */ - CHPLAN_ENT(RTW_RD_2G_FCC2, RTW_RD_5G_FCC7, TXPWR_LMT_FCC), /* 0x61, RTW_CHPLAN_FCC2_FCC7 */ - CHPLAN_ENT(RTW_RD_2G_FCC2, RTW_RD_5G_FCC1, TXPWR_LMT_FCC), /* 0x62, RTW_CHPLAN_FCC2_FCC1 */ - CHPLAN_ENT(RTW_RD_2G_WORLD, RTW_RD_5G_ETSI15, TXPWR_LMT_ETSI), /* 0x63, RTW_CHPLAN_WORLD_ETSI15 */ - CHPLAN_ENT(RTW_RD_2G_MKK2, RTW_RD_5G_MKK5, TXPWR_LMT_MKK), /* 0x64, RTW_CHPLAN_MKK2_MKK5 */ - CHPLAN_ENT(RTW_RD_2G_ETSI1, RTW_RD_5G_ETSI16, TXPWR_LMT_ETSI), /* 0x65, RTW_CHPLAN_ETSI1_ETSI16 */ - CHPLAN_ENT(RTW_RD_2G_FCC1, RTW_RD_5G_FCC14, TXPWR_LMT_FCC), /* 0x66, RTW_CHPLAN_FCC1_FCC14 */ - CHPLAN_ENT(RTW_RD_2G_FCC1, RTW_RD_5G_FCC12, TXPWR_LMT_FCC), /* 0x67, RTW_CHPLAN_FCC1_FCC12 */ - CHPLAN_ENT(RTW_RD_2G_FCC2, RTW_RD_5G_FCC14, TXPWR_LMT_FCC), /* 0x68, RTW_CHPLAN_FCC2_FCC14 */ - CHPLAN_ENT(RTW_RD_2G_FCC2, RTW_RD_5G_FCC12, TXPWR_LMT_FCC), /* 0x69, RTW_CHPLAN_FCC2_FCC12 */ - CHPLAN_ENT(RTW_RD_2G_ETSI1, RTW_RD_5G_ETSI17, TXPWR_LMT_ETSI), /* 0x6A, RTW_CHPLAN_ETSI1_ETSI17 */ - CHPLAN_ENT(RTW_RD_2G_WORLD, RTW_RD_5G_FCC16, TXPWR_LMT_FCC), /* 0x6B, RTW_CHPLAN_WORLD_FCC16 */ - CHPLAN_ENT(RTW_RD_2G_WORLD, RTW_RD_5G_FCC13, TXPWR_LMT_FCC), /* 0x6C, RTW_CHPLAN_WORLD_FCC13 */ - CHPLAN_ENT(RTW_RD_2G_FCC2, RTW_RD_5G_FCC15, TXPWR_LMT_FCC), /* 0x6D, RTW_CHPLAN_FCC2_FCC15 */ - CHPLAN_ENT(RTW_RD_2G_WORLD, RTW_RD_5G_FCC12, TXPWR_LMT_FCC), /* 0x6E, RTW_CHPLAN_WORLD_FCC12 */ - CHPLAN_ENT(RTW_RD_2G_NULL, RTW_RD_5G_ETSI8, TXPWR_LMT_ETSI), /* 0x6F, RTW_CHPLAN_NULL_ETSI8 */ - CHPLAN_ENT(RTW_RD_2G_NULL, RTW_RD_5G_ETSI18, TXPWR_LMT_ETSI), /* 0x70, RTW_CHPLAN_NULL_ETSI18 */ - CHPLAN_ENT(RTW_RD_2G_NULL, RTW_RD_5G_ETSI17, TXPWR_LMT_ETSI), /* 0x71, RTW_CHPLAN_NULL_ETSI17 */ - CHPLAN_ENT(RTW_RD_2G_NULL, RTW_RD_5G_ETSI19, TXPWR_LMT_ETSI), /* 0x72, RTW_CHPLAN_NULL_ETSI19 */ - CHPLAN_ENT(RTW_RD_2G_WORLD, RTW_RD_5G_FCC7, TXPWR_LMT_FCC), /* 0x73, RTW_CHPLAN_WORLD_FCC7 */ - CHPLAN_ENT(RTW_RD_2G_FCC2, RTW_RD_5G_FCC17, TXPWR_LMT_FCC), /* 0x74, RTW_CHPLAN_FCC2_FCC17 */ - CHPLAN_ENT(RTW_RD_2G_WORLD, RTW_RD_5G_ETSI20, TXPWR_LMT_ETSI), /* 0x75, RTW_CHPLAN_WORLD_ETSI20 */ - CHPLAN_ENT(RTW_RD_2G_FCC2, RTW_RD_5G_FCC11, TXPWR_LMT_FCC), /* 0x76, RTW_CHPLAN_FCC2_FCC11 */ - CHPLAN_ENT(RTW_RD_2G_WORLD, RTW_RD_5G_ETSI21, TXPWR_LMT_ETSI), /* 0x77, RTW_CHPLAN_WORLD_ETSI21 */ - CHPLAN_ENT(RTW_RD_2G_FCC1, RTW_RD_5G_FCC18, TXPWR_LMT_FCC), /* 0x78, RTW_CHPLAN_FCC1_FCC18 */ - CHPLAN_ENT(RTW_RD_2G_MKK2, RTW_RD_5G_MKK1, TXPWR_LMT_MKK), /* 0x79, RTW_CHPLAN_MKK2_MKK1 */ -}; - -static struct chplan_ent_t RTW_CHANNEL_PLAN_MAP_REALTEK_DEFINE = - CHPLAN_ENT(RTW_RD_2G_WORLD, RTW_RD_5G_FCC1, TXPWR_LMT_FCC); /* 0x7F, Realtek Define */ - -u8 rtw_chplan_get_default_regd(u8 id) -{ - u8 regd; - - if (id == RTW_CHPLAN_REALTEK_DEFINE) - regd = RTW_CHANNEL_PLAN_MAP_REALTEK_DEFINE.regd; - else - regd = RTW_ChannelPlanMap[id].regd; - - return regd; -} - -bool rtw_chplan_is_empty(u8 id) -{ - struct chplan_ent_t *chplan_map; - - if (id == RTW_CHPLAN_REALTEK_DEFINE) - chplan_map = &RTW_CHANNEL_PLAN_MAP_REALTEK_DEFINE; - else - chplan_map = &RTW_ChannelPlanMap[id]; - - if (chplan_map->rd_2g == RTW_RD_2G_NULL - #ifdef CONFIG_IEEE80211_BAND_5GHZ - && chplan_map->rd_5g == RTW_RD_5G_NULL - #endif - ) - return _TRUE; - - return _FALSE; -} - -bool rtw_regsty_is_excl_chs(struct registry_priv *regsty, u8 ch) -{ - int i; - - for (i = 0; i < MAX_CHANNEL_NUM; i++) { - if (regsty->excl_chs[i] == 0) - break; - if (regsty->excl_chs[i] == ch) - return _TRUE; - } - return _FALSE; -} - -inline static u8 rtw_rd_5g_band1_passive(u8 rtw_rd_5g) -{ - u8 passive = 0; - - switch (rtw_rd_5g) { - case RTW_RD_5G_FCC13: - case RTW_RD_5G_FCC16: - case RTW_RD_5G_ETSI18: - case RTW_RD_5G_ETSI19: - case RTW_RD_5G_WORLD: - case RTW_RD_5G_WORLD1: - passive = 1; - }; - - return passive; -} - -inline static u8 rtw_rd_5g_band4_passive(u8 rtw_rd_5g) -{ - u8 passive = 0; - - switch (rtw_rd_5g) { - case RTW_RD_5G_MKK5: - case RTW_RD_5G_ETSI16: - case RTW_RD_5G_ETSI18: - case RTW_RD_5G_ETSI19: - case RTW_RD_5G_WORLD: - passive = 1; - }; - - return passive; -} - -u8 init_channel_set(_adapter *padapter, u8 ChannelPlan, RT_CHANNEL_INFO *channel_set) -{ - struct registry_priv *regsty = adapter_to_regsty(padapter); - u8 index, chanset_size = 0; - u8 b5GBand = _FALSE, b2_4GBand = _FALSE; - u8 rd_2g = 0, rd_5g = 0; -#ifdef CONFIG_DFS_MASTER - int i; -#endif - - if (!rtw_is_channel_plan_valid(ChannelPlan)) { - RTW_ERR("ChannelPlan ID 0x%02X error !!!!!\n", ChannelPlan); - return chanset_size; - } - - _rtw_memset(channel_set, 0, sizeof(RT_CHANNEL_INFO) * MAX_CHANNEL_NUM); - - if (IsSupported24G(regsty->wireless_mode) && hal_chk_band_cap(padapter, BAND_CAP_2G)) - b2_4GBand = _TRUE; - - if (is_supported_5g(regsty->wireless_mode) && hal_chk_band_cap(padapter, BAND_CAP_5G)) - b5GBand = _TRUE; - - if (b2_4GBand == _FALSE && b5GBand == _FALSE) { - RTW_WARN("HW band_cap has no intersection with SW wireless_mode setting\n"); - return chanset_size; - } - - if (b2_4GBand) { - if (ChannelPlan == RTW_CHPLAN_REALTEK_DEFINE) - rd_2g = RTW_CHANNEL_PLAN_MAP_REALTEK_DEFINE.rd_2g; - else - rd_2g = RTW_ChannelPlanMap[ChannelPlan].rd_2g; - - for (index = 0; index < CH_LIST_LEN(RTW_ChannelPlan2G[rd_2g]); index++) { - if (rtw_regsty_is_excl_chs(regsty, CH_LIST_CH(RTW_ChannelPlan2G[rd_2g], index)) == _TRUE) - continue; - - if (chanset_size >= MAX_CHANNEL_NUM) { - RTW_WARN("chset size can't exceed MAX_CHANNEL_NUM(%u)\n", MAX_CHANNEL_NUM); - break; - } - - channel_set[chanset_size].ChannelNum = CH_LIST_CH(RTW_ChannelPlan2G[rd_2g], index); - - if (ChannelPlan == RTW_CHPLAN_GLOBAL_DOAMIN - || rd_2g == RTW_RD_2G_GLOBAL - ) { - /* Channel 1~11 is active, and 12~14 is passive */ - if (channel_set[chanset_size].ChannelNum >= 1 && channel_set[chanset_size].ChannelNum <= 11) - channel_set[chanset_size].ScanType = SCAN_ACTIVE; - else if ((channel_set[chanset_size].ChannelNum >= 12 && channel_set[chanset_size].ChannelNum <= 14)) - channel_set[chanset_size].ScanType = SCAN_PASSIVE; - } else if (ChannelPlan == RTW_CHPLAN_WORLD_WIDE_13 - || ChannelPlan == RTW_CHPLAN_WORLD_WIDE_5G - || rd_2g == RTW_RD_2G_WORLD - ) { - /* channel 12~13, passive scan */ - if (channel_set[chanset_size].ChannelNum <= 11) - channel_set[chanset_size].ScanType = SCAN_ACTIVE; - else - channel_set[chanset_size].ScanType = SCAN_PASSIVE; - } else - channel_set[chanset_size].ScanType = SCAN_ACTIVE; - - chanset_size++; - } - } - -#ifdef CONFIG_IEEE80211_BAND_5GHZ - if (b5GBand) { - if (ChannelPlan == RTW_CHPLAN_REALTEK_DEFINE) - rd_5g = RTW_CHANNEL_PLAN_MAP_REALTEK_DEFINE.rd_5g; - else - rd_5g = RTW_ChannelPlanMap[ChannelPlan].rd_5g; - - for (index = 0; index < CH_LIST_LEN(RTW_ChannelPlan5G[rd_5g]); index++) { - if (rtw_regsty_is_excl_chs(regsty, CH_LIST_CH(RTW_ChannelPlan5G[rd_5g], index)) == _TRUE) - continue; - #ifndef CONFIG_DFS - if (rtw_is_dfs_ch(CH_LIST_CH(RTW_ChannelPlan5G[rd_5g], index))) - continue; - #endif - - if (chanset_size >= MAX_CHANNEL_NUM) { - RTW_WARN("chset size can't exceed MAX_CHANNEL_NUM(%u)\n", MAX_CHANNEL_NUM); - break; - } - - channel_set[chanset_size].ChannelNum = CH_LIST_CH(RTW_ChannelPlan5G[rd_5g], index); - - if ((ChannelPlan == RTW_CHPLAN_WORLD_WIDE_5G) /* all channels passive */ - || (rtw_is_5g_band1(channel_set[chanset_size].ChannelNum) - && rtw_rd_5g_band1_passive(rd_5g)) /* band1 passive */ - || (rtw_is_5g_band4(channel_set[chanset_size].ChannelNum) - && rtw_rd_5g_band4_passive(rd_5g)) /* band4 passive */ - || (rtw_is_dfs_ch(channel_set[chanset_size].ChannelNum)) /* DFS channel(band2, 3) passive */ - ) - channel_set[chanset_size].ScanType = SCAN_PASSIVE; - else - channel_set[chanset_size].ScanType = SCAN_ACTIVE; - - chanset_size++; - } - } - - #ifdef CONFIG_DFS_MASTER - for (i = 0; i < chanset_size; i++) - channel_set[i].non_ocp_end_time = rtw_get_current_time(); - #endif -#endif /* CONFIG_IEEE80211_BAND_5GHZ */ - - if (chanset_size) - RTW_INFO(FUNC_ADPT_FMT" ChannelPlan ID:0x%02x, ch num:%d\n" - , FUNC_ADPT_ARG(padapter), ChannelPlan, chanset_size); - else - RTW_WARN(FUNC_ADPT_FMT" ChannelPlan ID:0x%02x, final chset has no channel\n" - , FUNC_ADPT_ARG(padapter), ChannelPlan); - - return chanset_size; -} - -#ifdef CONFIG_80211AC_VHT -#define COUNTRY_CHPLAN_ASSIGN_EN_11AC(_val) , .en_11ac = (_val) -#else -#define COUNTRY_CHPLAN_ASSIGN_EN_11AC(_val) -#endif - -#if RTW_DEF_MODULE_REGULATORY_CERT -#define COUNTRY_CHPLAN_ASSIGN_DEF_MODULE_FLAGS(_val) , .def_module_flags = (_val) -#else -#define COUNTRY_CHPLAN_ASSIGN_DEF_MODULE_FLAGS(_val) -#endif - -/* has def_module_flags specified, used by common map and HAL dfference map */ -#define COUNTRY_CHPLAN_ENT(_alpha2, _chplan, _en_11ac, _def_module_flags) \ - {.alpha2 = (_alpha2), .chplan = (_chplan) \ - COUNTRY_CHPLAN_ASSIGN_EN_11AC(_en_11ac) \ - COUNTRY_CHPLAN_ASSIGN_DEF_MODULE_FLAGS(_def_module_flags) \ - } - -#ifdef CONFIG_CUSTOMIZED_COUNTRY_CHPLAN_MAP - -#include "../platform/custom_country_chplan.h" - -#elif RTW_DEF_MODULE_REGULATORY_CERT - -/* leave def_module_flags empty, def_module_flags check is done on country_chplan_map */ -#if (RTW_DEF_MODULE_REGULATORY_CERT & RTW_MODULE_RTL8821AE_HMC_M2) /* 2013 certify */ -static const struct country_chplan RTL8821AE_HMC_M2_country_chplan_exc_map[] = { - COUNTRY_CHPLAN_ENT("CA", 0x34, 1, 0), /* Canada */ - COUNTRY_CHPLAN_ENT("CL", 0x30, 1, 0), /* Chile */ - COUNTRY_CHPLAN_ENT("CN", 0x51, 1, 0), /* China */ - COUNTRY_CHPLAN_ENT("CO", 0x34, 1, 0), /* Colombia */ - COUNTRY_CHPLAN_ENT("CR", 0x34, 1, 0), /* Costa Rica */ - COUNTRY_CHPLAN_ENT("DO", 0x34, 1, 0), /* Dominican Republic */ - COUNTRY_CHPLAN_ENT("EC", 0x34, 1, 0), /* Ecuador */ - COUNTRY_CHPLAN_ENT("GT", 0x34, 1, 0), /* Guatemala */ - COUNTRY_CHPLAN_ENT("KR", 0x28, 1, 0), /* South Korea */ - COUNTRY_CHPLAN_ENT("MX", 0x34, 1, 0), /* Mexico */ - COUNTRY_CHPLAN_ENT("MY", 0x47, 1, 0), /* Malaysia */ - COUNTRY_CHPLAN_ENT("NI", 0x34, 1, 0), /* Nicaragua */ - COUNTRY_CHPLAN_ENT("PA", 0x34, 1, 0), /* Panama */ - COUNTRY_CHPLAN_ENT("PE", 0x34, 1, 0), /* Peru */ - COUNTRY_CHPLAN_ENT("PR", 0x34, 1, 0), /* Puerto Rico */ - COUNTRY_CHPLAN_ENT("PY", 0x34, 1, 0), /* Paraguay */ - COUNTRY_CHPLAN_ENT("TW", 0x39, 1, 0), /* Taiwan */ - COUNTRY_CHPLAN_ENT("UA", 0x36, 0, 0), /* Ukraine */ - COUNTRY_CHPLAN_ENT("US", 0x34, 1, 0), /* United States of America (USA) */ -}; -#endif - -#if (RTW_DEF_MODULE_REGULATORY_CERT & RTW_MODULE_RTL8821AU) /* 2014 certify */ -static const struct country_chplan RTL8821AU_country_chplan_exc_map[] = { - COUNTRY_CHPLAN_ENT("CA", 0x34, 1, 0), /* Canada */ - COUNTRY_CHPLAN_ENT("KR", 0x28, 1, 0), /* South Korea */ - COUNTRY_CHPLAN_ENT("RU", 0x59, 0, 0), /* Russia(fac/gost), Kaliningrad */ - COUNTRY_CHPLAN_ENT("TW", 0x39, 1, 0), /* Taiwan */ - COUNTRY_CHPLAN_ENT("UA", 0x36, 0, 0), /* Ukraine */ - COUNTRY_CHPLAN_ENT("US", 0x34, 1, 0), /* United States of America (USA) */ -}; -#endif - -#if (RTW_DEF_MODULE_REGULATORY_CERT & RTW_MODULE_RTL8812AENF_NGFF) /* 2014 certify */ -static const struct country_chplan RTL8812AENF_NGFF_country_chplan_exc_map[] = { - COUNTRY_CHPLAN_ENT("TW", 0x39, 1, 0), /* Taiwan */ - COUNTRY_CHPLAN_ENT("US", 0x34, 1, 0), /* United States of America (USA) */ -}; -#endif - -#if (RTW_DEF_MODULE_REGULATORY_CERT & RTW_MODULE_RTL8812AEBT_HMC) /* 2013 certify */ -static const struct country_chplan RTL8812AEBT_HMC_country_chplan_exc_map[] = { - COUNTRY_CHPLAN_ENT("CA", 0x34, 1, 0), /* Canada */ - COUNTRY_CHPLAN_ENT("KR", 0x28, 1, 0), /* South Korea */ - COUNTRY_CHPLAN_ENT("RU", 0x59, 0, 0), /* Russia(fac/gost), Kaliningrad */ - COUNTRY_CHPLAN_ENT("TW", 0x39, 1, 0), /* Taiwan */ - COUNTRY_CHPLAN_ENT("UA", 0x36, 0, 0), /* Ukraine */ - COUNTRY_CHPLAN_ENT("US", 0x34, 1, 0), /* United States of America (USA) */ -}; -#endif - -#if (RTW_DEF_MODULE_REGULATORY_CERT & RTW_MODULE_RTL8188EE_HMC_M2) /* 2012 certify */ -static const struct country_chplan RTL8188EE_HMC_M2_country_chplan_exc_map[] = { - COUNTRY_CHPLAN_ENT("AW", 0x34, 1, 0), /* Aruba */ - COUNTRY_CHPLAN_ENT("BB", 0x34, 1, 0), /* Barbados */ - COUNTRY_CHPLAN_ENT("CA", 0x20, 1, 0), /* Canada */ - COUNTRY_CHPLAN_ENT("CO", 0x34, 1, 0), /* Colombia */ - COUNTRY_CHPLAN_ENT("CR", 0x34, 1, 0), /* Costa Rica */ - COUNTRY_CHPLAN_ENT("DO", 0x34, 1, 0), /* Dominican Republic */ - COUNTRY_CHPLAN_ENT("EC", 0x34, 1, 0), /* Ecuador */ - COUNTRY_CHPLAN_ENT("GT", 0x34, 1, 0), /* Guatemala */ - COUNTRY_CHPLAN_ENT("HT", 0x34, 1, 0), /* Haiti */ - COUNTRY_CHPLAN_ENT("KR", 0x28, 1, 0), /* South Korea */ - COUNTRY_CHPLAN_ENT("MX", 0x34, 1, 0), /* Mexico */ - COUNTRY_CHPLAN_ENT("NI", 0x34, 1, 0), /* Nicaragua */ - COUNTRY_CHPLAN_ENT("PA", 0x34, 1, 0), /* Panama */ - COUNTRY_CHPLAN_ENT("PE", 0x34, 1, 0), /* Peru */ - COUNTRY_CHPLAN_ENT("PR", 0x34, 1, 0), /* Puerto Rico */ - COUNTRY_CHPLAN_ENT("PY", 0x34, 1, 0), /* Paraguay */ - COUNTRY_CHPLAN_ENT("SC", 0x34, 1, 0), /* Seychelles */ - COUNTRY_CHPLAN_ENT("TW", 0x39, 1, 0), /* Taiwan */ - COUNTRY_CHPLAN_ENT("US", 0x34, 1, 0), /* United States of America (USA) */ - COUNTRY_CHPLAN_ENT("VC", 0x34, 1, 0), /* Saint Vincent and the Grenadines */ -}; -#endif - -#if (RTW_DEF_MODULE_REGULATORY_CERT & RTW_MODULE_RTL8723BE_HMC_M2) /* 2013 certify */ -static const struct country_chplan RTL8723BE_HMC_M2_country_chplan_exc_map[] = { - COUNTRY_CHPLAN_ENT("AW", 0x34, 1, 0), /* Aruba */ - COUNTRY_CHPLAN_ENT("BS", 0x34, 1, 0), /* Bahamas */ - COUNTRY_CHPLAN_ENT("CA", 0x20, 1, 0), /* Canada */ - COUNTRY_CHPLAN_ENT("CO", 0x34, 1, 0), /* Colombia */ - COUNTRY_CHPLAN_ENT("CR", 0x34, 1, 0), /* Costa Rica */ - COUNTRY_CHPLAN_ENT("DO", 0x34, 1, 0), /* Dominican Republic */ - COUNTRY_CHPLAN_ENT("EC", 0x34, 1, 0), /* Ecuador */ - COUNTRY_CHPLAN_ENT("GT", 0x34, 1, 0), /* Guatemala */ - COUNTRY_CHPLAN_ENT("KR", 0x28, 1, 0), /* South Korea */ - COUNTRY_CHPLAN_ENT("MX", 0x34, 1, 0), /* Mexico */ - COUNTRY_CHPLAN_ENT("NI", 0x34, 1, 0), /* Nicaragua */ - COUNTRY_CHPLAN_ENT("PA", 0x34, 1, 0), /* Panama */ - COUNTRY_CHPLAN_ENT("PE", 0x34, 1, 0), /* Peru */ - COUNTRY_CHPLAN_ENT("PR", 0x34, 1, 0), /* Puerto Rico */ - COUNTRY_CHPLAN_ENT("PY", 0x34, 1, 0), /* Paraguay */ - COUNTRY_CHPLAN_ENT("TW", 0x39, 1, 0), /* Taiwan */ - COUNTRY_CHPLAN_ENT("US", 0x34, 1, 0), /* United States of America (USA) */ -}; -#endif - -#if (RTW_DEF_MODULE_REGULATORY_CERT & RTW_MODULE_RTL8723BS_NGFF1216) /* 2014 certify */ -static const struct country_chplan RTL8723BS_NGFF1216_country_chplan_exc_map[] = { - COUNTRY_CHPLAN_ENT("BB", 0x34, 1, 0), /* Barbados */ - COUNTRY_CHPLAN_ENT("CA", 0x20, 1, 0), /* Canada */ - COUNTRY_CHPLAN_ENT("CO", 0x34, 1, 0), /* Colombia */ - COUNTRY_CHPLAN_ENT("CR", 0x34, 1, 0), /* Costa Rica */ - COUNTRY_CHPLAN_ENT("DO", 0x34, 1, 0), /* Dominican Republic */ - COUNTRY_CHPLAN_ENT("EC", 0x34, 1, 0), /* Ecuador */ - COUNTRY_CHPLAN_ENT("GT", 0x34, 1, 0), /* Guatemala */ - COUNTRY_CHPLAN_ENT("HT", 0x34, 1, 0), /* Haiti */ - COUNTRY_CHPLAN_ENT("KR", 0x28, 1, 0), /* South Korea */ - COUNTRY_CHPLAN_ENT("MX", 0x34, 1, 0), /* Mexico */ - COUNTRY_CHPLAN_ENT("NI", 0x34, 1, 0), /* Nicaragua */ - COUNTRY_CHPLAN_ENT("PA", 0x34, 1, 0), /* Panama */ - COUNTRY_CHPLAN_ENT("PE", 0x34, 1, 0), /* Peru */ - COUNTRY_CHPLAN_ENT("PR", 0x34, 1, 0), /* Puerto Rico */ - COUNTRY_CHPLAN_ENT("PY", 0x34, 1, 0), /* Paraguay */ - COUNTRY_CHPLAN_ENT("TW", 0x39, 1, 0), /* Taiwan */ - COUNTRY_CHPLAN_ENT("US", 0x34, 1, 0), /* United States of America (USA) */ -}; -#endif - -#if (RTW_DEF_MODULE_REGULATORY_CERT & RTW_MODULE_RTL8192EEBT_HMC_M2) /* 2013 certify */ -static const struct country_chplan RTL8192EEBT_HMC_M2_country_chplan_exc_map[] = { - COUNTRY_CHPLAN_ENT("AW", 0x34, 1, 0), /* Aruba */ - COUNTRY_CHPLAN_ENT("CA", 0x20, 1, 0), /* Canada */ - COUNTRY_CHPLAN_ENT("CO", 0x34, 1, 0), /* Colombia */ - COUNTRY_CHPLAN_ENT("CR", 0x34, 1, 0), /* Costa Rica */ - COUNTRY_CHPLAN_ENT("DO", 0x34, 1, 0), /* Dominican Republic */ - COUNTRY_CHPLAN_ENT("EC", 0x34, 1, 0), /* Ecuador */ - COUNTRY_CHPLAN_ENT("GT", 0x34, 1, 0), /* Guatemala */ - COUNTRY_CHPLAN_ENT("KR", 0x28, 1, 0), /* South Korea */ - COUNTRY_CHPLAN_ENT("MX", 0x34, 1, 0), /* Mexico */ - COUNTRY_CHPLAN_ENT("NI", 0x34, 1, 0), /* Nicaragua */ - COUNTRY_CHPLAN_ENT("PA", 0x34, 1, 0), /* Panama */ - COUNTRY_CHPLAN_ENT("PE", 0x34, 1, 0), /* Peru */ - COUNTRY_CHPLAN_ENT("PR", 0x34, 1, 0), /* Puerto Rico */ - COUNTRY_CHPLAN_ENT("PY", 0x34, 1, 0), /* Paraguay */ - COUNTRY_CHPLAN_ENT("SC", 0x34, 1, 0), /* Seychelles */ - COUNTRY_CHPLAN_ENT("ST", 0x34, 1, 0), /* Sao Tome and Principe */ - COUNTRY_CHPLAN_ENT("TW", 0x39, 1, 0), /* Taiwan */ - COUNTRY_CHPLAN_ENT("US", 0x34, 1, 0), /* United States of America (USA) */ -}; -#endif - -#if (RTW_DEF_MODULE_REGULATORY_CERT & RTW_MODULE_RTL8723DE_NGFF1630) /* 2016 certify */ -static const struct country_chplan RTL8723DE_NGFF1630_country_chplan_exc_map[] = { - COUNTRY_CHPLAN_ENT("CA", 0x2A, 1, 0), /* Canada */ - COUNTRY_CHPLAN_ENT("KR", 0x28, 1, 0), /* South Korea */ - COUNTRY_CHPLAN_ENT("MX", 0x34, 1, 0), /* Mexico */ -}; -#endif - -#if (RTW_DEF_MODULE_REGULATORY_CERT & RTW_MODULE_RTL8822BE) /* 2016 certify */ -static const struct country_chplan RTL8822BE_country_chplan_exc_map[] = { - COUNTRY_CHPLAN_ENT("KR", 0x28, 1, 0), /* South Korea */ -}; -#endif - -#if (RTW_DEF_MODULE_REGULATORY_CERT & RTW_MODULE_RTL8821CE) /* 2016 certify */ -static const struct country_chplan RTL8821CE_country_chplan_exc_map[] = { - COUNTRY_CHPLAN_ENT("KR", 0x28, 1, 0), /* South Korea */ -}; -#endif - -/** - * rtw_def_module_get_chplan_from_country - - * @country_code: string of country code - * @return: - * Return NULL for case referring to common map - */ -static const struct country_chplan *rtw_def_module_get_chplan_from_country(const char *country_code) -{ - const struct country_chplan *ent = NULL; - const struct country_chplan *hal_map = NULL; - u16 hal_map_sz = 0; - int i; - - /* TODO: runtime selection for multi driver */ -#if (RTW_DEF_MODULE_REGULATORY_CERT == RTW_MODULE_RTL8821AE_HMC_M2) - hal_map = RTL8821AE_HMC_M2_country_chplan_exc_map; - hal_map_sz = sizeof(RTL8821AE_HMC_M2_country_chplan_exc_map) / sizeof(struct country_chplan); -#elif (RTW_DEF_MODULE_REGULATORY_CERT == RTW_MODULE_RTL8821AU) - hal_map = RTL8821AU_country_chplan_exc_map; - hal_map_sz = sizeof(RTL8821AU_country_chplan_exc_map) / sizeof(struct country_chplan); -#elif (RTW_DEF_MODULE_REGULATORY_CERT == RTW_MODULE_RTL8812AENF_NGFF) - hal_map = RTL8812AENF_NGFF_country_chplan_exc_map; - hal_map_sz = sizeof(RTL8812AENF_NGFF_country_chplan_exc_map) / sizeof(struct country_chplan); -#elif (RTW_DEF_MODULE_REGULATORY_CERT == RTW_MODULE_RTL8812AEBT_HMC) - hal_map = RTL8812AEBT_HMC_country_chplan_exc_map; - hal_map_sz = sizeof(RTL8812AEBT_HMC_country_chplan_exc_map) / sizeof(struct country_chplan); -#elif (RTW_DEF_MODULE_REGULATORY_CERT == RTW_MODULE_RTL8188EE_HMC_M2) - hal_map = RTL8188EE_HMC_M2_country_chplan_exc_map; - hal_map_sz = sizeof(RTL8188EE_HMC_M2_country_chplan_exc_map) / sizeof(struct country_chplan); -#elif (RTW_DEF_MODULE_REGULATORY_CERT == RTW_MODULE_RTL8723BE_HMC_M2) - hal_map = RTL8723BE_HMC_M2_country_chplan_exc_map; - hal_map_sz = sizeof(RTL8723BE_HMC_M2_country_chplan_exc_map) / sizeof(struct country_chplan); -#elif (RTW_DEF_MODULE_REGULATORY_CERT == RTW_MODULE_RTL8723BS_NGFF1216) - hal_map = RTL8723BS_NGFF1216_country_chplan_exc_map; - hal_map_sz = sizeof(RTL8723BS_NGFF1216_country_chplan_exc_map) / sizeof(struct country_chplan); -#elif (RTW_DEF_MODULE_REGULATORY_CERT == RTW_MODULE_RTL8192EEBT_HMC_M2) - hal_map = RTL8192EEBT_HMC_M2_country_chplan_exc_map; - hal_map_sz = sizeof(RTL8192EEBT_HMC_M2_country_chplan_exc_map) / sizeof(struct country_chplan); -#elif (RTW_DEF_MODULE_REGULATORY_CERT == RTW_MODULE_RTL8723DE_NGFF1630) - hal_map = RTL8723DE_NGFF1630_country_chplan_exc_map; - hal_map_sz = sizeof(RTL8723DE_NGFF1630_country_chplan_exc_map) / sizeof(struct country_chplan); -#elif (RTW_DEF_MODULE_REGULATORY_CERT == RTW_MODULE_RTL8822BE) - hal_map = RTL8822BE_country_chplan_exc_map; - hal_map_sz = sizeof(RTL8822BE_country_chplan_exc_map) / sizeof(struct country_chplan); -#elif (RTW_DEF_MODULE_REGULATORY_CERT == RTW_MODULE_RTL8821CE) - hal_map = RTL8821CE_country_chplan_exc_map; - hal_map_sz = sizeof(RTL8821CE_country_chplan_exc_map) / sizeof(struct country_chplan); -#endif - - if (hal_map == NULL || hal_map_sz == 0) - goto exit; - - for (i = 0; i < hal_map_sz; i++) { - if (strncmp(country_code, hal_map[i].alpha2, 2) == 0) { - ent = &hal_map[i]; - break; - } - } - -exit: - return ent; -} -#endif /* CONFIG_CUSTOMIZED_COUNTRY_CHPLAN_MAP or RTW_DEF_MODULE_REGULATORY_CERT */ - -static const struct country_chplan country_chplan_map[] = { - COUNTRY_CHPLAN_ENT("AD", 0x26, 1, 0x000), /* Andorra */ - COUNTRY_CHPLAN_ENT("AE", 0x35, 1, 0x7FB), /* United Arab Emirates */ - COUNTRY_CHPLAN_ENT("AF", 0x42, 1, 0x000), /* Afghanistan */ - COUNTRY_CHPLAN_ENT("AG", 0x76, 1, 0x000), /* Antigua & Barbuda */ - COUNTRY_CHPLAN_ENT("AI", 0x26, 1, 0x000), /* Anguilla(UK) */ - COUNTRY_CHPLAN_ENT("AL", 0x26, 1, 0x7F1), /* Albania */ - COUNTRY_CHPLAN_ENT("AM", 0x26, 1, 0x6B0), /* Armenia */ - COUNTRY_CHPLAN_ENT("AN", 0x76, 1, 0x7F1), /* Netherlands Antilles */ - COUNTRY_CHPLAN_ENT("AO", 0x47, 1, 0x6E0), /* Angola */ - COUNTRY_CHPLAN_ENT("AQ", 0x26, 1, 0x000), /* Antarctica */ - COUNTRY_CHPLAN_ENT("AR", 0x61, 1, 0x7F3), /* Argentina */ - COUNTRY_CHPLAN_ENT("AS", 0x76, 1, 0x000), /* American Samoa */ - COUNTRY_CHPLAN_ENT("AT", 0x26, 1, 0x7FB), /* Austria */ - COUNTRY_CHPLAN_ENT("AU", 0x45, 1, 0x7FB), /* Australia */ - COUNTRY_CHPLAN_ENT("AW", 0x76, 1, 0x0B0), /* Aruba */ - COUNTRY_CHPLAN_ENT("AZ", 0x26, 1, 0x7F1), /* Azerbaijan */ - COUNTRY_CHPLAN_ENT("BA", 0x26, 1, 0x7F1), /* Bosnia & Herzegovina */ - COUNTRY_CHPLAN_ENT("BB", 0x76, 1, 0x650), /* Barbados */ - COUNTRY_CHPLAN_ENT("BD", 0x26, 1, 0x7F1), /* Bangladesh */ - COUNTRY_CHPLAN_ENT("BE", 0x26, 1, 0x7FB), /* Belgium */ - COUNTRY_CHPLAN_ENT("BF", 0x26, 1, 0x6B0), /* Burkina Faso */ - COUNTRY_CHPLAN_ENT("BG", 0x26, 1, 0x7F1), /* Bulgaria */ - COUNTRY_CHPLAN_ENT("BH", 0x48, 1, 0x7F1), /* Bahrain */ - COUNTRY_CHPLAN_ENT("BI", 0x26, 1, 0x6B0), /* Burundi */ - COUNTRY_CHPLAN_ENT("BJ", 0x26, 1, 0x6B0), /* Benin */ - COUNTRY_CHPLAN_ENT("BM", 0x76, 1, 0x600), /* Bermuda (UK) */ - COUNTRY_CHPLAN_ENT("BN", 0x47, 1, 0x610), /* Brunei */ - COUNTRY_CHPLAN_ENT("BO", 0x73, 1, 0x7F1), /* Bolivia */ - COUNTRY_CHPLAN_ENT("BR", 0x62, 1, 0x7F1), /* Brazil */ - COUNTRY_CHPLAN_ENT("BS", 0x76, 1, 0x620), /* Bahamas */ - COUNTRY_CHPLAN_ENT("BT", 0x26, 1, 0x000), /* Bhutan */ - COUNTRY_CHPLAN_ENT("BV", 0x26, 1, 0x000), /* Bouvet Island (Norway) */ - COUNTRY_CHPLAN_ENT("BW", 0x35, 1, 0x6F1), /* Botswana */ - COUNTRY_CHPLAN_ENT("BY", 0x26, 1, 0x7F1), /* Belarus */ - COUNTRY_CHPLAN_ENT("BZ", 0x76, 1, 0x000), /* Belize */ - COUNTRY_CHPLAN_ENT("CA", 0x2B, 1, 0x7FB), /* Canada */ - COUNTRY_CHPLAN_ENT("CC", 0x26, 1, 0x000), /* Cocos (Keeling) Islands (Australia) */ - COUNTRY_CHPLAN_ENT("CD", 0x26, 1, 0x6B0), /* Congo, Republic of the */ - COUNTRY_CHPLAN_ENT("CF", 0x26, 1, 0x6B0), /* Central African Republic */ - COUNTRY_CHPLAN_ENT("CG", 0x26, 1, 0x6B0), /* Congo, Democratic Republic of the. Zaire */ - COUNTRY_CHPLAN_ENT("CH", 0x26, 1, 0x7FB), /* Switzerland */ - COUNTRY_CHPLAN_ENT("CI", 0x42, 1, 0x7F1), /* Cote d'Ivoire */ - COUNTRY_CHPLAN_ENT("CK", 0x26, 1, 0x000), /* Cook Islands */ - COUNTRY_CHPLAN_ENT("CL", 0x2D, 1, 0x7F1), /* Chile */ - COUNTRY_CHPLAN_ENT("CM", 0x26, 1, 0x6B0), /* Cameroon */ - COUNTRY_CHPLAN_ENT("CN", 0x48, 1, 0x7FB), /* China */ - COUNTRY_CHPLAN_ENT("CO", 0x76, 1, 0x7F1), /* Colombia */ - COUNTRY_CHPLAN_ENT("CR", 0x76, 1, 0x7F1), /* Costa Rica */ - COUNTRY_CHPLAN_ENT("CV", 0x26, 1, 0x6B0), /* Cape Verde */ - COUNTRY_CHPLAN_ENT("CX", 0x45, 1, 0x000), /* Christmas Island (Australia) */ - COUNTRY_CHPLAN_ENT("CY", 0x26, 1, 0x7FB), /* Cyprus */ - COUNTRY_CHPLAN_ENT("CZ", 0x26, 1, 0x7FB), /* Czech Republic */ - COUNTRY_CHPLAN_ENT("DE", 0x26, 1, 0x7FB), /* Germany */ - COUNTRY_CHPLAN_ENT("DJ", 0x26, 1, 0x680), /* Djibouti */ - COUNTRY_CHPLAN_ENT("DK", 0x26, 1, 0x7FB), /* Denmark */ - COUNTRY_CHPLAN_ENT("DM", 0x76, 1, 0x000), /* Dominica */ - COUNTRY_CHPLAN_ENT("DO", 0x76, 1, 0x7F1), /* Dominican Republic */ - COUNTRY_CHPLAN_ENT("DZ", 0x26, 1, 0x7F1), /* Algeria */ - COUNTRY_CHPLAN_ENT("EC", 0x76, 1, 0x7F1), /* Ecuador */ - COUNTRY_CHPLAN_ENT("EE", 0x26, 1, 0x7FB), /* Estonia */ - COUNTRY_CHPLAN_ENT("EG", 0x47, 1, 0x7F1), /* Egypt */ - COUNTRY_CHPLAN_ENT("EH", 0x47, 1, 0x680), /* Western Sahara */ - COUNTRY_CHPLAN_ENT("ER", 0x26, 1, 0x000), /* Eritrea */ - COUNTRY_CHPLAN_ENT("ES", 0x26, 1, 0x7FB), /* Spain, Canary Islands, Ceuta, Melilla */ - COUNTRY_CHPLAN_ENT("ET", 0x26, 1, 0x4B0), /* Ethiopia */ - COUNTRY_CHPLAN_ENT("FI", 0x26, 1, 0x7FB), /* Finland */ - COUNTRY_CHPLAN_ENT("FJ", 0x76, 1, 0x600), /* Fiji */ - COUNTRY_CHPLAN_ENT("FK", 0x26, 1, 0x000), /* Falkland Islands (Islas Malvinas) (UK) */ - COUNTRY_CHPLAN_ENT("FM", 0x76, 1, 0x000), /* Micronesia, Federated States of (USA) */ - COUNTRY_CHPLAN_ENT("FO", 0x26, 1, 0x000), /* Faroe Islands (Denmark) */ - COUNTRY_CHPLAN_ENT("FR", 0x26, 1, 0x7FB), /* France */ - COUNTRY_CHPLAN_ENT("GA", 0x26, 1, 0x6B0), /* Gabon */ - COUNTRY_CHPLAN_ENT("GB", 0x26, 1, 0x7FB), /* Great Britain (United Kingdom; England) */ - COUNTRY_CHPLAN_ENT("GD", 0x76, 1, 0x0B0), /* Grenada */ - COUNTRY_CHPLAN_ENT("GE", 0x26, 1, 0x600), /* Georgia */ - COUNTRY_CHPLAN_ENT("GF", 0x26, 1, 0x080), /* French Guiana */ - COUNTRY_CHPLAN_ENT("GG", 0x26, 1, 0x000), /* Guernsey (UK) */ - COUNTRY_CHPLAN_ENT("GH", 0x26, 1, 0x7F1), /* Ghana */ - COUNTRY_CHPLAN_ENT("GI", 0x26, 1, 0x600), /* Gibraltar (UK) */ - COUNTRY_CHPLAN_ENT("GL", 0x26, 1, 0x600), /* Greenland (Denmark) */ - COUNTRY_CHPLAN_ENT("GM", 0x26, 1, 0x6B0), /* Gambia */ - COUNTRY_CHPLAN_ENT("GN", 0x26, 1, 0x610), /* Guinea */ - COUNTRY_CHPLAN_ENT("GP", 0x26, 1, 0x600), /* Guadeloupe (France) */ - COUNTRY_CHPLAN_ENT("GQ", 0x26, 1, 0x6B0), /* Equatorial Guinea */ - COUNTRY_CHPLAN_ENT("GR", 0x26, 1, 0x7FB), /* Greece */ - COUNTRY_CHPLAN_ENT("GS", 0x26, 1, 0x000), /* South Georgia and the Sandwich Islands (UK) */ - COUNTRY_CHPLAN_ENT("GT", 0x61, 1, 0x7F1), /* Guatemala */ - COUNTRY_CHPLAN_ENT("GU", 0x76, 1, 0x600), /* Guam (USA) */ - COUNTRY_CHPLAN_ENT("GW", 0x26, 1, 0x6B0), /* Guinea-Bissau */ - COUNTRY_CHPLAN_ENT("GY", 0x44, 1, 0x000), /* Guyana */ - COUNTRY_CHPLAN_ENT("HK", 0x35, 1, 0x7FB), /* Hong Kong */ - COUNTRY_CHPLAN_ENT("HM", 0x45, 1, 0x000), /* Heard and McDonald Islands (Australia) */ - COUNTRY_CHPLAN_ENT("HN", 0x32, 1, 0x7F1), /* Honduras */ - COUNTRY_CHPLAN_ENT("HR", 0x26, 1, 0x7F9), /* Croatia */ - COUNTRY_CHPLAN_ENT("HT", 0x76, 1, 0x650), /* Haiti */ - COUNTRY_CHPLAN_ENT("HU", 0x26, 1, 0x7FB), /* Hungary */ - COUNTRY_CHPLAN_ENT("ID", 0x3D, 0, 0x7F3), /* Indonesia */ - COUNTRY_CHPLAN_ENT("IE", 0x26, 1, 0x7FB), /* Ireland */ - COUNTRY_CHPLAN_ENT("IL", 0x47, 1, 0x7F1), /* Israel */ - COUNTRY_CHPLAN_ENT("IM", 0x26, 1, 0x000), /* Isle of Man (UK) */ - COUNTRY_CHPLAN_ENT("IN", 0x48, 1, 0x7F1), /* India */ - COUNTRY_CHPLAN_ENT("IO", 0x26, 1, 0x000), /* British Indian Ocean Territory (UK) */ - COUNTRY_CHPLAN_ENT("IQ", 0x26, 1, 0x000), /* Iraq */ - COUNTRY_CHPLAN_ENT("IR", 0x26, 0, 0x000), /* Iran */ - COUNTRY_CHPLAN_ENT("IS", 0x26, 1, 0x7FB), /* Iceland */ - COUNTRY_CHPLAN_ENT("IT", 0x26, 1, 0x7FB), /* Italy */ - COUNTRY_CHPLAN_ENT("JE", 0x26, 1, 0x000), /* Jersey (UK) */ - COUNTRY_CHPLAN_ENT("JM", 0x32, 1, 0x7F1), /* Jamaica */ - COUNTRY_CHPLAN_ENT("JO", 0x49, 1, 0x7FB), /* Jordan */ - COUNTRY_CHPLAN_ENT("JP", 0x27, 1, 0x7FF), /* Japan- Telec */ - COUNTRY_CHPLAN_ENT("KE", 0x47, 1, 0x7F9), /* Kenya */ - COUNTRY_CHPLAN_ENT("KG", 0x26, 1, 0x7F1), /* Kyrgyzstan */ - COUNTRY_CHPLAN_ENT("KH", 0x26, 1, 0x7F1), /* Cambodia */ - COUNTRY_CHPLAN_ENT("KI", 0x26, 1, 0x000), /* Kiribati */ - COUNTRY_CHPLAN_ENT("KM", 0x26, 1, 0x000), /* Comoros */ - COUNTRY_CHPLAN_ENT("KN", 0x76, 1, 0x000), /* Saint Kitts and Nevis */ - COUNTRY_CHPLAN_ENT("KR", 0x3E, 1, 0x7FB), /* South Korea */ - COUNTRY_CHPLAN_ENT("KW", 0x47, 1, 0x7FB), /* Kuwait */ - COUNTRY_CHPLAN_ENT("KY", 0x76, 1, 0x000), /* Cayman Islands (UK) */ - COUNTRY_CHPLAN_ENT("KZ", 0x26, 1, 0x700), /* Kazakhstan */ - COUNTRY_CHPLAN_ENT("LA", 0x26, 1, 0x000), /* Laos */ - COUNTRY_CHPLAN_ENT("LB", 0x26, 1, 0x7F1), /* Lebanon */ - COUNTRY_CHPLAN_ENT("LC", 0x76, 1, 0x000), /* Saint Lucia */ - COUNTRY_CHPLAN_ENT("LI", 0x26, 1, 0x7FB), /* Liechtenstein */ - COUNTRY_CHPLAN_ENT("LK", 0x26, 1, 0x7F1), /* Sri Lanka */ - COUNTRY_CHPLAN_ENT("LR", 0x26, 1, 0x6B0), /* Liberia */ - COUNTRY_CHPLAN_ENT("LS", 0x26, 1, 0x7F1), /* Lesotho */ - COUNTRY_CHPLAN_ENT("LT", 0x26, 1, 0x7FB), /* Lithuania */ - COUNTRY_CHPLAN_ENT("LU", 0x26, 1, 0x7FB), /* Luxembourg */ - COUNTRY_CHPLAN_ENT("LV", 0x26, 1, 0x7FB), /* Latvia */ - COUNTRY_CHPLAN_ENT("LY", 0x26, 1, 0x000), /* Libya */ - COUNTRY_CHPLAN_ENT("MA", 0x47, 1, 0x7F1), /* Morocco */ - COUNTRY_CHPLAN_ENT("MC", 0x26, 1, 0x7FB), /* Monaco */ - COUNTRY_CHPLAN_ENT("MD", 0x26, 1, 0x7F1), /* Moldova */ - COUNTRY_CHPLAN_ENT("ME", 0x26, 1, 0x7F1), /* Montenegro */ - COUNTRY_CHPLAN_ENT("MF", 0x76, 1, 0x000), /* Saint Martin */ - COUNTRY_CHPLAN_ENT("MG", 0x26, 1, 0x620), /* Madagascar */ - COUNTRY_CHPLAN_ENT("MH", 0x76, 1, 0x000), /* Marshall Islands (USA) */ - COUNTRY_CHPLAN_ENT("MK", 0x26, 1, 0x7F1), /* Republic of Macedonia (FYROM) */ - COUNTRY_CHPLAN_ENT("ML", 0x26, 1, 0x6B0), /* Mali */ - COUNTRY_CHPLAN_ENT("MM", 0x26, 1, 0x000), /* Burma (Myanmar) */ - COUNTRY_CHPLAN_ENT("MN", 0x26, 1, 0x000), /* Mongolia */ - COUNTRY_CHPLAN_ENT("MO", 0x35, 1, 0x600), /* Macau */ - COUNTRY_CHPLAN_ENT("MP", 0x76, 1, 0x000), /* Northern Mariana Islands (USA) */ - COUNTRY_CHPLAN_ENT("MQ", 0x26, 1, 0x640), /* Martinique (France) */ - COUNTRY_CHPLAN_ENT("MR", 0x26, 1, 0x6A0), /* Mauritania */ - COUNTRY_CHPLAN_ENT("MS", 0x26, 1, 0x000), /* Montserrat (UK) */ - COUNTRY_CHPLAN_ENT("MT", 0x26, 1, 0x7FB), /* Malta */ - COUNTRY_CHPLAN_ENT("MU", 0x26, 1, 0x6B0), /* Mauritius */ - COUNTRY_CHPLAN_ENT("MV", 0x47, 1, 0x000), /* Maldives */ - COUNTRY_CHPLAN_ENT("MW", 0x26, 1, 0x6B0), /* Malawi */ - COUNTRY_CHPLAN_ENT("MX", 0x61, 1, 0x7F1), /* Mexico */ - COUNTRY_CHPLAN_ENT("MY", 0x63, 1, 0x7F1), /* Malaysia */ - COUNTRY_CHPLAN_ENT("MZ", 0x26, 1, 0x7F1), /* Mozambique */ - COUNTRY_CHPLAN_ENT("NA", 0x26, 1, 0x700), /* Namibia */ - COUNTRY_CHPLAN_ENT("NC", 0x26, 1, 0x000), /* New Caledonia */ - COUNTRY_CHPLAN_ENT("NE", 0x26, 1, 0x6B0), /* Niger */ - COUNTRY_CHPLAN_ENT("NF", 0x45, 1, 0x000), /* Norfolk Island (Australia) */ - COUNTRY_CHPLAN_ENT("NG", 0x75, 1, 0x7F9), /* Nigeria */ - COUNTRY_CHPLAN_ENT("NI", 0x76, 1, 0x7F1), /* Nicaragua */ - COUNTRY_CHPLAN_ENT("NL", 0x26, 1, 0x7FB), /* Netherlands */ - COUNTRY_CHPLAN_ENT("NO", 0x26, 1, 0x7FB), /* Norway */ - COUNTRY_CHPLAN_ENT("NP", 0x48, 1, 0x6F0), /* Nepal */ - COUNTRY_CHPLAN_ENT("NR", 0x26, 1, 0x000), /* Nauru */ - COUNTRY_CHPLAN_ENT("NU", 0x45, 1, 0x000), /* Niue */ - COUNTRY_CHPLAN_ENT("NZ", 0x45, 1, 0x7FB), /* New Zealand */ - COUNTRY_CHPLAN_ENT("OM", 0x26, 1, 0x7F9), /* Oman */ - COUNTRY_CHPLAN_ENT("PA", 0x76, 1, 0x7F1), /* Panama */ - COUNTRY_CHPLAN_ENT("PE", 0x76, 1, 0x7F1), /* Peru */ - COUNTRY_CHPLAN_ENT("PF", 0x26, 1, 0x000), /* French Polynesia (France) */ - COUNTRY_CHPLAN_ENT("PG", 0x35, 1, 0x7F1), /* Papua New Guinea */ - COUNTRY_CHPLAN_ENT("PH", 0x35, 1, 0x7F1), /* Philippines */ - COUNTRY_CHPLAN_ENT("PK", 0x51, 1, 0x7F1), /* Pakistan */ - COUNTRY_CHPLAN_ENT("PL", 0x26, 1, 0x7FB), /* Poland */ - COUNTRY_CHPLAN_ENT("PM", 0x26, 1, 0x000), /* Saint Pierre and Miquelon (France) */ - COUNTRY_CHPLAN_ENT("PR", 0x76, 1, 0x7F1), /* Puerto Rico */ - COUNTRY_CHPLAN_ENT("PT", 0x26, 1, 0x7FB), /* Portugal */ - COUNTRY_CHPLAN_ENT("PW", 0x76, 1, 0x000), /* Palau */ - COUNTRY_CHPLAN_ENT("PY", 0x76, 1, 0x7F1), /* Paraguay */ - COUNTRY_CHPLAN_ENT("QA", 0x35, 1, 0x7F9), /* Qatar */ - COUNTRY_CHPLAN_ENT("RE", 0x26, 1, 0x000), /* Reunion (France) */ - COUNTRY_CHPLAN_ENT("RO", 0x26, 1, 0x7F1), /* Romania */ - COUNTRY_CHPLAN_ENT("RS", 0x26, 1, 0x7F1), /* Serbia, Kosovo */ - COUNTRY_CHPLAN_ENT("RU", 0x59, 1, 0x7FB), /* Russia(fac/gost), Kaliningrad */ - COUNTRY_CHPLAN_ENT("RW", 0x26, 1, 0x0B0), /* Rwanda */ - COUNTRY_CHPLAN_ENT("SA", 0x35, 1, 0x7FB), /* Saudi Arabia */ - COUNTRY_CHPLAN_ENT("SB", 0x26, 1, 0x000), /* Solomon Islands */ - COUNTRY_CHPLAN_ENT("SC", 0x76, 1, 0x690), /* Seychelles */ - COUNTRY_CHPLAN_ENT("SE", 0x26, 1, 0x7FB), /* Sweden */ - COUNTRY_CHPLAN_ENT("SG", 0x35, 1, 0x7FB), /* Singapore */ - COUNTRY_CHPLAN_ENT("SH", 0x26, 1, 0x000), /* Saint Helena (UK) */ - COUNTRY_CHPLAN_ENT("SI", 0x26, 1, 0x7FB), /* Slovenia */ - COUNTRY_CHPLAN_ENT("SJ", 0x26, 1, 0x000), /* Svalbard (Norway) */ - COUNTRY_CHPLAN_ENT("SK", 0x26, 1, 0x7FB), /* Slovakia */ - COUNTRY_CHPLAN_ENT("SL", 0x26, 1, 0x6B0), /* Sierra Leone */ - COUNTRY_CHPLAN_ENT("SM", 0x26, 1, 0x000), /* San Marino */ - COUNTRY_CHPLAN_ENT("SN", 0x26, 1, 0x7F1), /* Senegal */ - COUNTRY_CHPLAN_ENT("SO", 0x26, 1, 0x000), /* Somalia */ - COUNTRY_CHPLAN_ENT("SR", 0x74, 1, 0x000), /* Suriname */ - COUNTRY_CHPLAN_ENT("ST", 0x76, 1, 0x680), /* Sao Tome and Principe */ - COUNTRY_CHPLAN_ENT("SV", 0x30, 1, 0x7F1), /* El Salvador */ - COUNTRY_CHPLAN_ENT("SX", 0x76, 1, 0x000), /* Sint Marteen */ - COUNTRY_CHPLAN_ENT("SZ", 0x26, 1, 0x020), /* Swaziland */ - COUNTRY_CHPLAN_ENT("TC", 0x26, 1, 0x000), /* Turks and Caicos Islands (UK) */ - COUNTRY_CHPLAN_ENT("TD", 0x26, 1, 0x6B0), /* Chad */ - COUNTRY_CHPLAN_ENT("TF", 0x26, 1, 0x680), /* French Southern and Antarctic Lands (FR Southern Territories) */ - COUNTRY_CHPLAN_ENT("TG", 0x26, 1, 0x6B0), /* Togo */ - COUNTRY_CHPLAN_ENT("TH", 0x35, 1, 0x7F1), /* Thailand */ - COUNTRY_CHPLAN_ENT("TJ", 0x26, 1, 0x640), /* Tajikistan */ - COUNTRY_CHPLAN_ENT("TK", 0x45, 1, 0x000), /* Tokelau */ - COUNTRY_CHPLAN_ENT("TM", 0x26, 1, 0x000), /* Turkmenistan */ - COUNTRY_CHPLAN_ENT("TN", 0x47, 1, 0x7F1), /* Tunisia */ - COUNTRY_CHPLAN_ENT("TO", 0x26, 1, 0x000), /* Tonga */ - COUNTRY_CHPLAN_ENT("TR", 0x26, 1, 0x7F1), /* Turkey, Northern Cyprus */ - COUNTRY_CHPLAN_ENT("TT", 0x76, 1, 0x3F1), /* Trinidad & Tobago */ - COUNTRY_CHPLAN_ENT("TV", 0x21, 0, 0x000), /* Tuvalu */ - COUNTRY_CHPLAN_ENT("TW", 0x76, 1, 0x7FF), /* Taiwan */ - COUNTRY_CHPLAN_ENT("TZ", 0x26, 1, 0x6F0), /* Tanzania */ - COUNTRY_CHPLAN_ENT("UA", 0x36, 1, 0x7FB), /* Ukraine */ - COUNTRY_CHPLAN_ENT("UG", 0x26, 1, 0x6F1), /* Uganda */ - COUNTRY_CHPLAN_ENT("US", 0x76, 1, 0x7FF), /* United States of America (USA) */ - COUNTRY_CHPLAN_ENT("UY", 0x30, 1, 0x7F1), /* Uruguay */ - COUNTRY_CHPLAN_ENT("UZ", 0x47, 1, 0x6F0), /* Uzbekistan */ - COUNTRY_CHPLAN_ENT("VA", 0x26, 1, 0x000), /* Holy See (Vatican City) */ - COUNTRY_CHPLAN_ENT("VC", 0x76, 1, 0x010), /* Saint Vincent and the Grenadines */ - COUNTRY_CHPLAN_ENT("VE", 0x30, 1, 0x7F1), /* Venezuela */ - COUNTRY_CHPLAN_ENT("VG", 0x76, 1, 0x000), /* British Virgin Islands (UK) */ - COUNTRY_CHPLAN_ENT("VI", 0x76, 1, 0x000), /* United States Virgin Islands (USA) */ - COUNTRY_CHPLAN_ENT("VN", 0x35, 1, 0x7F1), /* Vietnam */ - COUNTRY_CHPLAN_ENT("VU", 0x26, 1, 0x000), /* Vanuatu */ - COUNTRY_CHPLAN_ENT("WF", 0x26, 1, 0x000), /* Wallis and Futuna (France) */ - COUNTRY_CHPLAN_ENT("WS", 0x76, 1, 0x000), /* Samoa */ - COUNTRY_CHPLAN_ENT("YE", 0x26, 1, 0x040), /* Yemen */ - COUNTRY_CHPLAN_ENT("YT", 0x26, 1, 0x680), /* Mayotte (France) */ - COUNTRY_CHPLAN_ENT("ZA", 0x35, 1, 0x7F1), /* South Africa */ - COUNTRY_CHPLAN_ENT("ZM", 0x26, 1, 0x6B0), /* Zambia */ - COUNTRY_CHPLAN_ENT("ZW", 0x26, 1, 0x7F1), /* Zimbabwe */ -}; - -/* -* rtw_get_chplan_from_country - -* @country_code: string of country code -* -* Return pointer of struct country_chplan entry or NULL when unsupported country_code is given -*/ -const struct country_chplan *rtw_get_chplan_from_country(const char *country_code) -{ -#if RTW_DEF_MODULE_REGULATORY_CERT - const struct country_chplan *exc_ent = NULL; -#endif - const struct country_chplan *ent = NULL; - const struct country_chplan *map = NULL; - u16 map_sz = 0; - char code[2]; - int i; - - code[0] = alpha_to_upper(country_code[0]); - code[1] = alpha_to_upper(country_code[1]); - -#ifdef CONFIG_CUSTOMIZED_COUNTRY_CHPLAN_MAP - map = CUSTOMIZED_country_chplan_map; - map_sz = sizeof(CUSTOMIZED_country_chplan_map) / sizeof(struct country_chplan); -#else - #if RTW_DEF_MODULE_REGULATORY_CERT - exc_ent = rtw_def_module_get_chplan_from_country(code); - #endif - map = country_chplan_map; - map_sz = sizeof(country_chplan_map) / sizeof(struct country_chplan); -#endif - - for (i = 0; i < map_sz; i++) { - if (strncmp(code, map[i].alpha2, 2) == 0) { - ent = &map[i]; - break; - } - } - - #if RTW_DEF_MODULE_REGULATORY_CERT - if (!ent || !(COUNTRY_CHPLAN_DEF_MODULE_FALGS(ent) & RTW_DEF_MODULE_REGULATORY_CERT)) - exc_ent = ent = NULL; - if (exc_ent) - ent = exc_ent; - #endif - - return ent; -} - -void dump_country_chplan(void *sel, const struct country_chplan *ent) -{ - RTW_PRINT_SEL(sel, "\"%c%c\", 0x%02X%s\n" - , ent->alpha2[0], ent->alpha2[1], ent->chplan - , COUNTRY_CHPLAN_EN_11AC(ent) ? " ac" : "" - ); -} - -void dump_country_chplan_map(void *sel) -{ - const struct country_chplan *ent; - u8 code[2]; - -#if RTW_DEF_MODULE_REGULATORY_CERT - RTW_PRINT_SEL(sel, "RTW_DEF_MODULE_REGULATORY_CERT:0x%x\n", RTW_DEF_MODULE_REGULATORY_CERT); -#endif -#ifdef CONFIG_CUSTOMIZED_COUNTRY_CHPLAN_MAP - RTW_PRINT_SEL(sel, "CONFIG_CUSTOMIZED_COUNTRY_CHPLAN_MAP\n"); -#endif - - for (code[0] = 'A'; code[0] <= 'Z'; code[0]++) { - for (code[1] = 'A'; code[1] <= 'Z'; code[1]++) { - ent = rtw_get_chplan_from_country(code); - if (!ent) - continue; - - dump_country_chplan(sel, ent); - } - } -} - -void dump_chplan_id_list(void *sel) -{ - u8 first = 1; - int i; - - for (i = 0; i < RTW_CHPLAN_MAX; i++) { - if (!rtw_is_channel_plan_valid(i)) - continue; - - if (first) { - RTW_PRINT_SEL(sel, "0x%02X ", i); - first = 0; - } else - _RTW_PRINT_SEL(sel, "0x%02X ", i); - } - - _RTW_PRINT_SEL(sel, "0x7F\n"); -} - -void dump_chplan_test(void *sel) -{ - int i, j; - - /* check invalid channel */ - for (i = 0; i < RTW_RD_2G_MAX; i++) { - for (j = 0; j < CH_LIST_LEN(RTW_ChannelPlan2G[i]); j++) { - if (rtw_ch2freq(CH_LIST_CH(RTW_ChannelPlan2G[i], j)) == 0) - RTW_PRINT_SEL(sel, "invalid ch:%u at (%d,%d)\n", CH_LIST_CH(RTW_ChannelPlan2G[i], j), i, j); - } - } - -#ifdef CONFIG_IEEE80211_BAND_5GHZ - for (i = 0; i < RTW_RD_5G_MAX; i++) { - for (j = 0; j < CH_LIST_LEN(RTW_ChannelPlan5G[i]); j++) { - if (rtw_ch2freq(CH_LIST_CH(RTW_ChannelPlan5G[i], j)) == 0) - RTW_PRINT_SEL(sel, "invalid ch:%u at (%d,%d)\n", CH_LIST_CH(RTW_ChannelPlan5G[i], j), i, j); - } - } -#endif -} - -void dump_chplan_ver(void *sel) -{ - RTW_PRINT_SEL(sel, "%s-%s\n", RTW_DOMAIN_MAP_VER, RTW_COUNTRY_MAP_VER); -} diff --git a/drivers/net/wireless/realtek/rtl8812au/core/rtw_chplan.h b/drivers/net/wireless/realtek/rtl8812au/core/rtw_chplan.h deleted file mode 100644 index cdf9f75b284f96..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/core/rtw_chplan.h +++ /dev/null @@ -1,181 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2018 Realtek Corporation. - * - * 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 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 __RTW_CHPLAN_H__ -#define __RTW_CHPLAN_H__ - -enum rtw_chplan_id { - /* ===== 0x00 ~ 0x1F, legacy channel plan ===== */ - RTW_CHPLAN_FCC = 0x00, - RTW_CHPLAN_IC = 0x01, - RTW_CHPLAN_ETSI = 0x02, - RTW_CHPLAN_SPAIN = 0x03, - RTW_CHPLAN_FRANCE = 0x04, - RTW_CHPLAN_MKK = 0x05, - RTW_CHPLAN_MKK1 = 0x06, - RTW_CHPLAN_ISRAEL = 0x07, - RTW_CHPLAN_TELEC = 0x08, - RTW_CHPLAN_GLOBAL_DOAMIN = 0x09, - RTW_CHPLAN_WORLD_WIDE_13 = 0x0A, - RTW_CHPLAN_TAIWAN = 0x0B, - RTW_CHPLAN_CHINA = 0x0C, - RTW_CHPLAN_SINGAPORE_INDIA_MEXICO = 0x0D, - RTW_CHPLAN_KOREA = 0x0E, - RTW_CHPLAN_TURKEY = 0x0F, - RTW_CHPLAN_JAPAN = 0x10, - RTW_CHPLAN_FCC_NO_DFS = 0x11, - RTW_CHPLAN_JAPAN_NO_DFS = 0x12, - RTW_CHPLAN_WORLD_WIDE_5G = 0x13, - RTW_CHPLAN_TAIWAN_NO_DFS = 0x14, - - /* ===== 0x20 ~ 0x7F, new channel plan ===== */ - RTW_CHPLAN_WORLD_NULL = 0x20, - RTW_CHPLAN_ETSI1_NULL = 0x21, - RTW_CHPLAN_FCC1_NULL = 0x22, - RTW_CHPLAN_MKK1_NULL = 0x23, - RTW_CHPLAN_ETSI2_NULL = 0x24, - RTW_CHPLAN_FCC1_FCC1 = 0x25, - RTW_CHPLAN_WORLD_ETSI1 = 0x26, - RTW_CHPLAN_MKK1_MKK1 = 0x27, - RTW_CHPLAN_WORLD_KCC1 = 0x28, - RTW_CHPLAN_WORLD_FCC2 = 0x29, - RTW_CHPLAN_FCC2_NULL = 0x2A, - RTW_CHPLAN_IC1_IC2 = 0x2B, - RTW_CHPLAN_MKK2_NULL = 0x2C, - RTW_CHPLAN_WORLD_CHILE1= 0x2D, - RTW_CHPLAN_WORLD1_WORLD1 = 0x2E, - RTW_CHPLAN_WORLD_CHILE2 = 0x2F, - RTW_CHPLAN_WORLD_FCC3 = 0x30, - RTW_CHPLAN_WORLD_FCC4 = 0x31, - RTW_CHPLAN_WORLD_FCC5 = 0x32, - RTW_CHPLAN_WORLD_FCC6 = 0x33, - RTW_CHPLAN_FCC1_FCC7 = 0x34, - RTW_CHPLAN_WORLD_ETSI2 = 0x35, - RTW_CHPLAN_WORLD_ETSI3 = 0x36, - RTW_CHPLAN_MKK1_MKK2 = 0x37, - RTW_CHPLAN_MKK1_MKK3 = 0x38, - RTW_CHPLAN_FCC1_NCC1 = 0x39, - RTW_CHPLAN_ETSI1_ETSI1 = 0x3A, - RTW_CHPLAN_ETSI1_ACMA1 = 0x3B, - RTW_CHPLAN_ETSI1_ETSI6 = 0x3C, - RTW_CHPLAN_ETSI1_ETSI12 = 0x3D, - RTW_CHPLAN_KCC1_KCC2 = 0x3E, - RTW_CHPLAN_FCC1_FCC11 = 0x3F, - RTW_CHPLAN_FCC1_NCC2 = 0x40, - RTW_CHPLAN_GLOBAL_NULL = 0x41, - RTW_CHPLAN_ETSI1_ETSI4 = 0x42, - RTW_CHPLAN_FCC1_FCC2 = 0x43, - RTW_CHPLAN_FCC1_NCC3 = 0x44, - RTW_CHPLAN_WORLD_ACMA1 = 0x45, - RTW_CHPLAN_FCC1_FCC8 = 0x46, - RTW_CHPLAN_WORLD_ETSI6 = 0x47, - RTW_CHPLAN_WORLD_ETSI7 = 0x48, - RTW_CHPLAN_WORLD_ETSI8 = 0x49, - RTW_CHPLAN_IC2_IC2 = 0x4A, - RTW_CHPLAN_WORLD_ETSI9 = 0x50, - RTW_CHPLAN_WORLD_ETSI10 = 0x51, - RTW_CHPLAN_WORLD_ETSI11 = 0x52, - RTW_CHPLAN_FCC1_NCC4 = 0x53, - RTW_CHPLAN_WORLD_ETSI12 = 0x54, - RTW_CHPLAN_FCC1_FCC9 = 0x55, - RTW_CHPLAN_WORLD_ETSI13 = 0x56, - RTW_CHPLAN_FCC1_FCC10 = 0x57, - RTW_CHPLAN_MKK2_MKK4 = 0x58, - RTW_CHPLAN_WORLD_ETSI14 = 0x59, - RTW_CHPLAN_FCC1_FCC5 = 0x60, - RTW_CHPLAN_FCC2_FCC7 = 0x61, - RTW_CHPLAN_FCC2_FCC1 = 0x62, - RTW_CHPLAN_WORLD_ETSI15 = 0x63, - RTW_CHPLAN_MKK2_MKK5 = 0x64, - RTW_CHPLAN_ETSI1_ETSI16 = 0x65, - RTW_CHPLAN_FCC1_FCC14 = 0x66, - RTW_CHPLAN_FCC1_FCC12 = 0x67, - RTW_CHPLAN_FCC2_FCC14 = 0x68, - RTW_CHPLAN_FCC2_FCC12 = 0x69, - RTW_CHPLAN_ETSI1_ETSI17 = 0x6A, - RTW_CHPLAN_WORLD_FCC16 = 0x6B, - RTW_CHPLAN_WORLD_FCC13 = 0x6C, - RTW_CHPLAN_FCC2_FCC15 = 0x6D, - RTW_CHPLAN_WORLD_FCC12 = 0x6E, - RTW_CHPLAN_NULL_ETSI8 = 0x6F, - RTW_CHPLAN_NULL_ETSI18 = 0x70, - RTW_CHPLAN_NULL_ETSI17 = 0x71, - RTW_CHPLAN_NULL_ETSI19 = 0x72, - RTW_CHPLAN_WORLD_FCC7 = 0x73, - RTW_CHPLAN_FCC2_FCC17 = 0x74, - RTW_CHPLAN_WORLD_ETSI20 = 0x75, - RTW_CHPLAN_FCC2_FCC11 = 0x76, - RTW_CHPLAN_WORLD_ETSI21 = 0x77, - RTW_CHPLAN_FCC1_FCC18 = 0x78, - RTW_CHPLAN_MKK2_MKK1 = 0x79, - - RTW_CHPLAN_MAX, - RTW_CHPLAN_REALTEK_DEFINE = 0x7F, - RTW_CHPLAN_UNSPECIFIED = 0xFF, -}; - -u8 rtw_chplan_get_default_regd(u8 id); -bool rtw_chplan_is_empty(u8 id); -#define rtw_is_channel_plan_valid(chplan) (((chplan) < RTW_CHPLAN_MAX || (chplan) == RTW_CHPLAN_REALTEK_DEFINE) && !rtw_chplan_is_empty(chplan)) -#define rtw_is_legacy_channel_plan(chplan) ((chplan) < 0x20) - -struct _RT_CHANNEL_INFO; -u8 init_channel_set(_adapter *padapter, u8 ChannelPlan, struct _RT_CHANNEL_INFO *channel_set); - -#define IS_ALPHA2_NO_SPECIFIED(_alpha2) ((*((u16 *)(_alpha2))) == 0xFFFF) - -#define RTW_MODULE_RTL8821AE_HMC_M2 BIT0 /* RTL8821AE(HMC + M.2) */ -#define RTW_MODULE_RTL8821AU BIT1 /* RTL8821AU */ -#define RTW_MODULE_RTL8812AENF_NGFF BIT2 /* RTL8812AENF(8812AE+8761)_NGFF */ -#define RTW_MODULE_RTL8812AEBT_HMC BIT3 /* RTL8812AEBT(8812AE+8761)_HMC */ -#define RTW_MODULE_RTL8188EE_HMC_M2 BIT4 /* RTL8188EE(HMC + M.2) */ -#define RTW_MODULE_RTL8723BE_HMC_M2 BIT5 /* RTL8723BE(HMC + M.2) */ -#define RTW_MODULE_RTL8723BS_NGFF1216 BIT6 /* RTL8723BS(NGFF1216) */ -#define RTW_MODULE_RTL8192EEBT_HMC_M2 BIT7 /* RTL8192EEBT(8192EE+8761AU)_(HMC + M.2) */ -#define RTW_MODULE_RTL8723DE_NGFF1630 BIT8 /* RTL8723DE(NGFF1630) */ -#define RTW_MODULE_RTL8822BE BIT9 /* RTL8822BE */ -#define RTW_MODULE_RTL8821CE BIT10 /* RTL8821CE */ - -struct country_chplan { - char alpha2[2]; - u8 chplan; -#ifdef CONFIG_80211AC_VHT - u8 en_11ac; -#endif -#if RTW_DEF_MODULE_REGULATORY_CERT - u16 def_module_flags; /* RTW_MODULE_RTLXXX */ -#endif -}; - -#ifdef CONFIG_80211AC_VHT -#define COUNTRY_CHPLAN_EN_11AC(_ent) ((_ent)->en_11ac) -#else -#define COUNTRY_CHPLAN_EN_11AC(_ent) 0 -#endif - -#if RTW_DEF_MODULE_REGULATORY_CERT -#define COUNTRY_CHPLAN_DEF_MODULE_FALGS(_ent) ((_ent)->def_module_flags) -#else -#define COUNTRY_CHPLAN_DEF_MODULE_FALGS(_ent) 0 -#endif - -const struct country_chplan *rtw_get_chplan_from_country(const char *country_code); - -void dump_country_chplan(void *sel, const struct country_chplan *ent); -void dump_country_chplan_map(void *sel); -void dump_chplan_id_list(void *sel); -void dump_chplan_test(void *sel); -void dump_chplan_ver(void *sel); - -#endif /* __RTW_CHPLAN_H__ */ diff --git a/drivers/net/wireless/realtek/rtl8812au/core/rtw_ioctl_rtl.c b/drivers/net/wireless/realtek/rtl8812au/core/rtw_ioctl_rtl.c deleted file mode 100644 index 5d9e76b604f58a..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/core/rtw_ioctl_rtl.c +++ /dev/null @@ -1,901 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2017 Realtek Corporation. - * - * 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 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 _RTW_IOCTL_RTL_C_ - -#include - -#ifdef CONFIG_MP_INCLUDED - #include -#endif - -struct oid_obj_priv oid_rtl_seg_01_01[] = { - {1, &oid_null_function}, /* 0x80 */ - {1, &oid_null_function}, /* 0x81 */ - {1, &oid_null_function}, /* 0x82 */ - {1, &oid_null_function}, /* 0x83 */ /* OID_RT_SET_SNIFFER_MODE */ - {1, &oid_rt_get_signal_quality_hdl}, /* 0x84 */ - {1, &oid_rt_get_small_packet_crc_hdl}, /* 0x85 */ - {1, &oid_rt_get_middle_packet_crc_hdl}, /* 0x86 */ - {1, &oid_rt_get_large_packet_crc_hdl}, /* 0x87 */ - {1, &oid_rt_get_tx_retry_hdl}, /* 0x88 */ - {1, &oid_rt_get_rx_retry_hdl}, /* 0x89 */ - {1, &oid_rt_pro_set_fw_dig_state_hdl}, /* 0x8A */ - {1, &oid_rt_pro_set_fw_ra_state_hdl} , /* 0x8B */ - {1, &oid_null_function}, /* 0x8C */ - {1, &oid_null_function}, /* 0x8D */ - {1, &oid_null_function}, /* 0x8E */ - {1, &oid_null_function}, /* 0x8F */ - {1, &oid_rt_get_rx_total_packet_hdl}, /* 0x90 */ - {1, &oid_rt_get_tx_beacon_ok_hdl}, /* 0x91 */ - {1, &oid_rt_get_tx_beacon_err_hdl}, /* 0x92 */ - {1, &oid_rt_get_rx_icv_err_hdl}, /* 0x93 */ - {1, &oid_rt_set_encryption_algorithm_hdl}, /* 0x94 */ - {1, &oid_null_function}, /* 0x95 */ - {1, &oid_rt_get_preamble_mode_hdl}, /* 0x96 */ - {1, &oid_null_function}, /* 0x97 */ - {1, &oid_rt_get_ap_ip_hdl}, /* 0x98 */ - {1, &oid_rt_get_channelplan_hdl}, /* 0x99 */ - {1, &oid_rt_set_preamble_mode_hdl}, /* 0x9A */ - {1, &oid_rt_set_bcn_intvl_hdl}, /* 0x9B */ - {1, &oid_null_function}, /* 0x9C */ - {1, &oid_rt_dedicate_probe_hdl}, /* 0x9D */ - {1, &oid_null_function}, /* 0x9E */ - {1, &oid_null_function}, /* 0x9F */ - {1, &oid_null_function}, /* 0xA0 */ - {1, &oid_null_function}, /* 0xA1 */ - {1, &oid_null_function}, /* 0xA2 */ - {1, &oid_null_function}, /* 0xA3 */ - {1, &oid_null_function}, /* 0xA4 */ - {1, &oid_null_function}, /* 0xA5 */ - {1, &oid_null_function}, /* 0xA6 */ - {1, &oid_rt_get_total_tx_bytes_hdl}, /* 0xA7 */ - {1, &oid_rt_get_total_rx_bytes_hdl}, /* 0xA8 */ - {1, &oid_rt_current_tx_power_level_hdl}, /* 0xA9 */ - {1, &oid_rt_get_enc_key_mismatch_count_hdl}, /* 0xAA */ - {1, &oid_rt_get_enc_key_match_count_hdl}, /* 0xAB */ - {1, &oid_rt_get_channel_hdl}, /* 0xAC */ - {1, &oid_rt_set_channelplan_hdl}, /* 0xAD */ - {1, &oid_rt_get_hardware_radio_off_hdl}, /* 0xAE */ - {1, &oid_null_function}, /* 0xAF */ - {1, &oid_null_function}, /* 0xB0 */ - {1, &oid_null_function}, /* 0xB1 */ - {1, &oid_null_function}, /* 0xB2 */ - {1, &oid_null_function}, /* 0xB3 */ - {1, &oid_rt_get_key_mismatch_hdl}, /* 0xB4 */ - {1, &oid_null_function}, /* 0xB5 */ - {1, &oid_null_function}, /* 0xB6 */ - {1, &oid_null_function}, /* 0xB7 */ - {1, &oid_null_function}, /* 0xB8 */ - {1, &oid_null_function}, /* 0xB9 */ - {1, &oid_null_function}, /* 0xBA */ - {1, &oid_rt_supported_wireless_mode_hdl}, /* 0xBB */ - {1, &oid_rt_get_channel_list_hdl}, /* 0xBC */ - {1, &oid_rt_get_scan_in_progress_hdl}, /* 0xBD */ - {1, &oid_null_function}, /* 0xBE */ - {1, &oid_null_function}, /* 0xBF */ - {1, &oid_null_function}, /* 0xC0 */ - {1, &oid_rt_forced_data_rate_hdl}, /* 0xC1 */ - {1, &oid_rt_wireless_mode_for_scan_list_hdl}, /* 0xC2 */ - {1, &oid_rt_get_bss_wireless_mode_hdl}, /* 0xC3 */ - {1, &oid_rt_scan_with_magic_packet_hdl}, /* 0xC4 */ - {1, &oid_null_function}, /* 0xC5 */ - {1, &oid_null_function}, /* 0xC6 */ - {1, &oid_null_function}, /* 0xC7 */ - {1, &oid_null_function}, /* 0xC8 */ - {1, &oid_null_function}, /* 0xC9 */ - {1, &oid_null_function}, /* 0xCA */ - {1, &oid_null_function}, /* 0xCB */ - {1, &oid_null_function}, /* 0xCC */ - {1, &oid_null_function}, /* 0xCD */ - {1, &oid_null_function}, /* 0xCE */ - {1, &oid_null_function}, /* 0xCF */ - -}; - -struct oid_obj_priv oid_rtl_seg_01_03[] = { - {1, &oid_rt_ap_get_associated_station_list_hdl}, /* 0x00 */ - {1, &oid_null_function}, /* 0x01 */ - {1, &oid_rt_ap_switch_into_ap_mode_hdl}, /* 0x02 */ - {1, &oid_null_function}, /* 0x03 */ - {1, &oid_rt_ap_supported_hdl}, /* 0x04 */ - {1, &oid_rt_ap_set_passphrase_hdl}, /* 0x05 */ - -}; - -struct oid_obj_priv oid_rtl_seg_01_11[] = { - {1, &oid_null_function}, /* 0xC0 OID_RT_PRO_RX_FILTER */ - {1, &oid_null_function}, /* 0xC1 OID_CE_USB_WRITE_REGISTRY */ - {1, &oid_null_function}, /* 0xC2 OID_CE_USB_READ_REGISTRY */ - {1, &oid_null_function}, /* 0xC3 OID_RT_PRO_SET_INITIAL_GAIN */ - {1, &oid_null_function}, /* 0xC4 OID_RT_PRO_SET_BB_RF_STANDBY_MODE */ - {1, &oid_null_function}, /* 0xC5 OID_RT_PRO_SET_BB_RF_SHUTDOWN_MODE */ - {1, &oid_null_function}, /* 0xC6 OID_RT_PRO_SET_TX_CHARGE_PUMP */ - {1, &oid_null_function}, /* 0xC7 OID_RT_PRO_SET_RX_CHARGE_PUMP */ - {1, &oid_rt_pro_rf_write_registry_hdl}, /* 0xC8 */ - {1, &oid_rt_pro_rf_read_registry_hdl}, /* 0xC9 */ - {1, &oid_null_function} /* 0xCA OID_RT_PRO_QUERY_RF_TYPE */ - -}; - -struct oid_obj_priv oid_rtl_seg_03_00[] = { - {1, &oid_null_function}, /* 0x00 */ - {1, &oid_rt_get_connect_state_hdl}, /* 0x01 */ - {1, &oid_null_function}, /* 0x02 */ - {1, &oid_null_function}, /* 0x03 */ - {1, &oid_rt_set_default_key_id_hdl}, /* 0x04 */ - - -}; - - -/* ************** oid_rtl_seg_01_01 section start ************** */ - -NDIS_STATUS oid_rt_pro_set_fw_dig_state_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - _irqL oldirql; - - - if (poid_par_priv->type_of_oid != SET_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - _irqlevel_changed_(&oldirql, LOWER); - if (poid_par_priv->information_buf_len >= sizeof(struct setdig_parm)) { - /* DEBUG_ERR(("===> oid_rt_pro_set_fw_dig_state_hdl. type:0x%02x.\n",*((unsigned char*)poid_par_priv->information_buf ))); */ - if (!rtw_setfwdig_cmd(Adapter, *((unsigned char *)poid_par_priv->information_buf))) - status = NDIS_STATUS_NOT_ACCEPTED; - - } else - status = NDIS_STATUS_NOT_ACCEPTED; - _irqlevel_changed_(&oldirql, RAISE); -#endif - return status; -} -/* ----------------------------------------------------------------------------- */ -NDIS_STATUS oid_rt_pro_set_fw_ra_state_hdl(struct oid_par_priv *poid_par_priv) -{ - - NDIS_STATUS status = NDIS_STATUS_SUCCESS; -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - _irqL oldirql; - - if (poid_par_priv->type_of_oid != SET_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - - _irqlevel_changed_(&oldirql, LOWER); - - if (poid_par_priv->information_buf_len >= sizeof(struct setra_parm)) { - /* DEBUG_ERR(("===> oid_rt_pro_set_fw_ra_state_hdl. type:0x%02x.\n",*((unsigned char*)poid_par_priv->information_buf ))); */ - if (!rtw_setfwra_cmd(Adapter, *((unsigned char *)poid_par_priv->information_buf))) - status = NDIS_STATUS_NOT_ACCEPTED; - - } else - status = NDIS_STATUS_NOT_ACCEPTED; - _irqlevel_changed_(&oldirql, RAISE); -#endif - return status; -} -/* ----------------------------------------------------------------------------- */ -NDIS_STATUS oid_rt_get_signal_quality_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - /* DEBUG_ERR(("<**********************oid_rt_get_signal_quality_hdl\n")); */ - if (poid_par_priv->type_of_oid != QUERY_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - -#if 0 - if (pMgntInfo->mAssoc || pMgntInfo->mIbss) { - ulInfo = pAdapter->RxStats.SignalQuality; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } else { - ulInfo = 0xffffffff; /* It stands for -1 in 4-byte integer. */ - } - break; -#endif - - return status; -} - -/* ------------------------------------------------------------------------------ */ - -NDIS_STATUS oid_rt_get_small_packet_crc_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if (poid_par_priv->type_of_oid != QUERY_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - if (poid_par_priv->information_buf_len >= sizeof(ULONG)) { - *(ULONG *)poid_par_priv->information_buf = padapter->recvpriv.rx_smallpacket_crcerr; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } else - status = NDIS_STATUS_INVALID_LENGTH; - - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_get_middle_packet_crc_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if (poid_par_priv->type_of_oid != QUERY_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - if (poid_par_priv->information_buf_len >= sizeof(ULONG)) { - *(ULONG *)poid_par_priv->information_buf = padapter->recvpriv.rx_middlepacket_crcerr; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } else - status = NDIS_STATUS_INVALID_LENGTH; - - - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_get_large_packet_crc_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if (poid_par_priv->type_of_oid != QUERY_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - if (poid_par_priv->information_buf_len >= sizeof(ULONG)) { - *(ULONG *)poid_par_priv->information_buf = padapter->recvpriv.rx_largepacket_crcerr; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } else - status = NDIS_STATUS_INVALID_LENGTH; - - - return status; -} - -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_get_tx_retry_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if (poid_par_priv->type_of_oid != QUERY_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} -NDIS_STATUS oid_rt_get_rx_retry_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if (poid_par_priv->type_of_oid != QUERY_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_get_rx_total_packet_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if (poid_par_priv->type_of_oid != QUERY_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - if (poid_par_priv->information_buf_len >= sizeof(ULONG)) { - *(u64 *)poid_par_priv->information_buf = padapter->recvpriv.rx_pkts + padapter->recvpriv.rx_drop; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } else - status = NDIS_STATUS_INVALID_LENGTH; - - - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_get_tx_beacon_ok_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if (poid_par_priv->type_of_oid != QUERY_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} -NDIS_STATUS oid_rt_get_tx_beacon_err_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if (poid_par_priv->type_of_oid != QUERY_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_get_rx_icv_err_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if (poid_par_priv->type_of_oid != QUERY_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - if (poid_par_priv->information_buf_len >= sizeof(u32)) { - /* _rtw_memcpy(*(uint *)poid_par_priv->information_buf,padapter->recvpriv.rx_icv_err,sizeof(u32)); */ - *(uint *)poid_par_priv->information_buf = padapter->recvpriv.rx_icv_err; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } else - status = NDIS_STATUS_INVALID_LENGTH ; - - - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_set_encryption_algorithm_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if (poid_par_priv->type_of_oid != SET_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_get_preamble_mode_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - ULONG preamblemode = 0 ; - - if (poid_par_priv->type_of_oid != QUERY_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - if (poid_par_priv->information_buf_len >= sizeof(ULONG)) { - if (padapter->registrypriv.preamble == PREAMBLE_LONG) - preamblemode = 0; - else if (padapter->registrypriv.preamble == PREAMBLE_AUTO) - preamblemode = 1; - else if (padapter->registrypriv.preamble == PREAMBLE_SHORT) - preamblemode = 2; - - - *(ULONG *)poid_par_priv->information_buf = preamblemode ; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } else - status = NDIS_STATUS_INVALID_LENGTH ; - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_get_ap_ip_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if (poid_par_priv->type_of_oid != QUERY_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} - -NDIS_STATUS oid_rt_get_channelplan_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - struct rf_ctl_t *rfctl = adapter_to_rfctl(padapter); - - if (poid_par_priv->type_of_oid != QUERY_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - *(u16 *)poid_par_priv->information_buf = rfctl->ChannelPlan; - - return status; -} -NDIS_STATUS oid_rt_set_channelplan_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - struct rf_ctl_t *rfctl = adapter_to_rfctl(padapter); - - if (poid_par_priv->type_of_oid != SET_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - rfctl->ChannelPlan = *(u16 *)poid_par_priv->information_buf; - - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_set_preamble_mode_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - ULONG preamblemode = 0; - if (poid_par_priv->type_of_oid != SET_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - if (poid_par_priv->information_buf_len >= sizeof(ULONG)) { - preamblemode = *(ULONG *)poid_par_priv->information_buf ; - if (preamblemode == 0) - padapter->registrypriv.preamble = PREAMBLE_LONG; - else if (preamblemode == 1) - padapter->registrypriv.preamble = PREAMBLE_AUTO; - else if (preamblemode == 2) - padapter->registrypriv.preamble = PREAMBLE_SHORT; - - *(ULONG *)poid_par_priv->information_buf = preamblemode ; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } else - status = NDIS_STATUS_INVALID_LENGTH ; - - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_set_bcn_intvl_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if (poid_par_priv->type_of_oid != SET_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} -NDIS_STATUS oid_rt_dedicate_probe_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_get_total_tx_bytes_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if (poid_par_priv->type_of_oid != QUERY_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - if (poid_par_priv->information_buf_len >= sizeof(ULONG)) { - *(u64 *)poid_par_priv->information_buf = padapter->xmitpriv.tx_bytes; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } else - status = NDIS_STATUS_INVALID_LENGTH ; - - - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_get_total_rx_bytes_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if (poid_par_priv->type_of_oid != QUERY_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - if (poid_par_priv->information_buf_len >= sizeof(ULONG)) { - /* _rtw_memcpy(*(uint *)poid_par_priv->information_buf,padapter->recvpriv.rx_icv_err,sizeof(u32)); */ - *(u64 *)poid_par_priv->information_buf = padapter->recvpriv.rx_bytes; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } else - status = NDIS_STATUS_INVALID_LENGTH ; - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_current_tx_power_level_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - return status; -} -NDIS_STATUS oid_rt_get_enc_key_mismatch_count_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if (poid_par_priv->type_of_oid != QUERY_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} -NDIS_STATUS oid_rt_get_enc_key_match_count_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if (poid_par_priv->type_of_oid != QUERY_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} -NDIS_STATUS oid_rt_get_channel_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - NDIS_802_11_CONFIGURATION *pnic_Config; - - ULONG channelnum; - - if (poid_par_priv->type_of_oid != QUERY_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - if ((check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) || - (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) - pnic_Config = &pmlmepriv->cur_network.network.Configuration; - else - pnic_Config = &padapter->registrypriv.dev_network.Configuration; - - channelnum = pnic_Config->DSConfig; - *(ULONG *)poid_par_priv->information_buf = channelnum; - - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - - - - - return status; -} -NDIS_STATUS oid_rt_get_hardware_radio_off_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if (poid_par_priv->type_of_oid != QUERY_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} -NDIS_STATUS oid_rt_get_key_mismatch_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if (poid_par_priv->type_of_oid != QUERY_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} -NDIS_STATUS oid_rt_supported_wireless_mode_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - ULONG ulInfo = 0 ; - /* DEBUG_ERR(("<**********************oid_rt_supported_wireless_mode_hdl\n")); */ - if (poid_par_priv->type_of_oid != QUERY_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - if (poid_par_priv->information_buf_len >= sizeof(ULONG)) { - ulInfo |= 0x0100; /* WIRELESS_MODE_B */ - ulInfo |= 0x0200; /* WIRELESS_MODE_G */ - ulInfo |= 0x0400; /* WIRELESS_MODE_A */ - - *(ULONG *) poid_par_priv->information_buf = ulInfo; - /* DEBUG_ERR(("<===oid_rt_supported_wireless_mode %x\n",ulInfo)); */ - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } else - status = NDIS_STATUS_INVALID_LENGTH; - - return status; -} -NDIS_STATUS oid_rt_get_channel_list_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if (poid_par_priv->type_of_oid != QUERY_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} -NDIS_STATUS oid_rt_get_scan_in_progress_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if (poid_par_priv->type_of_oid != QUERY_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} - - -NDIS_STATUS oid_rt_forced_data_rate_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - return status; -} -NDIS_STATUS oid_rt_wireless_mode_for_scan_list_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - return status; -} -NDIS_STATUS oid_rt_get_bss_wireless_mode_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if (poid_par_priv->type_of_oid != QUERY_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} - -NDIS_STATUS oid_rt_scan_with_magic_packet_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - return status; -} -/* ************** oid_rtl_seg_01_01 section end ************** */ - -/* ************** oid_rtl_seg_01_03 section start ************** */ -NDIS_STATUS oid_rt_ap_get_associated_station_list_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if (poid_par_priv->type_of_oid != QUERY_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} -NDIS_STATUS oid_rt_ap_switch_into_ap_mode_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - return status; -} -NDIS_STATUS oid_rt_ap_supported_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - return status; -} -NDIS_STATUS oid_rt_ap_set_passphrase_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if (poid_par_priv->type_of_oid != SET_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} - -/* ************** oid_rtl_seg_01_03 section end ************** */ - -/* **************** oid_rtl_seg_01_11 section start **************** */ -NDIS_STATUS oid_rt_pro_rf_write_registry_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - _irqL oldirql; - /* DEBUG_ERR(("<**********************oid_rt_pro_rf_write_registry_hdl\n")); */ - if (poid_par_priv->type_of_oid != SET_OID) { /* QUERY_OID */ - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - _irqlevel_changed_(&oldirql, LOWER); - if (poid_par_priv->information_buf_len == (sizeof(unsigned long) * 3)) { - /* RegOffsetValue - The offset of RF register to write. */ - /* RegDataWidth - The data width of RF register to write. */ - /* RegDataValue - The value to write. */ - /* RegOffsetValue = *((unsigned long*)InformationBuffer); */ - /* RegDataWidth = *((unsigned long*)InformationBuffer+1); */ - /* RegDataValue = *((unsigned long*)InformationBuffer+2); */ - if (!rtw_setrfreg_cmd(Adapter, - *(unsigned char *)poid_par_priv->information_buf, - (unsigned long)(*((unsigned long *)poid_par_priv->information_buf + 2)))) - status = NDIS_STATUS_NOT_ACCEPTED; - - } else - status = NDIS_STATUS_INVALID_LENGTH; - _irqlevel_changed_(&oldirql, RAISE); - - return status; -} - -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_rf_read_registry_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - _irqL oldirql; - - /* DEBUG_ERR(("<**********************oid_rt_pro_rf_read_registry_hdl\n")); */ - if (poid_par_priv->type_of_oid != SET_OID) { /* QUERY_OID */ - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - _irqlevel_changed_(&oldirql, LOWER); - if (poid_par_priv->information_buf_len == (sizeof(unsigned long) * 3)) { - if (Adapter->mppriv.act_in_progress == _TRUE) - status = NDIS_STATUS_NOT_ACCEPTED; - else { - /* init workparam */ - Adapter->mppriv.act_in_progress = _TRUE; - Adapter->mppriv.workparam.bcompleted = _FALSE; - Adapter->mppriv.workparam.act_type = MPT_READ_RF; - Adapter->mppriv.workparam.io_offset = *(unsigned long *)poid_par_priv->information_buf; - Adapter->mppriv.workparam.io_value = 0xcccccccc; - - /* RegOffsetValue - The offset of RF register to read. */ - /* RegDataWidth - The data width of RF register to read. */ - /* RegDataValue - The value to read. */ - /* RegOffsetValue = *((unsigned long*)InformationBuffer); */ - /* RegDataWidth = *((unsigned long*)InformationBuffer+1); */ - /* RegDataValue = *((unsigned long*)InformationBuffer+2); */ - if (!rtw_getrfreg_cmd(Adapter, - *(unsigned char *)poid_par_priv->information_buf, - (unsigned char *)&Adapter->mppriv.workparam.io_value)) - status = NDIS_STATUS_NOT_ACCEPTED; - } - - - } else - status = NDIS_STATUS_INVALID_LENGTH; - _irqlevel_changed_(&oldirql, RAISE); -#endif - return status; -} - -/* **************** oid_rtl_seg_01_11 section end**************** */ - - -/* ************** oid_rtl_seg_03_00 section start ************** */ -enum _CONNECT_STATE_ { - CHECKINGSTATUS, - ASSOCIATED, - ADHOCMODE, - NOTASSOCIATED -}; - -NDIS_STATUS oid_rt_get_connect_state_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - struct mlme_priv *pmlmepriv = &(padapter->mlmepriv); - - ULONG ulInfo; - - if (poid_par_priv->type_of_oid != QUERY_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - /* nStatus==0 CheckingStatus */ - /* nStatus==1 Associated */ - /* nStatus==2 AdHocMode */ - /* nStatus==3 NotAssociated */ - - if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING) == _TRUE) - ulInfo = CHECKINGSTATUS; - else if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) - ulInfo = ASSOCIATED; - else if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) - ulInfo = ADHOCMODE; - else - ulInfo = NOTASSOCIATED ; - - *(ULONG *)poid_par_priv->information_buf = ulInfo; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - -#if 0 - /* Rearrange the order to let the UI still shows connection when scan is in progress */ - if (pMgntInfo->mAssoc) - ulInfo = 1; - else if (pMgntInfo->mIbss) - ulInfo = 2; - else if (pMgntInfo->bScanInProgress) - ulInfo = 0; - else - ulInfo = 3; - ulInfoLen = sizeof(ULONG); -#endif - - return status; -} - -NDIS_STATUS oid_rt_set_default_key_id_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - if (poid_par_priv->type_of_oid != SET_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - return status; -} -/* ************** oid_rtl_seg_03_00 section end ************** */ diff --git a/drivers/net/wireless/realtek/rtl8812au/core/rtw_mp_ioctl.c b/drivers/net/wireless/realtek/rtl8812au/core/rtw_mp_ioctl.c deleted file mode 100644 index 4c90d9480a2ab7..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/core/rtw_mp_ioctl.c +++ /dev/null @@ -1,2382 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2017 Realtek Corporation. - * - * 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 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 _RTW_MP_IOCTL_C_ - -#include -#include -#include "../hal/phydm/phydm_precomp.h" - -/* **************** oid_rtl_seg_81_85 section start **************** */ -NDIS_STATUS oid_rt_wireless_mode_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - - if (poid_par_priv->information_buf_len < sizeof(u8)) - return NDIS_STATUS_INVALID_LENGTH; - - if (poid_par_priv->type_of_oid == SET_OID) - Adapter->registrypriv.wireless_mode = *(u8 *)poid_par_priv->information_buf; - else if (poid_par_priv->type_of_oid == QUERY_OID) { - *(u8 *)poid_par_priv->information_buf = Adapter->registrypriv.wireless_mode; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } else - status = NDIS_STATUS_NOT_ACCEPTED; - - - return status; -} -/* **************** oid_rtl_seg_81_87_80 section start **************** */ -NDIS_STATUS oid_rt_pro_write_bb_reg_hdl(struct oid_par_priv *poid_par_priv) -{ - struct bb_reg_param *pbbreg; - u16 offset; - u32 value; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len < sizeof(struct bb_reg_param)) - return NDIS_STATUS_INVALID_LENGTH; - - pbbreg = (struct bb_reg_param *)(poid_par_priv->information_buf); - - offset = (u16)(pbbreg->offset) & 0xFFF; /* 0ffset :0x800~0xfff */ - if (offset < BB_REG_BASE_ADDR) - offset |= BB_REG_BASE_ADDR; - - value = pbbreg->value; - - - _irqlevel_changed_(&oldirql, LOWER); - write_bbreg(Adapter, offset, 0xFFFFFFFF, value); - _irqlevel_changed_(&oldirql, RAISE); - - - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_read_bb_reg_hdl(struct oid_par_priv *poid_par_priv) -{ - struct bb_reg_param *pbbreg; - u16 offset; - u32 value; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len < sizeof(struct bb_reg_param)) - return NDIS_STATUS_INVALID_LENGTH; - - pbbreg = (struct bb_reg_param *)(poid_par_priv->information_buf); - - offset = (u16)(pbbreg->offset) & 0xFFF; /* 0ffset :0x800~0xfff */ - if (offset < BB_REG_BASE_ADDR) - offset |= BB_REG_BASE_ADDR; - - _irqlevel_changed_(&oldirql, LOWER); - value = read_bbreg(Adapter, offset, 0xFFFFFFFF); - _irqlevel_changed_(&oldirql, RAISE); - - pbbreg->value = value; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - - - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_write_rf_reg_hdl(struct oid_par_priv *poid_par_priv) -{ - struct rf_reg_param *pbbreg; - u8 path; - u8 offset; - u32 value; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len < sizeof(struct rf_reg_param)) - return NDIS_STATUS_INVALID_LENGTH; - - pbbreg = (struct rf_reg_param *)(poid_par_priv->information_buf); - - if (pbbreg->path >= MAX_RF_PATH_NUMS) - return NDIS_STATUS_NOT_ACCEPTED; - if (pbbreg->offset > 0xFF) - return NDIS_STATUS_NOT_ACCEPTED; - if (pbbreg->value > 0xFFFFF) - return NDIS_STATUS_NOT_ACCEPTED; - - path = (u8)pbbreg->path; - offset = (u8)pbbreg->offset; - value = pbbreg->value; - - - _irqlevel_changed_(&oldirql, LOWER); - write_rfreg(Adapter, path, offset, value); - _irqlevel_changed_(&oldirql, RAISE); - - - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_read_rf_reg_hdl(struct oid_par_priv *poid_par_priv) -{ - struct rf_reg_param *pbbreg; - u8 path; - u8 offset; - u32 value; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len < sizeof(struct rf_reg_param)) - return NDIS_STATUS_INVALID_LENGTH; - - pbbreg = (struct rf_reg_param *)(poid_par_priv->information_buf); - - if (pbbreg->path >= MAX_RF_PATH_NUMS) - return NDIS_STATUS_NOT_ACCEPTED; - if (pbbreg->offset > 0xFF) - return NDIS_STATUS_NOT_ACCEPTED; - - path = (u8)pbbreg->path; - offset = (u8)pbbreg->offset; - - _irqlevel_changed_(&oldirql, LOWER); - value = read_rfreg(Adapter, path, offset); - _irqlevel_changed_(&oldirql, RAISE); - - pbbreg->value = value; - - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - - - - return status; -} -/* **************** oid_rtl_seg_81_87_00 section end**************** - * ------------------------------------------------------------------------------ */ - -/* **************** oid_rtl_seg_81_80_00 section start **************** - * ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_set_data_rate_hdl(struct oid_par_priv *poid_par_priv) -{ - u32 ratevalue;/* 4 */ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len != sizeof(u32)) - return NDIS_STATUS_INVALID_LENGTH; - - ratevalue = *((u32 *)poid_par_priv->information_buf); /* 4 */ - if (ratevalue >= MPT_RATE_LAST) - return NDIS_STATUS_INVALID_DATA; - - Adapter->mppriv.rateidx = ratevalue; - - _irqlevel_changed_(&oldirql, LOWER); - SetDataRate(Adapter); - _irqlevel_changed_(&oldirql, RAISE); - - - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_start_test_hdl(struct oid_par_priv *poid_par_priv) -{ - u32 mode; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - - - if (Adapter->registrypriv.mp_mode == 0) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - _irqlevel_changed_(&oldirql, LOWER); - - /* IQCalibrateBcut(Adapter); */ - - mode = *((u32 *)poid_par_priv->information_buf); - Adapter->mppriv.mode = mode;/* 1 for loopback */ - - if (mp_start_test(Adapter) == _FAIL) { - status = NDIS_STATUS_NOT_ACCEPTED; - goto exit; - } - -exit: - _irqlevel_changed_(&oldirql, RAISE); - - - - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_stop_test_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - _irqlevel_changed_(&oldirql, LOWER); - mp_stop_test(Adapter); - _irqlevel_changed_(&oldirql, RAISE); - - - - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_set_channel_direct_call_hdl(struct oid_par_priv *poid_par_priv) -{ - u32 Channel; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - - - if (poid_par_priv->information_buf_len != sizeof(u32)) - return NDIS_STATUS_INVALID_LENGTH; - - if (poid_par_priv->type_of_oid == QUERY_OID) { - *((u32 *)poid_par_priv->information_buf) = Adapter->mppriv.channel; - return NDIS_STATUS_SUCCESS; - } - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - Channel = *((u32 *)poid_par_priv->information_buf); - if (Channel > 14) - return NDIS_STATUS_NOT_ACCEPTED; - Adapter->mppriv.channel = Channel; - - _irqlevel_changed_(&oldirql, LOWER); - SetChannel(Adapter); - _irqlevel_changed_(&oldirql, RAISE); - - - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_set_bandwidth_hdl(struct oid_par_priv *poid_par_priv) -{ - u16 bandwidth; - u16 channel_offset; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len < sizeof(u32)) - return NDIS_STATUS_INVALID_LENGTH; - - bandwidth = *((u32 *)poid_par_priv->information_buf); /* 4 */ - channel_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - - if (bandwidth != CHANNEL_WIDTH_40) - bandwidth = CHANNEL_WIDTH_20; - padapter->mppriv.bandwidth = (u8)bandwidth; - padapter->mppriv.prime_channel_offset = (u8)channel_offset; - - _irqlevel_changed_(&oldirql, LOWER); - SetBandwidth(padapter); - _irqlevel_changed_(&oldirql, RAISE); - - - - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_set_antenna_bb_hdl(struct oid_par_priv *poid_par_priv) -{ - u32 antenna; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - - - if (poid_par_priv->information_buf_len != sizeof(u32)) - return NDIS_STATUS_INVALID_LENGTH; - - if (poid_par_priv->type_of_oid == SET_OID) { - antenna = *(u32 *)poid_par_priv->information_buf; - - Adapter->mppriv.antenna_tx = (u16)((antenna & 0xFFFF0000) >> 16); - Adapter->mppriv.antenna_rx = (u16)(antenna & 0x0000FFFF); - - _irqlevel_changed_(&oldirql, LOWER); - SetAntenna(Adapter); - _irqlevel_changed_(&oldirql, RAISE); - } else { - antenna = (Adapter->mppriv.antenna_tx << 16) | Adapter->mppriv.antenna_rx; - *(u32 *)poid_par_priv->information_buf = antenna; - } - - - return status; -} - -NDIS_STATUS oid_rt_pro_set_tx_power_control_hdl(struct oid_par_priv *poid_par_priv) -{ - u32 tx_pwr_idx; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len != sizeof(u32)) - return NDIS_STATUS_INVALID_LENGTH; - - tx_pwr_idx = *((u32 *)poid_par_priv->information_buf); - if (tx_pwr_idx > MAX_TX_PWR_INDEX_N_MODE) - return NDIS_STATUS_NOT_ACCEPTED; - - Adapter->mppriv.txpoweridx = (u8)tx_pwr_idx; - - - _irqlevel_changed_(&oldirql, LOWER); - SetTxPower(Adapter); - _irqlevel_changed_(&oldirql, RAISE); - - - return status; -} - -/* ------------------------------------------------------------------------------ - * **************** oid_rtl_seg_81_80_20 section start **************** - * ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_query_tx_packet_sent_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - - if (poid_par_priv->type_of_oid != QUERY_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - if (poid_par_priv->information_buf_len == sizeof(ULONG)) { - *(ULONG *)poid_par_priv->information_buf = Adapter->mppriv.tx_pktcount; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } else - status = NDIS_STATUS_INVALID_LENGTH; - - - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_query_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - - if (poid_par_priv->type_of_oid != QUERY_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - if (poid_par_priv->information_buf_len == sizeof(ULONG)) { - *(ULONG *)poid_par_priv->information_buf = Adapter->mppriv.rx_pktcount; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } else - status = NDIS_STATUS_INVALID_LENGTH; - - - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_query_rx_packet_crc32_error_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - - if (poid_par_priv->type_of_oid != QUERY_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - if (poid_par_priv->information_buf_len == sizeof(ULONG)) { - *(ULONG *)poid_par_priv->information_buf = Adapter->mppriv.rx_crcerrpktcount; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } else - status = NDIS_STATUS_INVALID_LENGTH; - - - return status; -} -/* ------------------------------------------------------------------------------ */ - -NDIS_STATUS oid_rt_pro_reset_tx_packet_sent_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - - if (poid_par_priv->type_of_oid != SET_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - Adapter->mppriv.tx_pktcount = 0; - - - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_reset_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - - if (poid_par_priv->type_of_oid != SET_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - if (poid_par_priv->information_buf_len == sizeof(ULONG)) { - Adapter->mppriv.rx_pktcount = 0; - Adapter->mppriv.rx_crcerrpktcount = 0; - } else - status = NDIS_STATUS_INVALID_LENGTH; - - - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_reset_phy_rx_packet_count_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - - if (poid_par_priv->type_of_oid != SET_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - _irqlevel_changed_(&oldirql, LOWER); - ResetPhyRxPktCount(Adapter); - _irqlevel_changed_(&oldirql, RAISE); - - - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_get_phy_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len != sizeof(ULONG)) - return NDIS_STATUS_INVALID_LENGTH; - - _irqlevel_changed_(&oldirql, LOWER); - *(ULONG *)poid_par_priv->information_buf = GetPhyRxPktReceived(Adapter); - _irqlevel_changed_(&oldirql, RAISE); - - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - - - - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_get_phy_rx_packet_crc32_error_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - - if (poid_par_priv->information_buf_len != sizeof(ULONG)) - return NDIS_STATUS_INVALID_LENGTH; - - _irqlevel_changed_(&oldirql, LOWER); - *(ULONG *)poid_par_priv->information_buf = GetPhyRxPktCRC32Error(Adapter); - _irqlevel_changed_(&oldirql, RAISE); - - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - - - - return status; -} -/* **************** oid_rtl_seg_81_80_20 section end **************** */ -NDIS_STATUS oid_rt_pro_set_continuous_tx_hdl(struct oid_par_priv *poid_par_priv) -{ - u32 bStartTest; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - bStartTest = *((u32 *)poid_par_priv->information_buf); - - _irqlevel_changed_(&oldirql, LOWER); - SetContinuousTx(Adapter, (u8)bStartTest); - if (bStartTest) { - struct mp_priv *pmp_priv = &Adapter->mppriv; - if (pmp_priv->tx.stop == 0) { - pmp_priv->tx.stop = 1; - RTW_INFO("%s: pkt tx is running...\n", __func__); - rtw_msleep_os(5); - } - pmp_priv->tx.stop = 0; - pmp_priv->tx.count = 1; - SetPacketTx(Adapter); - } - _irqlevel_changed_(&oldirql, RAISE); - - - return status; -} - -NDIS_STATUS oid_rt_pro_set_single_carrier_tx_hdl(struct oid_par_priv *poid_par_priv) -{ - u32 bStartTest; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - bStartTest = *((u32 *)poid_par_priv->information_buf); - - _irqlevel_changed_(&oldirql, LOWER); - SetSingleCarrierTx(Adapter, (u8)bStartTest); - if (bStartTest) { - struct mp_priv *pmp_priv = &Adapter->mppriv; - if (pmp_priv->tx.stop == 0) { - pmp_priv->tx.stop = 1; - RTW_INFO("%s: pkt tx is running...\n", __func__); - rtw_msleep_os(5); - } - pmp_priv->tx.stop = 0; - pmp_priv->tx.count = 1; - SetPacketTx(Adapter); - } - _irqlevel_changed_(&oldirql, RAISE); - - - return status; -} - -NDIS_STATUS oid_rt_pro_set_carrier_suppression_tx_hdl(struct oid_par_priv *poid_par_priv) -{ - u32 bStartTest; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - bStartTest = *((u32 *)poid_par_priv->information_buf); - - _irqlevel_changed_(&oldirql, LOWER); - SetCarrierSuppressionTx(Adapter, (u8)bStartTest); - if (bStartTest) { - struct mp_priv *pmp_priv = &Adapter->mppriv; - if (pmp_priv->tx.stop == 0) { - pmp_priv->tx.stop = 1; - RTW_INFO("%s: pkt tx is running...\n", __func__); - rtw_msleep_os(5); - } - pmp_priv->tx.stop = 0; - pmp_priv->tx.count = 1; - SetPacketTx(Adapter); - } - _irqlevel_changed_(&oldirql, RAISE); - - - return status; -} - -NDIS_STATUS oid_rt_pro_set_single_tone_tx_hdl(struct oid_par_priv *poid_par_priv) -{ - u32 bStartTest; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - bStartTest = *((u32 *)poid_par_priv->information_buf); - - _irqlevel_changed_(&oldirql, LOWER); - SetSingleToneTx(Adapter, (u8)bStartTest); - _irqlevel_changed_(&oldirql, RAISE); - - - return status; -} - -NDIS_STATUS oid_rt_pro_set_modulation_hdl(struct oid_par_priv *poid_par_priv) -{ - return 0; -} - -NDIS_STATUS oid_rt_pro_trigger_gpio_hdl(struct oid_par_priv *poid_par_priv) -{ - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - _irqlevel_changed_(&oldirql, LOWER); - rtw_hal_set_hwreg(Adapter, HW_VAR_TRIGGER_GPIO_0, 0); - _irqlevel_changed_(&oldirql, RAISE); - - - return status; -} -/* **************** oid_rtl_seg_81_80_00 section end **************** - * ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro8711_join_bss_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - PNDIS_802_11_SSID pssid; - - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - *poid_par_priv->bytes_needed = (u32)sizeof(NDIS_802_11_SSID); - *poid_par_priv->bytes_rw = 0; - if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed) - return NDIS_STATUS_INVALID_LENGTH; - - pssid = (PNDIS_802_11_SSID)poid_par_priv->information_buf; - - _irqlevel_changed_(&oldirql, LOWER); - - if (mp_start_joinbss(Adapter, pssid) == _FAIL) - status = NDIS_STATUS_NOT_ACCEPTED; - - _irqlevel_changed_(&oldirql, RAISE); - - *poid_par_priv->bytes_rw = sizeof(NDIS_802_11_SSID); - - - return status; -#else - return 0; -#endif -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_read_register_hdl(struct oid_par_priv *poid_par_priv) -{ - pRW_Reg RegRWStruct; - u32 offset, width; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - RegRWStruct = (pRW_Reg)poid_par_priv->information_buf; - offset = RegRWStruct->offset; - width = RegRWStruct->width; - - if (offset > 0xFFF) - return NDIS_STATUS_NOT_ACCEPTED; - - _irqlevel_changed_(&oldirql, LOWER); - - switch (width) { - case 1: - RegRWStruct->value = rtw_read8(Adapter, offset); - break; - case 2: - RegRWStruct->value = rtw_read16(Adapter, offset); - break; - default: - width = 4; - RegRWStruct->value = rtw_read32(Adapter, offset); - break; - } - - _irqlevel_changed_(&oldirql, RAISE); - - *poid_par_priv->bytes_rw = width; - - - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_write_register_hdl(struct oid_par_priv *poid_par_priv) -{ - pRW_Reg RegRWStruct; - u32 offset, width, value; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - RegRWStruct = (pRW_Reg)poid_par_priv->information_buf; - offset = RegRWStruct->offset; - width = RegRWStruct->width; - value = RegRWStruct->value; - - if (offset > 0xFFF) - return NDIS_STATUS_NOT_ACCEPTED; - - _irqlevel_changed_(&oldirql, LOWER); - - switch (RegRWStruct->width) { - case 1: - if (value > 0xFF) { - status = NDIS_STATUS_NOT_ACCEPTED; - break; - } - rtw_write8(padapter, offset, (u8)value); - break; - case 2: - if (value > 0xFFFF) { - status = NDIS_STATUS_NOT_ACCEPTED; - break; - } - rtw_write16(padapter, offset, (u16)value); - break; - case 4: - rtw_write32(padapter, offset, value); - break; - default: - status = NDIS_STATUS_NOT_ACCEPTED; - break; - } - - _irqlevel_changed_(&oldirql, RAISE); - - - - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_burst_read_register_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - pBurst_RW_Reg pBstRwReg; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - pBstRwReg = (pBurst_RW_Reg)poid_par_priv->information_buf; - - _irqlevel_changed_(&oldirql, LOWER); - rtw_read_mem(padapter, pBstRwReg->offset, (u32)pBstRwReg->len, pBstRwReg->Data); - _irqlevel_changed_(&oldirql, RAISE); - - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - - - - return status; -#else - return 0; -#endif -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_burst_write_register_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - pBurst_RW_Reg pBstRwReg; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - pBstRwReg = (pBurst_RW_Reg)poid_par_priv->information_buf; - - _irqlevel_changed_(&oldirql, LOWER); - rtw_write_mem(padapter, pBstRwReg->offset, (u32)pBstRwReg->len, pBstRwReg->Data); - _irqlevel_changed_(&oldirql, RAISE); - - - - return status; -#else - return 0; -#endif -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_write_txcmd_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - - TX_CMD_Desc *TxCmd_Info; - - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - - TxCmd_Info = (TX_CMD_Desc *)poid_par_priv->information_buf; - - - _irqlevel_changed_(&oldirql, LOWER); - - rtw_write32(Adapter, TxCmd_Info->offset + 0, (unsigned int)TxCmd_Info->TxCMD.value[0]); - rtw_write32(Adapter, TxCmd_Info->offset + 4, (unsigned int)TxCmd_Info->TxCMD.value[1]); - - _irqlevel_changed_(&oldirql, RAISE); - - - - return status; -#else - return 0; -#endif -} - -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_read16_eeprom_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - pEEPROM_RWParam pEEPROM; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - pEEPROM = (pEEPROM_RWParam)poid_par_priv->information_buf; - - _irqlevel_changed_(&oldirql, LOWER); - pEEPROM->value = eeprom_read16(padapter, (u16)(pEEPROM->offset >> 1)); - _irqlevel_changed_(&oldirql, RAISE); - - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - - - - return status; -#else - return 0; -#endif -} - -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_write16_eeprom_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - pEEPROM_RWParam pEEPROM; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - pEEPROM = (pEEPROM_RWParam)poid_par_priv->information_buf; - - _irqlevel_changed_(&oldirql, LOWER); - eeprom_write16(padapter, (u16)(pEEPROM->offset >> 1), pEEPROM->value); - _irqlevel_changed_(&oldirql, RAISE); - - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - - - return status; -#else - return 0; -#endif -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro8711_wi_poll_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - struct mp_wiparam *pwi_param; - - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len < sizeof(struct mp_wiparam)) - return NDIS_STATUS_INVALID_LENGTH; - - if (Adapter->mppriv.workparam.bcompleted == _FALSE) - return NDIS_STATUS_NOT_ACCEPTED; - - pwi_param = (struct mp_wiparam *)poid_par_priv->information_buf; - - _rtw_memcpy(pwi_param, &Adapter->mppriv.workparam, sizeof(struct mp_wiparam)); - Adapter->mppriv.act_in_progress = _FALSE; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - - - return status; -#else - return 0; -#endif -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro8711_pkt_loss_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len < sizeof(uint) * 2) { - return NDIS_STATUS_INVALID_LENGTH; - } - - if (*(uint *)poid_par_priv->information_buf == 1) /* init==1 */ - Adapter->mppriv.rx_pktloss = 0; - - *((uint *)poid_par_priv->information_buf + 1) = Adapter->mppriv.rx_pktloss; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - - - return status; -#else - return 0; -#endif -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_rd_attrib_mem_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - struct io_queue *pio_queue = (struct io_queue *)Adapter->pio_queue; - struct intf_hdl *pintfhdl = &pio_queue->intf; - - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - -#ifdef CONFIG_SDIO_HCI - void (*_attrib_read)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); -#endif - - - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; - -#ifdef CONFIG_SDIO_HCI - _irqlevel_changed_(&oldirql, LOWER); - { - u32 *plmem = (u32 *)poid_par_priv->information_buf + 2; - _attrib_read = pintfhdl->io_ops._attrib_read; - _attrib_read(pintfhdl, *((u32 *)poid_par_priv->information_buf), - *((u32 *)poid_par_priv->information_buf + 1), (u8 *)plmem); - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } - _irqlevel_changed_(&oldirql, RAISE); -#endif - - - return status; -#else - return 0; -#endif -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_wr_attrib_mem_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - struct io_queue *pio_queue = (struct io_queue *)Adapter->pio_queue; - struct intf_hdl *pintfhdl = &pio_queue->intf; - - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - -#ifdef CONFIG_SDIO_HCI - void (*_attrib_write)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); -#endif - - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - -#ifdef CONFIG_SDIO_HCI - _irqlevel_changed_(&oldirql, LOWER); - { - u32 *plmem = (u32 *)poid_par_priv->information_buf + 2; - _attrib_write = pintfhdl->io_ops._attrib_write; - _attrib_write(pintfhdl, *(u32 *)poid_par_priv->information_buf, - *((u32 *)poid_par_priv->information_buf + 1), (u8 *)plmem); - } - _irqlevel_changed_(&oldirql, RAISE); -#endif - - - return status; -#else - return 0; -#endif -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_set_rf_intfs_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - _irqlevel_changed_(&oldirql, LOWER); - - if (rtw_setrfintfs_cmd(Adapter, *(unsigned char *)poid_par_priv->information_buf) == _FAIL) - status = NDIS_STATUS_NOT_ACCEPTED; - - _irqlevel_changed_(&oldirql, RAISE); - - - return status; -#else - return 0; -#endif -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_poll_rx_status_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - _rtw_memcpy(poid_par_priv->information_buf, (unsigned char *)&Adapter->mppriv.rxstat, sizeof(struct recv_stat)); - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - - - return status; -#else - return 0; -#endif -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_cfg_debug_message_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - PCFG_DBG_MSG_STRUCT pdbg_msg; - - - -#if 0/*#ifdef CONFIG_DEBUG_RTL871X*/ - - pdbg_msg = (PCFG_DBG_MSG_STRUCT)(poid_par_priv->information_buf); - - if (poid_par_priv->type_of_oid == SET_OID) { - - GlobalDebugLevel = pdbg_msg->DebugLevel; - GlobalDebugComponents = (pdbg_msg->DebugComponent_H32 << 32) | pdbg_msg->DebugComponent_L32; - } else { - pdbg_msg->DebugLevel = GlobalDebugLevel; - pdbg_msg->DebugComponent_H32 = (u32)(GlobalDebugComponents >> 32); - pdbg_msg->DebugComponent_L32 = (u32)GlobalDebugComponents; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - - } - -#endif - - - return status; -#else - return 0; -#endif -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_set_data_rate_ex_hdl(struct oid_par_priv *poid_par_priv) -{ - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - _irqlevel_changed_(&oldirql, LOWER); - - if (rtw_setdatarate_cmd(Adapter, poid_par_priv->information_buf) != _SUCCESS) - status = NDIS_STATUS_NOT_ACCEPTED; - - _irqlevel_changed_(&oldirql, RAISE); - - - return status; -} -/* ----------------------------------------------------------------------------- */ -NDIS_STATUS oid_rt_get_thermal_meter_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - u8 thermal = 0; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len < sizeof(u32)) - return NDIS_STATUS_INVALID_LENGTH; - - _irqlevel_changed_(&oldirql, LOWER); - GetThermalMeter(Adapter, &thermal); - _irqlevel_changed_(&oldirql, RAISE); - - *(u32 *)poid_par_priv->information_buf = (u32)thermal; - *poid_par_priv->bytes_rw = sizeof(u32); - - - return status; -} -/* ----------------------------------------------------------------------------- */ -NDIS_STATUS oid_rt_pro_read_tssi_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (Adapter->mppriv.act_in_progress == _TRUE) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len < sizeof(u8)) - return NDIS_STATUS_INVALID_LENGTH; - - /* init workparam */ - Adapter->mppriv.act_in_progress = _TRUE; - Adapter->mppriv.workparam.bcompleted = _FALSE; - Adapter->mppriv.workparam.act_type = MPT_READ_TSSI; - Adapter->mppriv.workparam.io_offset = 0; - Adapter->mppriv.workparam.io_value = 0xFFFFFFFF; - - _irqlevel_changed_(&oldirql, LOWER); - - if (!rtw_gettssi_cmd(Adapter, 0, (u8 *)&Adapter->mppriv.workparam.io_value)) - status = NDIS_STATUS_NOT_ACCEPTED; - - _irqlevel_changed_(&oldirql, RAISE); - - - return status; -#else - return 0; -#endif -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_set_power_tracking_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - - - /* if (poid_par_priv->type_of_oid != SET_OID) - * return NDIS_STATUS_NOT_ACCEPTED; */ - - if (poid_par_priv->information_buf_len < sizeof(u8)) - return NDIS_STATUS_INVALID_LENGTH; - - _irqlevel_changed_(&oldirql, LOWER); - if (poid_par_priv->type_of_oid == SET_OID) { - u8 enable; - - enable = *(u8 *)poid_par_priv->information_buf; - - SetPowerTracking(Adapter, enable); - } else - GetPowerTracking(Adapter, (u8 *)poid_par_priv->information_buf); - _irqlevel_changed_(&oldirql, RAISE); - - - return status; -} -/* ----------------------------------------------------------------------------- */ -NDIS_STATUS oid_rt_pro_set_basic_rate_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - u32 ratevalue; - u8 datarates[NumRates]; - int i; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); - - - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; -#if 0 - ratevalue = *((u32 *)poid_par_priv->information_buf); - - for (i = 0; i < NumRates; i++) { - if (ratevalue == mpdatarate[i]) - datarates[i] = mpdatarate[i]; - else - datarates[i] = 0xff; - } - - _irqlevel_changed_(&oldirql, LOWER); - - if (rtw_setbasicrate_cmd(padapter, datarates) != _SUCCESS) - status = NDIS_STATUS_NOT_ACCEPTED; - - _irqlevel_changed_(&oldirql, RAISE); -#endif - - - return status; -#else - return 0; -#endif -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_qry_pwrstate_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len < 8) - return NDIS_STATUS_INVALID_LENGTH; - - *poid_par_priv->bytes_rw = 8; - _rtw_memcpy(poid_par_priv->information_buf, &(adapter_to_pwrctl(Adapter)->pwr_mode), 8); - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - - - - return status; -#else - return 0; -#endif -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_set_pwrstate_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - uint pwr_mode, smart_ps; - - - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - *poid_par_priv->bytes_rw = 0; - *poid_par_priv->bytes_needed = 8; - - if (poid_par_priv->information_buf_len < 8) - return NDIS_STATUS_INVALID_LENGTH; - - pwr_mode = *(uint *)(poid_par_priv->information_buf); - smart_ps = *(uint *)((int)poid_par_priv->information_buf + 4); - - *poid_par_priv->bytes_rw = 8; - - - return status; -#else - return 0; -#endif -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_h2c_set_rate_table_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - struct setratable_parm *prate_table; - u8 res; - - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - *poid_par_priv->bytes_needed = sizeof(struct setratable_parm); - if (poid_par_priv->information_buf_len < sizeof(struct setratable_parm)) - return NDIS_STATUS_INVALID_LENGTH; - - prate_table = (struct setratable_parm *)poid_par_priv->information_buf; - - _irqlevel_changed_(&oldirql, LOWER); - res = rtw_setrttbl_cmd(Adapter, prate_table); - _irqlevel_changed_(&oldirql, RAISE); - - if (res == _FAIL) - status = NDIS_STATUS_FAILURE; - - - return status; -#else - return 0; -#endif -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_h2c_get_rate_table_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; - -#if 0 - struct mp_wi_cntx *pmp_wi_cntx = &(Adapter->mppriv.wi_cntx); - u8 res = _SUCCESS; - DEBUG_INFO(("===> Set OID_RT_PRO_H2C_GET_RATE_TABLE.\n")); - - if (pmp_wi_cntx->bmp_wi_progress == _TRUE) { - DEBUG_ERR(("\n mp workitem is progressing, not allow to set another workitem right now!!!\n")); - Status = NDIS_STATUS_NOT_ACCEPTED; - break; - } else { - pmp_wi_cntx->bmp_wi_progress = _TRUE; - pmp_wi_cntx->param.bcompleted = _FALSE; - pmp_wi_cntx->param.act_type = MPT_GET_RATE_TABLE; - pmp_wi_cntx->param.io_offset = 0x0; - pmp_wi_cntx->param.bytes_cnt = sizeof(struct getratable_rsp); - pmp_wi_cntx->param.io_value = 0xffffffff; - - res = rtw_getrttbl_cmd(Adapter, (struct getratable_rsp *)pmp_wi_cntx->param.data); - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - if (res != _SUCCESS) - Status = NDIS_STATUS_NOT_ACCEPTED; - } - DEBUG_INFO(("\n <=== Set OID_RT_PRO_H2C_GET_RATE_TABLE.\n")); -#endif - - - return status; -#else - return 0; -#endif -} - -/* **************** oid_rtl_seg_87_12_00 section start **************** */ -NDIS_STATUS oid_rt_pro_encryption_ctrl_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - struct security_priv *psecuritypriv = &Adapter->securitypriv; - - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - ENCRY_CTRL_STATE encry_mode; - - - *poid_par_priv->bytes_needed = sizeof(u8); - if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed) - return NDIS_STATUS_INVALID_LENGTH; - - if (poid_par_priv->type_of_oid == SET_OID) { - encry_mode = *((u8 *)poid_par_priv->information_buf); - switch (encry_mode) { - case HW_CONTROL: -#if 0 - Adapter->registrypriv.software_decrypt = _FALSE; - Adapter->registrypriv.software_encrypt = _FALSE; -#else - psecuritypriv->sw_decrypt = _FALSE; - psecuritypriv->sw_encrypt = _FALSE; -#endif - break; - case SW_CONTROL: -#if 0 - Adapter->registrypriv.software_decrypt = _TRUE; - Adapter->registrypriv.software_encrypt = _TRUE; -#else - psecuritypriv->sw_decrypt = _TRUE; - psecuritypriv->sw_encrypt = _TRUE; -#endif - break; - case HW_ENCRY_SW_DECRY: -#if 0 - Adapter->registrypriv.software_decrypt = _TRUE; - Adapter->registrypriv.software_encrypt = _FALSE; -#else - psecuritypriv->sw_decrypt = _TRUE; - psecuritypriv->sw_encrypt = _FALSE; -#endif - break; - case SW_ENCRY_HW_DECRY: -#if 0 - Adapter->registrypriv.software_decrypt = _FALSE; - Adapter->registrypriv.software_encrypt = _TRUE; -#else - psecuritypriv->sw_decrypt = _FALSE; - psecuritypriv->sw_encrypt = _TRUE; -#endif - break; - } - - } else { -#if 0 - if (Adapter->registrypriv.software_encrypt == _FALSE) { - if (Adapter->registrypriv.software_decrypt == _FALSE) - encry_mode = HW_CONTROL; - else - encry_mode = HW_ENCRY_SW_DECRY; - } else { - if (Adapter->registrypriv.software_decrypt == _FALSE) - encry_mode = SW_ENCRY_HW_DECRY; - else - encry_mode = SW_CONTROL; - } -#else - - if ((psecuritypriv->sw_encrypt == _FALSE) && (psecuritypriv->sw_decrypt == _FALSE)) - encry_mode = HW_CONTROL; - else if ((psecuritypriv->sw_encrypt == _FALSE) && (psecuritypriv->sw_decrypt == _TRUE)) - encry_mode = HW_ENCRY_SW_DECRY; - else if ((psecuritypriv->sw_encrypt == _TRUE) && (psecuritypriv->sw_decrypt == _FALSE)) - encry_mode = SW_ENCRY_HW_DECRY; - else if ((psecuritypriv->sw_encrypt == _TRUE) && (psecuritypriv->sw_decrypt == _TRUE)) - encry_mode = SW_CONTROL; - -#endif - - *(u8 *)poid_par_priv->information_buf = encry_mode; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - - } - - return status; -#else - return 0; -#endif -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_add_sta_info_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - struct sta_info *psta = NULL; - UCHAR *macaddr; - - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - *poid_par_priv->bytes_needed = ETH_ALEN; - if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed) - return NDIS_STATUS_INVALID_LENGTH; - - macaddr = (UCHAR *) poid_par_priv->information_buf ; - - - _irqlevel_changed_(&oldirql, LOWER); - - psta = rtw_get_stainfo(&Adapter->stapriv, macaddr); - - if (psta == NULL) { /* the sta have been in sta_info_queue => do nothing */ - psta = rtw_alloc_stainfo(&Adapter->stapriv, macaddr); - - if (psta == NULL) { - status = NDIS_STATUS_FAILURE; - } - } - - _irqlevel_changed_(&oldirql, RAISE); - - return status; -#else - return 0; -#endif -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_dele_sta_info_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - struct sta_info *psta = NULL; - UCHAR *macaddr; - - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - *poid_par_priv->bytes_needed = ETH_ALEN; - if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed) - return NDIS_STATUS_INVALID_LENGTH; - - macaddr = (UCHAR *) poid_par_priv->information_buf ; - - psta = rtw_get_stainfo(&Adapter->stapriv, macaddr); - if (psta != NULL) { - /* _enter_critical(&(Adapter->stapriv.sta_hash_lock), &irqL); */ - rtw_free_stainfo(Adapter, psta); - /* _exit_critical(&(Adapter->stapriv.sta_hash_lock), &irqL); */ - } - - return status; -#else - return 0; -#endif -} -/* ------------------------------------------------------------------------------ */ -#if 0 -static u32 mp_query_drv_var(_adapter *padapter, u8 offset, u32 var) -{ -#ifdef CONFIG_SDIO_HCI - - if (offset == 1) { - u16 tmp_blk_num; - tmp_blk_num = rtw_read16(padapter, SDIO_RX0_RDYBLK_NUM); - if (adapter_to_dvobj(padapter)->rxblknum != tmp_blk_num) { - /* sd_recv_rxfifo(padapter); */ - } - } - -#if 0 - if (offset <= 100) { /* For setting data rate and query data rate */ - if (offset == 100) { /* For query data rate */ - var = padapter->registrypriv.tx_rate; - - } else if (offset < 0x1d) { /* For setting data rate */ - padapter->registrypriv.tx_rate = offset; - var = padapter->registrypriv.tx_rate; - padapter->registrypriv.use_rate = _TRUE; - } else { /* not use the data rate */ - padapter->registrypriv.use_rate = _FALSE; - } - } else if (offset <= 110) { /* for setting debug level */ - if (offset == 110) { /* For query data rate */ - padapter->registrypriv.dbg_level = GlobalDebugLevel; - var = padapter->registrypriv.dbg_level; - } else if (offset < 110 && offset > 100) { - padapter->registrypriv.dbg_level = GlobalDebugLevel = offset - 100; - var = padapter->registrypriv.dbg_level; - - } - } else if (offset > 110 && offset < 116) { - if (115 == offset) { - } else { - switch (offset) { - case 111: - adapter_to_dvobj(padapter)->tx_block_mode = 1; - adapter_to_dvobj(padapter)->rx_block_mode = 1; - break; - case 112: - adapter_to_dvobj(padapter)->tx_block_mode = 1; - adapter_to_dvobj(padapter)->rx_block_mode = 0; - break; - case 113: - adapter_to_dvobj(padapter)->tx_block_mode = 0; - adapter_to_dvobj(padapter)->rx_block_mode = 1; - break; - case 114: - adapter_to_dvobj(padapter)->tx_block_mode = 0; - adapter_to_dvobj(padapter)->rx_block_mode = 0; - break; - default: - break; - - } - - } - - } else if (offset >= 127) { - u64 prnt_dbg_comp; - u8 chg_idx; - u64 tmp_dbg_comp; - chg_idx = offset - 0x80; - tmp_dbg_comp = BIT(chg_idx); - prnt_dbg_comp = padapter->registrypriv.dbg_component = GlobalDebugComponents; - if (offset == 127) { - /* prnt_dbg_comp=padapter->registrypriv.dbg_component= GlobalDebugComponents; */ - var = (u32)(padapter->registrypriv.dbg_component); - prnt_dbg_comp = GlobalDebugComponents; - prnt_dbg_comp = GlobalDebugComponents = padapter->registrypriv.dbg_component; - - } else { - prnt_dbg_comp = GlobalDebugComponents; - prnt_dbg_comp = GlobalDebugComponents = padapter->registrypriv.dbg_component; - - if (GlobalDebugComponents & tmp_dbg_comp) { - /* this bit is already set, now clear it */ - GlobalDebugComponents = GlobalDebugComponents & (~tmp_dbg_comp); - } else { - /* this bit is not set, now set it. */ - GlobalDebugComponents = GlobalDebugComponents | tmp_dbg_comp; - } - prnt_dbg_comp = GlobalDebugComponents; - - var = (u32)(GlobalDebugComponents); - /* GlobalDebugComponents=padapter->registrypriv.dbg_component; */ - - } - } -#endif -#endif - - return var; -} -#endif - -NDIS_STATUS oid_rt_pro_query_dr_variable_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - DR_VARIABLE_STRUCT *pdrv_var; - - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - *poid_par_priv->bytes_needed = sizeof(DR_VARIABLE_STRUCT); - if (poid_par_priv->information_buf_len < *poid_par_priv->bytes_needed) - return NDIS_STATUS_INVALID_LENGTH; - - - pdrv_var = (struct _DR_VARIABLE_STRUCT_ *)poid_par_priv->information_buf; - - _irqlevel_changed_(&oldirql, LOWER); - pdrv_var->variable = mp_query_drv_var(Adapter, pdrv_var->offset, pdrv_var->variable); - _irqlevel_changed_(&oldirql, RAISE); - - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - - - return status; -#else - return 0; -#endif -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_rx_packet_type_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - - if (poid_par_priv->information_buf_len < sizeof(UCHAR)) { - status = NDIS_STATUS_INVALID_LENGTH; - *poid_par_priv->bytes_needed = sizeof(UCHAR); - return status; - } - - if (poid_par_priv->type_of_oid == SET_OID) { - Adapter->mppriv.rx_with_status = *(UCHAR *) poid_par_priv->information_buf; - - - } else { - *(UCHAR *) poid_par_priv->information_buf = Adapter->mppriv.rx_with_status; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - - - /* *(u32 *)&Adapter->eeprompriv.mac_addr[0]=rtw_read32(Adapter, 0x10250050); */ - /* *(u16 *)&Adapter->eeprompriv.mac_addr[4]=rtw_read16(Adapter, 0x10250054); */ - } -#endif - - return NDIS_STATUS_SUCCESS; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_read_efuse_hdl(struct oid_par_priv *poid_par_priv) -{ - PEFUSE_ACCESS_STRUCT pefuse; - u8 *data; - u16 addr = 0, cnts = 0, max_available_size = 0; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len < sizeof(EFUSE_ACCESS_STRUCT)) - return NDIS_STATUS_INVALID_LENGTH; - - pefuse = (PEFUSE_ACCESS_STRUCT)poid_par_priv->information_buf; - addr = pefuse->start_addr; - cnts = pefuse->cnts; - data = pefuse->data; - - - EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE); - - if ((addr + cnts) > max_available_size) { - return NDIS_STATUS_NOT_ACCEPTED; - } - - _irqlevel_changed_(&oldirql, LOWER); - if (rtw_efuse_access(Adapter, _FALSE, addr, cnts, data) == _FAIL) { - status = NDIS_STATUS_FAILURE; - } else - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - _irqlevel_changed_(&oldirql, RAISE); - - - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_write_efuse_hdl(struct oid_par_priv *poid_par_priv) -{ - PEFUSE_ACCESS_STRUCT pefuse; - u8 *data; - u16 addr = 0, cnts = 0, max_available_size = 0; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - pefuse = (PEFUSE_ACCESS_STRUCT)poid_par_priv->information_buf; - addr = pefuse->start_addr; - cnts = pefuse->cnts; - data = pefuse->data; - - - EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, (PVOID)&max_available_size, _FALSE); - - if ((addr + cnts) > max_available_size) { - return NDIS_STATUS_NOT_ACCEPTED; - } - - _irqlevel_changed_(&oldirql, LOWER); - if (rtw_efuse_access(Adapter, _TRUE, addr, cnts, data) == _FAIL) - status = NDIS_STATUS_FAILURE; - _irqlevel_changed_(&oldirql, RAISE); - - - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_rw_efuse_pgpkt_hdl(struct oid_par_priv *poid_par_priv) -{ - PPGPKT_STRUCT ppgpkt; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - - - *poid_par_priv->bytes_rw = 0; - - if (poid_par_priv->information_buf_len < sizeof(PGPKT_STRUCT)) - return NDIS_STATUS_INVALID_LENGTH; - - ppgpkt = (PPGPKT_STRUCT)poid_par_priv->information_buf; - - _irqlevel_changed_(&oldirql, LOWER); - - if (poid_par_priv->type_of_oid == QUERY_OID) { - - Efuse_PowerSwitch(Adapter, _FALSE, _TRUE); - if (Efuse_PgPacketRead(Adapter, ppgpkt->offset, ppgpkt->data, _FALSE) == _TRUE) - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - else - status = NDIS_STATUS_FAILURE; - Efuse_PowerSwitch(Adapter, _FALSE, _FALSE); - } else { - - Efuse_PowerSwitch(Adapter, _TRUE, _TRUE); - if (Efuse_PgPacketWrite(Adapter, ppgpkt->offset, ppgpkt->word_en, ppgpkt->data, _FALSE) == _TRUE) - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - else - status = NDIS_STATUS_FAILURE; - Efuse_PowerSwitch(Adapter, _TRUE, _FALSE); - } - - _irqlevel_changed_(&oldirql, RAISE); - - - - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_get_efuse_current_size_hdl(struct oid_par_priv *poid_par_priv) -{ - u16 size; - u8 ret; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len < sizeof(u32)) - return NDIS_STATUS_INVALID_LENGTH; - - _irqlevel_changed_(&oldirql, LOWER); - ret = efuse_GetCurrentSize(Adapter, &size); - _irqlevel_changed_(&oldirql, RAISE); - if (ret == _SUCCESS) { - *(u32 *)poid_par_priv->information_buf = size; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - } else - status = NDIS_STATUS_FAILURE; - - - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_get_efuse_max_size_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - - if (poid_par_priv->type_of_oid != QUERY_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len < sizeof(u32)) - return NDIS_STATUS_INVALID_LENGTH; - - *(u32 *)poid_par_priv->information_buf = efuse_GetMaxSize(Adapter); - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - - - - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_efuse_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status; - - - - if (poid_par_priv->type_of_oid == QUERY_OID) - status = oid_rt_pro_read_efuse_hdl(poid_par_priv); - else - status = oid_rt_pro_write_efuse_hdl(poid_par_priv); - - - - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_pro_efuse_map_hdl(struct oid_par_priv *poid_par_priv) -{ - u8 *data; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - u16 mapLen = 0; - - - - EFUSE_GetEfuseDefinition(Adapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (PVOID)&mapLen, _FALSE); - - *poid_par_priv->bytes_rw = 0; - - if (poid_par_priv->information_buf_len < mapLen) - return NDIS_STATUS_INVALID_LENGTH; - - data = (u8 *)poid_par_priv->information_buf; - - _irqlevel_changed_(&oldirql, LOWER); - - if (poid_par_priv->type_of_oid == QUERY_OID) { - - if (rtw_efuse_map_read(Adapter, 0, mapLen, data) == _SUCCESS) - *poid_par_priv->bytes_rw = mapLen; - else { - status = NDIS_STATUS_FAILURE; - } - } else { - /* SET_OID */ - - if (rtw_efuse_map_write(Adapter, 0, mapLen, data) == _SUCCESS) - *poid_par_priv->bytes_rw = mapLen; - else { - status = NDIS_STATUS_FAILURE; - } - } - - _irqlevel_changed_(&oldirql, RAISE); - - - - return status; -} - -NDIS_STATUS oid_rt_set_crystal_cap_hdl(struct oid_par_priv *poid_par_priv) -{ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - - u32 crystal_cap = 0; - - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len < sizeof(u32)) - return NDIS_STATUS_INVALID_LENGTH; - - crystal_cap = *((u32 *)poid_par_priv->information_buf); /* 4 */ - if (crystal_cap > 0xf) - return NDIS_STATUS_NOT_ACCEPTED; - - Adapter->mppriv.curr_crystalcap = crystal_cap; - - _irqlevel_changed_(&oldirql, LOWER); - SetCrystalCap(Adapter); - _irqlevel_changed_(&oldirql, RAISE); - - -#endif - return status; -} - -NDIS_STATUS oid_rt_set_rx_packet_type_hdl(struct oid_par_priv *poid_par_priv) -{ - u8 rx_pkt_type; - /* u32 rcr_val32; */ - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - /* PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); */ - - - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len < sizeof(u8)) - return NDIS_STATUS_INVALID_LENGTH; - - rx_pkt_type = *((u8 *)poid_par_priv->information_buf); /* 4 */ - -#if 0 - _irqlevel_changed_(&oldirql, LOWER); -#if 0 - rcr_val8 = rtw_read8(Adapter, 0x10250048);/* RCR */ - rcr_val8 &= ~(RCR_AB | RCR_AM | RCR_APM | RCR_AAP); - - if (rx_pkt_type == RX_PKT_BROADCAST) - rcr_val8 |= (RCR_AB | RCR_ACRC32); - else if (rx_pkt_type == RX_PKT_DEST_ADDR) - rcr_val8 |= (RCR_AAP | RCR_AM | RCR_ACRC32); - else if (rx_pkt_type == RX_PKT_PHY_MATCH) - rcr_val8 |= (RCR_APM | RCR_ACRC32); - else - rcr_val8 &= ~(RCR_AAP | RCR_APM | RCR_AM | RCR_AB | RCR_ACRC32); - rtw_write8(padapter, 0x10250048, rcr_val8); -#else - rcr_val32 = rtw_read32(padapter, RCR);/* RCR = 0x10250048 */ - rcr_val32 &= ~(RCR_CBSSID | RCR_AB | RCR_AM | RCR_APM | RCR_AAP); -#if 0 - if (rx_pkt_type == RX_PKT_BROADCAST) - rcr_val32 |= (RCR_AB | RCR_AM | RCR_APM | RCR_AAP | RCR_ACRC32); - else if (rx_pkt_type == RX_PKT_DEST_ADDR) { - /* rcr_val32 |= (RCR_CBSSID|RCR_AAP|RCR_AM|RCR_ACRC32); */ - rcr_val32 |= (RCR_CBSSID | RCR_APM | RCR_ACRC32); - } else if (rx_pkt_type == RX_PKT_PHY_MATCH) { - rcr_val32 |= (RCR_APM | RCR_ACRC32); - /* rcr_val32 |= (RCR_AAP|RCR_ACRC32); */ - } else - rcr_val32 &= ~(RCR_AAP | RCR_APM | RCR_AM | RCR_AB | RCR_ACRC32); -#else - switch (rx_pkt_type) { - case RX_PKT_BROADCAST: - rcr_val32 |= (RCR_AB | RCR_AM | RCR_APM | RCR_AAP | RCR_ACRC32); - break; - case RX_PKT_DEST_ADDR: - rcr_val32 |= (RCR_AB | RCR_AM | RCR_APM | RCR_AAP | RCR_ACRC32); - break; - case RX_PKT_PHY_MATCH: - rcr_val32 |= (RCR_APM | RCR_ACRC32); - break; - default: - rcr_val32 &= ~(RCR_AAP | RCR_APM | RCR_AM | RCR_AB | RCR_ACRC32); - break; - } - - if (rx_pkt_type == RX_PKT_DEST_ADDR) - padapter->mppriv.check_mp_pkt = 1; - else - padapter->mppriv.check_mp_pkt = 0; -#endif - rtw_write32(padapter, RCR, rcr_val32); - -#endif - _irqlevel_changed_(&oldirql, RAISE); -#endif - - return status; -} - -NDIS_STATUS oid_rt_pro_set_tx_agc_offset_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - u32 txagc; - - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len < sizeof(u32)) - return NDIS_STATUS_INVALID_LENGTH; - - txagc = *(u32 *)poid_par_priv->information_buf; - - _irqlevel_changed_(&oldirql, LOWER); - SetTxAGCOffset(Adapter, txagc); - _irqlevel_changed_(&oldirql, RAISE); - - - return status; -#else - return 0; -#endif -} - -NDIS_STATUS oid_rt_pro_set_pkt_test_mode_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - - struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; - struct mp_priv *pmppriv = &Adapter->mppriv; - u32 type; - - - if (poid_par_priv->type_of_oid != SET_OID) - return NDIS_STATUS_NOT_ACCEPTED; - - if (poid_par_priv->information_buf_len < sizeof(u32)) - return NDIS_STATUS_INVALID_LENGTH; - - type = *(u32 *)poid_par_priv->information_buf; - - if (_LOOPBOOK_MODE_ == type) { - pmppriv->mode = type; - set_fwstate(pmlmepriv, WIFI_MP_LPBK_STATE); /* append txdesc */ - } else if (_2MAC_MODE_ == type) { - pmppriv->mode = type; - _clr_fwstate_(pmlmepriv, WIFI_MP_LPBK_STATE); - } else - status = NDIS_STATUS_NOT_ACCEPTED; - - - return status; -#else - return 0; -#endif -} - -unsigned int mp_ioctl_xmit_packet_hdl(struct oid_par_priv *poid_par_priv) -{ - PMP_XMIT_PARM pparm; - PADAPTER padapter; - struct mp_priv *pmp_priv; - struct pkt_attrib *pattrib; - - - pparm = (PMP_XMIT_PARM)poid_par_priv->information_buf; - padapter = (PADAPTER)poid_par_priv->adapter_context; - pmp_priv = &padapter->mppriv; - - if (poid_par_priv->type_of_oid == QUERY_OID) { - pparm->enable = !pmp_priv->tx.stop; - pparm->count = pmp_priv->tx.sended; - } else { - if (pparm->enable == 0) - pmp_priv->tx.stop = 1; - else if (pmp_priv->tx.stop == 1) { - pmp_priv->tx.stop = 0; - pmp_priv->tx.count = pparm->count; - pmp_priv->tx.payload = pparm->payload_type; - pattrib = &pmp_priv->tx.attrib; - pattrib->pktlen = pparm->length; - _rtw_memcpy(pattrib->dst, pparm->da, ETH_ALEN); - SetPacketTx(padapter); - } else - return NDIS_STATUS_FAILURE; - } - - return NDIS_STATUS_SUCCESS; -} - -#if 0 -unsigned int mp_ioctl_xmit_packet_hdl(struct oid_par_priv *poid_par_priv) -{ - unsigned char *pframe, *pmp_pkt; - struct ethhdr *pethhdr; - struct pkt_attrib *pattrib; - struct rtw_ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - int llc_sz, payload_len; - struct mp_xmit_frame *pxframe = NULL; - struct mp_xmit_packet *pmp_xmitpkt = (struct mp_xmit_packet *)param; - u8 addr3[] = {0x02, 0xE0, 0x4C, 0x87, 0x66, 0x55}; - - /* RTW_INFO("+mp_ioctl_xmit_packet_hdl\n"); */ - - pxframe = alloc_mp_xmitframe(&padapter->mppriv); - if (pxframe == NULL) { - DEBUG_ERR(("Can't alloc pmpframe %d:%s\n", __LINE__, __FILE__)); - return -1; - } - - /* mp_xmit_pkt */ - payload_len = pmp_xmitpkt->len - 14; - pmp_pkt = (unsigned char *)pmp_xmitpkt->mem; - pethhdr = (struct ethhdr *)pmp_pkt; - - /* RTW_INFO("payload_len=%d, pkt_mem=0x%x\n", pmp_xmitpkt->len, (void*)pmp_xmitpkt->mem); */ - - /* RTW_INFO("pxframe=0x%x\n", (void*)pxframe); */ - /* RTW_INFO("pxframe->mem=0x%x\n", (void*)pxframe->mem); */ - - /* update attribute */ - pattrib = &pxframe->attrib; - memset((u8 *)(pattrib), 0, sizeof(struct pkt_attrib)); - pattrib->pktlen = pmp_xmitpkt->len; - pattrib->ether_type = ntohs(pethhdr->h_proto); - pattrib->hdrlen = 24; - pattrib->nr_frags = 1; - pattrib->priority = 0; -#ifndef CONFIG_MP_LINUX - if (IS_MCAST(pethhdr->h_dest)) - pattrib->mac_id = 4; - else - pattrib->mac_id = 5; -#else - pattrib->mac_id = 5; -#endif - - /* */ - memset(pxframe->mem, 0 , WLANHDR_OFFSET); - pframe = (u8 *)(pxframe->mem) + WLANHDR_OFFSET; - - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - set_frame_sub_type(pframe, WIFI_DATA); - - _rtw_memcpy(pwlanhdr->addr1, pethhdr->h_dest, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, pethhdr->h_source, ETH_ALEN); - - _rtw_memcpy(pwlanhdr->addr3, addr3, ETH_ALEN); - - pwlanhdr->seq_ctl = 0; - pframe += pattrib->hdrlen; - - llc_sz = rtw_put_snap(pframe, pattrib->ether_type); - pframe += llc_sz; - - _rtw_memcpy(pframe, (void *)(pmp_pkt + 14), payload_len); - - pattrib->last_txcmdsz = pattrib->hdrlen + llc_sz + payload_len; - - DEBUG_INFO(("issuing mp_xmit_frame, tx_len=%d, ether_type=0x%x\n", pattrib->last_txcmdsz, pattrib->ether_type)); - xmit_mp_frame(padapter, pxframe); - - return _SUCCESS; -} -#endif -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_set_power_down_hdl(struct oid_par_priv *poid_par_priv) -{ - u8 bpwrup; - NDIS_STATUS status = NDIS_STATUS_SUCCESS; -#ifdef PLATFORM_LINUX -#if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) - PADAPTER padapter = (PADAPTER)(poid_par_priv->adapter_context); -#endif -#endif - - - if (poid_par_priv->type_of_oid != SET_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - - - _irqlevel_changed_(&oldirql, LOWER); - - bpwrup = *(u8 *)poid_par_priv->information_buf; - /* CALL the power_down function */ -#ifdef PLATFORM_LINUX -#if defined(CONFIG_RTL8712) /* Linux MP insmod unknown symbol */ - dev_power_down(padapter, bpwrup); -#endif -#endif - _irqlevel_changed_(&oldirql, RAISE); - - /* DEBUG_ERR(("\n <=== Query OID_RT_PRO_READ_REGISTER. */ - /* Add:0x%08x Width:%d Value:0x%08x\n",RegRWStruct->offset,RegRWStruct->width,RegRWStruct->value)); */ - - - return status; -} -/* ------------------------------------------------------------------------------ */ -NDIS_STATUS oid_rt_get_power_mode_hdl(struct oid_par_priv *poid_par_priv) -{ -#if 0 - NDIS_STATUS status = NDIS_STATUS_SUCCESS; - PADAPTER Adapter = (PADAPTER)(poid_par_priv->adapter_context); - - - if (poid_par_priv->type_of_oid != QUERY_OID) { - status = NDIS_STATUS_NOT_ACCEPTED; - return status; - } - if (poid_par_priv->information_buf_len < sizeof(u32)) { - status = NDIS_STATUS_INVALID_LENGTH; - return status; - } - - - /* _irqlevel_changed_(&oldirql, LOWER); */ - *(int *)poid_par_priv->information_buf = Adapter->registrypriv.low_power ? POWER_LOW : POWER_NORMAL; - *poid_par_priv->bytes_rw = poid_par_priv->information_buf_len; - /* _irqlevel_changed_(&oldirql, RAISE); */ - - - return status; -#else - return 0; -#endif -} diff --git a/drivers/net/wireless/realtek/rtl8812au/core/rtw_rf.c b/drivers/net/wireless/realtek/rtl8812au/core/rtw_rf.c deleted file mode 100644 index 6d827c364d2e86..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/core/rtw_rf.c +++ /dev/null @@ -1,1395 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2017 Realtek Corporation. - * - * 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 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 _RTW_RF_C_ - -#include -#include - -u8 center_ch_2g[CENTER_CH_2G_NUM] = { -/* G00 */1, 2, -/* G01 */3, 4, 5, -/* G02 */6, 7, 8, -/* G03 */9, 10, 11, -/* G04 */12, 13, -/* G05 */14 -}; - -u8 center_ch_2g_40m[CENTER_CH_2G_40M_NUM] = { - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, -}; - -u8 op_chs_of_cch_2g_40m[CENTER_CH_2G_40M_NUM][2] = { - {1, 5}, /* 3 */ - {2, 6}, /* 4 */ - {3, 7}, /* 5 */ - {4, 8}, /* 6 */ - {5, 9}, /* 7 */ - {6, 10}, /* 8 */ - {7, 11}, /* 9 */ - {8, 12}, /* 10 */ - {9, 13}, /* 11 */ -}; - -u8 center_ch_5g_all[CENTER_CH_5G_ALL_NUM] = { - 15, 16, 17, 18, - 20, 24, 28, 32, -/* G00 */36, 38, 40, - 42, -/* G01 */44, 46, 48, - /* 50, */ -/* G02 */52, 54, 56, - 58, -/* G03 */60, 62, 64, - 68, 72, 76, 80, - 84, 88, 92, 96, -/* G04 */100, 102, 104, - 106, -/* G05 */108, 110, 112, - /* 114, */ -/* G06 */116, 118, 120, - 122, -/* G07 */124, 126, 128, -/* G08 */132, 134, 136, - 138, -/* G09 */140, 142, 144, -/* G10 */149, 151, 153, - 155, -/* G11 */157, 159, 161, - /* 163, */ -/* G12 */165, 167, 169, - 171, -/* G13 */173, 175, 177 -}; - -u8 center_ch_5g_20m[CENTER_CH_5G_20M_NUM] = { - 15, 16, 17, 18, - 20, 24, 28, 32, -/* G00 */36, 40, -/* G01 */44, 48, -/* G02 */52, 56, -/* G03 */60, 64, - 68, 72, 76, 80, - 84, 88, 92, 96, -/* G04 */100, 104, -/* G05 */108, 112, -/* G06 */116, 120, -/* G07 */124, 128, -/* G08 */132, 136, -/* G09 */140, 144, -/* G10 */149, 153, -/* G11 */157, 161, -/* G12 */165, 169, -/* G13 */173, 177 -}; - -u8 center_ch_5g_40m[CENTER_CH_5G_40M_NUM] = { -/* G00 */38, -/* G01 */46, -/* G02 */54, -/* G03 */62, -/* G04 */102, -/* G05 */110, -/* G06 */118, -/* G07 */126, -/* G08 */134, -/* G09 */142, -/* G10 */151, -/* G11 */159, -/* G12 */167, -/* G13 */175 -}; - -#if 0 -u8 center_ch_5g_20m_40m[CENTER_CH_5G_20M_NUM + CENTER_CH_5G_40M_NUM] = { -/* G00 */36, 38, 40, -/* G01 */44, 46, 48, -/* G02 */52, 54, 56, -/* G03 */60, 62, 64, -/* G04 */100, 102, 104, -/* G05 */108, 110, 112, -/* G06 */116, 118, 120, -/* G07 */124, 126, 128, -/* G08 */132, 134, 136, -/* G09 */140, 142, 144, -/* G10 */149, 151, 153, -/* G11 */157, 159, 161, -/* G12 */165, 167, 169, -/* G13 */173, 175, 177 -}; -#endif - -u8 op_chs_of_cch_5g_40m[CENTER_CH_5G_40M_NUM][2] = { - {36, 40}, /* 38 */ - {44, 48}, /* 46 */ - {52, 56}, /* 54 */ - {60, 64}, /* 62 */ - {100, 104}, /* 102 */ - {108, 112}, /* 110 */ - {116, 120}, /* 118 */ - {124, 128}, /* 126 */ - {132, 136}, /* 134 */ - {140, 144}, /* 142 */ - {149, 153}, /* 151 */ - {157, 161}, /* 159 */ - {165, 169}, /* 167 */ - {173, 177}, /* 175 */ -}; - -u8 center_ch_5g_80m[CENTER_CH_5G_80M_NUM] = { -/* G00 ~ G01*/42, -/* G02 ~ G03*/58, -/* G04 ~ G05*/106, -/* G06 ~ G07*/122, -/* G08 ~ G09*/138, -/* G10 ~ G11*/155, -/* G12 ~ G13*/171 -}; - -u8 op_chs_of_cch_5g_80m[CENTER_CH_5G_80M_NUM][4] = { - {36, 40, 44, 48}, /* 42 */ - {52, 56, 60, 64}, /* 58 */ - {100, 104, 108, 112}, /* 106 */ - {116, 120, 124, 128}, /* 122 */ - {132, 136, 140, 144}, /* 138 */ - {149, 153, 157, 161}, /* 155 */ - {165, 169, 173, 177}, /* 171 */ -}; - -u8 center_ch_5g_160m[CENTER_CH_5G_160M_NUM] = { -/* G00 ~ G03*/50, -/* G04 ~ G07*/114, -/* G10 ~ G13*/163 -}; - -u8 op_chs_of_cch_5g_160m[CENTER_CH_5G_160M_NUM][8] = { - {36, 40, 44, 48, 52, 56, 60, 64}, /* 50 */ - {100, 104, 108, 112, 116, 120, 124, 128}, /* 114 */ - {149, 153, 157, 161, 165, 169, 173, 177}, /* 163 */ -}; - -struct center_chs_ent_t { - u8 ch_num; - u8 *chs; -}; - -struct center_chs_ent_t center_chs_2g_by_bw[] = { - {CENTER_CH_2G_NUM, center_ch_2g}, - {CENTER_CH_2G_40M_NUM, center_ch_2g_40m}, -}; - -struct center_chs_ent_t center_chs_5g_by_bw[] = { - {CENTER_CH_5G_20M_NUM, center_ch_5g_20m}, - {CENTER_CH_5G_40M_NUM, center_ch_5g_40m}, - {CENTER_CH_5G_80M_NUM, center_ch_5g_80m}, - {CENTER_CH_5G_160M_NUM, center_ch_5g_160m}, -}; - -/* - * Get center channel of smaller bandwidth by @param cch, @param bw, @param offset - * @cch: the given center channel - * @bw: the given bandwidth - * @offset: the given primary SC offset of the given bandwidth - * - * return center channel of smaller bandiwdth if valid, or 0 - */ -u8 rtw_get_scch_by_cch_offset(u8 cch, u8 bw, u8 offset) -{ - u8 t_cch = 0; - - if (bw == CHANNEL_WIDTH_20) { - t_cch = cch; - goto exit; - } - - if (offset == HAL_PRIME_CHNL_OFFSET_DONT_CARE) { - rtw_warn_on(1); - goto exit; - } - - /* 2.4G, 40MHz */ - if (cch >= 3 && cch <= 11 && bw == CHANNEL_WIDTH_40) { - t_cch = (offset == HAL_PRIME_CHNL_OFFSET_UPPER) ? cch + 2 : cch - 2; - goto exit; - } - - /* 5G, 160MHz */ - if (cch >= 50 && cch <= 163 && bw == CHANNEL_WIDTH_160) { - t_cch = (offset == HAL_PRIME_CHNL_OFFSET_UPPER) ? cch + 8 : cch - 8; - goto exit; - - /* 5G, 80MHz */ - } else if (cch >= 42 && cch <= 171 && bw == CHANNEL_WIDTH_80) { - t_cch = (offset == HAL_PRIME_CHNL_OFFSET_UPPER) ? cch + 4 : cch - 4; - goto exit; - - /* 5G, 40MHz */ - } else if (cch >= 38 && cch <= 175 && bw == CHANNEL_WIDTH_40) { - t_cch = (offset == HAL_PRIME_CHNL_OFFSET_UPPER) ? cch + 2 : cch - 2; - goto exit; - - } else { - rtw_warn_on(1); - goto exit; - } - -exit: - return t_cch; -} - -struct op_chs_ent_t { - u8 ch_num; - u8 *chs; -}; - -struct op_chs_ent_t op_chs_of_cch_2g_by_bw[] = { - {1, center_ch_2g}, - {2, (u8 *)op_chs_of_cch_2g_40m}, -}; - -struct op_chs_ent_t op_chs_of_cch_5g_by_bw[] = { - {1, center_ch_5g_20m}, - {2, (u8 *)op_chs_of_cch_5g_40m}, - {4, (u8 *)op_chs_of_cch_5g_80m}, - {8, (u8 *)op_chs_of_cch_5g_160m}, -}; - -inline u8 center_chs_2g_num(u8 bw) -{ - if (bw > CHANNEL_WIDTH_40) - return 0; - - return center_chs_2g_by_bw[bw].ch_num; -} - -inline u8 center_chs_2g(u8 bw, u8 id) -{ - if (bw > CHANNEL_WIDTH_40) - return 0; - - if (id >= center_chs_2g_num(bw)) - return 0; - - return center_chs_2g_by_bw[bw].chs[id]; -} - -inline u8 center_chs_5g_num(u8 bw) -{ - if (bw > CHANNEL_WIDTH_80) - return 0; - - return center_chs_5g_by_bw[bw].ch_num; -} - -inline u8 center_chs_5g(u8 bw, u8 id) -{ - if (bw > CHANNEL_WIDTH_80) - return 0; - - if (id >= center_chs_5g_num(bw)) - return 0; - - return center_chs_5g_by_bw[bw].chs[id]; -} - -/* - * Get available op channels by @param cch, @param bw - * @cch: the given center channel - * @bw: the given bandwidth - * @op_chs: the pointer to return pointer of op channel array - * @op_ch_num: the pointer to return pointer of op channel number - * - * return valid (1) or not (0) - */ -u8 rtw_get_op_chs_by_cch_bw(u8 cch, u8 bw, u8 **op_chs, u8 *op_ch_num) -{ - int i; - struct center_chs_ent_t *c_chs_ent = NULL; - struct op_chs_ent_t *op_chs_ent = NULL; - u8 valid = 1; - - if (cch <= 14 - && bw >= CHANNEL_WIDTH_20 && bw <= CHANNEL_WIDTH_40 - ) { - c_chs_ent = ¢er_chs_2g_by_bw[bw]; - op_chs_ent = &op_chs_of_cch_2g_by_bw[bw]; - } else if (cch >= 36 && cch <= 177 - && bw >= CHANNEL_WIDTH_20 && bw <= CHANNEL_WIDTH_160 - ) { - c_chs_ent = ¢er_chs_5g_by_bw[bw]; - op_chs_ent = &op_chs_of_cch_5g_by_bw[bw]; - } else { - valid = 0; - goto exit; - } - - for (i = 0; i < c_chs_ent->ch_num; i++) - if (cch == *(c_chs_ent->chs + i)) - break; - - if (i == c_chs_ent->ch_num) { - valid = 0; - goto exit; - } - - *op_chs = op_chs_ent->chs + op_chs_ent->ch_num * i; - *op_ch_num = op_chs_ent->ch_num; - -exit: - return valid; -} - -u8 rtw_get_ch_group(u8 ch, u8 *group, u8 *cck_group) -{ - BAND_TYPE band = BAND_MAX; - s8 gp = -1, cck_gp = -1; - - if (ch <= 14) { - band = BAND_ON_2_4G; - - if (1 <= ch && ch <= 2) - gp = 0; - else if (3 <= ch && ch <= 5) - gp = 1; - else if (6 <= ch && ch <= 8) - gp = 2; - else if (9 <= ch && ch <= 11) - gp = 3; - else if (12 <= ch && ch <= 14) - gp = 4; - else - band = BAND_MAX; - - if (ch == 14) - cck_gp = 5; - else - cck_gp = gp; - } else { - band = BAND_ON_5G; - - if (15 <= ch && ch <= 42) - gp = 0; - else if (44 <= ch && ch <= 48) - gp = 1; - else if (50 <= ch && ch <= 58) - gp = 2; - else if (60 <= ch && ch <= 80) - gp = 3; - else if (82 <= ch && ch <= 106) - gp = 4; - else if (108 <= ch && ch <= 114) - gp = 5; - else if (116 <= ch && ch <= 122) - gp = 6; - else if (124 <= ch && ch <= 130) - gp = 7; - else if (132 <= ch && ch <= 138) - gp = 8; - else if (140 <= ch && ch <= 144) - gp = 9; - else if (149 <= ch && ch <= 155) - gp = 10; - else if (157 <= ch && ch <= 161) - gp = 11; - else if (165 <= ch && ch <= 171) - gp = 12; - else if (173 <= ch && ch <= 177) - gp = 13; - else - band = BAND_MAX; - } - - if (band == BAND_MAX - || (band == BAND_ON_2_4G && cck_gp == -1) - || gp == -1 - ) { - RTW_WARN("%s invalid channel:%u", __func__, ch); - rtw_warn_on(1); - goto exit; - } - - if (group) - *group = gp; - if (cck_group && band == BAND_ON_2_4G) - *cck_group = cck_gp; - -exit: - return band; -} - -int rtw_ch2freq(int chan) -{ - /* see 802.11 17.3.8.3.2 and Annex J - * there are overlapping channel numbers in 5GHz and 2GHz bands */ - - /* - * RTK: don't consider the overlapping channel numbers: 5G channel <= 14, - * because we don't support it. simply judge from channel number - */ - - if (chan >= 1 && chan <= 14) { - if (chan == 14) - return 2484; - else if (chan < 14) - return 2407 + chan * 5; - } else if (chan >= 15 && chan <= 177) - return 5000 + chan * 5; - - return 0; /* not supported */ -} - -int rtw_freq2ch(int freq) -{ - /* see 802.11 17.3.8.3.2 and Annex J */ - if (freq == 2484) - return 14; - else if (freq < 2484) - return (freq - 2407) / 5; - else if (freq >= 4910 && freq <= 4980) - return (freq - 4000) / 5; - else if (freq <= 45000) /* DMG band lower limit */ - return (freq - 5000) / 5; - else if (freq >= 58320 && freq <= 64800) - return (freq - 56160) / 2160; - else - return 0; -} - -bool rtw_chbw_to_freq_range(u8 ch, u8 bw, u8 offset, u32 *hi, u32 *lo) -{ - u8 c_ch; - u32 freq; - u32 hi_ret = 0, lo_ret = 0; - bool valid = _FALSE; - - if (hi) - *hi = 0; - if (lo) - *lo = 0; - - c_ch = rtw_get_center_ch(ch, bw, offset); - freq = rtw_ch2freq(c_ch); - - if (!freq) { - rtw_warn_on(1); - goto exit; - } - - if (bw == CHANNEL_WIDTH_80) { - hi_ret = freq + 40; - lo_ret = freq - 40; - } else if (bw == CHANNEL_WIDTH_40) { - hi_ret = freq + 20; - lo_ret = freq - 20; - } else if (bw == CHANNEL_WIDTH_20) { - hi_ret = freq + 10; - lo_ret = freq - 10; - } else - rtw_warn_on(1); - - if (hi) - *hi = hi_ret; - if (lo) - *lo = lo_ret; - - valid = _TRUE; - -exit: - return valid; -} - -const char *const _ch_width_str[CHANNEL_WIDTH_MAX] = { - "20MHz", - "40MHz", - "80MHz", - "160MHz", - "80_80MHz", - "5MHz", - "10MHz", -}; - -const u8 _ch_width_to_bw_cap[CHANNEL_WIDTH_MAX] = { - BW_CAP_20M, - BW_CAP_40M, - BW_CAP_80M, - BW_CAP_160M, - BW_CAP_80_80M, - BW_CAP_5M, - BW_CAP_10M, -}; - -const char *const _band_str[] = { - "2.4G", - "5G", - "BOTH", - "BAND_MAX", -}; - -const u8 _band_to_band_cap[] = { - BAND_CAP_2G, - BAND_CAP_5G, - 0, - 0, -}; - -const u8 _rf_type_to_rf_tx_cnt[] = { - 1, /*RF_1T1R*/ - 1, /*RF_1T2R*/ - 2, /*RF_2T2R*/ - 2, /*RF_2T3R*/ - 2, /*RF_2T4R*/ - 3, /*RF_3T3R*/ - 3, /*RF_3T4R*/ - 4, /*RF_4T4R*/ - 1, /*RF_TYPE_MAX*/ -}; - -const u8 _rf_type_to_rf_rx_cnt[] = { - 1, /*RF_1T1R*/ - 2, /*RF_1T2R*/ - 2, /*RF_2T2R*/ - 3, /*RF_2T3R*/ - 4, /*RF_2T4R*/ - 3, /*RF_3T3R*/ - 4, /*RF_3T4R*/ - 4, /*RF_4T4R*/ - 1, /*RF_TYPE_MAX*/ -}; - -const char *const _regd_str[] = { - "NONE", - "FCC", - "MKK", - "ETSI", - "IC", - "KCC", - "ACMA", - "CHILE", - "WW", -}; - -#if CONFIG_TXPWR_LIMIT -void _dump_regd_exc_list(void *sel, struct rf_ctl_t *rfctl) -{ - struct regd_exc_ent *ent; - _list *cur, *head; - - RTW_PRINT_SEL(sel, "regd_exc_num:%u\n", rfctl->regd_exc_num); - - if (!rfctl->regd_exc_num) - goto exit; - - RTW_PRINT_SEL(sel, "%-7s %-6s %-9s\n", "country", "domain", "regd_name"); - - head = &rfctl->reg_exc_list; - cur = get_next(head); - - while ((rtw_end_of_queue_search(head, cur)) == _FALSE) { - u8 has_country; - - ent = LIST_CONTAINOR(cur, struct regd_exc_ent, list); - cur = get_next(cur); - has_country = (ent->country[0] == '\0' && ent->country[1] == '\0') ? 0 : 1; - - RTW_PRINT_SEL(sel, " %c%c 0x%02x %s\n" - , has_country ? ent->country[0] : '0' - , has_country ? ent->country[1] : '0' - , ent->domain - , ent->regd_name - ); - } - -exit: - return; -} - -inline void dump_regd_exc_list(void *sel, struct rf_ctl_t *rfctl) -{ - _irqL irqL; - - _enter_critical_mutex(&rfctl->txpwr_lmt_mutex, &irqL); - _dump_regd_exc_list(sel, rfctl); - _exit_critical_mutex(&rfctl->txpwr_lmt_mutex, &irqL); -} - -void rtw_regd_exc_add_with_nlen(struct rf_ctl_t *rfctl, const char *country, u8 domain, const char *regd_name, u32 nlen) -{ - struct regd_exc_ent *ent; - _irqL irqL; - - if (!regd_name || !nlen) { - rtw_warn_on(1); - goto exit; - } - - ent = (struct regd_exc_ent *)rtw_zmalloc(sizeof(struct regd_exc_ent) + nlen + 1); - if (!ent) - goto exit; - - _rtw_init_listhead(&ent->list); - if (country) - _rtw_memcpy(ent->country, country, 2); - ent->domain = domain; - _rtw_memcpy(ent->regd_name, regd_name, nlen); - - _enter_critical_mutex(&rfctl->txpwr_lmt_mutex, &irqL); - - rtw_list_insert_tail(&ent->list, &rfctl->reg_exc_list); - rfctl->regd_exc_num++; - - _exit_critical_mutex(&rfctl->txpwr_lmt_mutex, &irqL); - -exit: - return; -} - -inline void rtw_regd_exc_add(struct rf_ctl_t *rfctl, const char *country, u8 domain, const char *regd_name) -{ - rtw_regd_exc_add_with_nlen(rfctl, country, domain, regd_name, strlen(regd_name)); -} - -struct regd_exc_ent *_rtw_regd_exc_search(struct rf_ctl_t *rfctl, const char *country, u8 domain) -{ - struct regd_exc_ent *ent; - _list *cur, *head; - u8 match = 0; - - head = &rfctl->reg_exc_list; - cur = get_next(head); - - while ((rtw_end_of_queue_search(head, cur)) == _FALSE) { - u8 has_country; - - ent = LIST_CONTAINOR(cur, struct regd_exc_ent, list); - cur = get_next(cur); - has_country = (ent->country[0] == '\0' && ent->country[1] == '\0') ? 0 : 1; - - /* entry has country condition to match */ - if (has_country) { - if (!country) - continue; - if (ent->country[0] != country[0] - || ent->country[1] != country[1]) - continue; - } - - /* entry has domain condition to match */ - if (ent->domain != 0xFF) { - if (domain == 0xFF) - continue; - if (ent->domain != domain) - continue; - } - - match = 1; - break; - } - - if (match) - return ent; - else - return NULL; -} - -inline struct regd_exc_ent *rtw_regd_exc_search(struct rf_ctl_t *rfctl, const char *country, u8 domain) -{ - struct regd_exc_ent *ent; - _irqL irqL; - - _enter_critical_mutex(&rfctl->txpwr_lmt_mutex, &irqL); - ent = _rtw_regd_exc_search(rfctl, country, domain); - _exit_critical_mutex(&rfctl->txpwr_lmt_mutex, &irqL); - - return ent; -} - -void rtw_regd_exc_list_free(struct rf_ctl_t *rfctl) -{ - struct regd_exc_ent *ent; - _irqL irqL; - _list *cur, *head; - - _enter_critical_mutex(&rfctl->txpwr_lmt_mutex, &irqL); - - head = &rfctl->reg_exc_list; - cur = get_next(head); - - while ((rtw_end_of_queue_search(head, cur)) == _FALSE) { - ent = LIST_CONTAINOR(cur, struct regd_exc_ent, list); - cur = get_next(cur); - rtw_list_delete(&ent->list); - rtw_mfree((u8 *)ent, sizeof(struct regd_exc_ent) + strlen(ent->regd_name) + 1); - } - rfctl->regd_exc_num = 0; - - _exit_critical_mutex(&rfctl->txpwr_lmt_mutex, &irqL); -} - -void dump_txpwr_lmt(void *sel, _adapter *adapter) -{ -#define TMP_STR_LEN 16 - struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter); - struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter); - _irqL irqL; - char fmt[16]; - char tmp_str[TMP_STR_LEN]; - s8 *lmt_idx = NULL; - int bw, band, ch_num, tlrs, ntx_idx, rs, i, path; - u8 ch, n, rfpath_num; - - _enter_critical_mutex(&rfctl->txpwr_lmt_mutex, &irqL); - - _dump_regd_exc_list(sel, rfctl); - RTW_PRINT_SEL(sel, "\n"); - - if (!rfctl->txpwr_regd_num) - goto release_lock; - - lmt_idx = rtw_malloc(sizeof(s8) * RF_PATH_MAX * rfctl->txpwr_regd_num); - if (!lmt_idx) { - RTW_ERR("%s alloc fail\n", __func__); - goto release_lock; - } - - RTW_PRINT_SEL(sel, "txpwr_lmt_2g_cck_ofdm_state:0x%02x\n", rfctl->txpwr_lmt_2g_cck_ofdm_state); - #ifdef CONFIG_IEEE80211_BAND_5GHZ - if (IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(adapter)) { - RTW_PRINT_SEL(sel, "txpwr_lmt_5g_cck_ofdm_state:0x%02x\n", rfctl->txpwr_lmt_5g_cck_ofdm_state); - RTW_PRINT_SEL(sel, "txpwr_lmt_5g_20_40_ref:0x%02x\n", rfctl->txpwr_lmt_5g_20_40_ref); - } - #endif - RTW_PRINT_SEL(sel, "\n"); - - for (band = BAND_ON_2_4G; band <= BAND_ON_5G; band++) { - if (!hal_is_band_support(adapter, band)) - continue; - - rfpath_num = (band == BAND_ON_2_4G ? hal_spec->rfpath_num_2g : hal_spec->rfpath_num_5g); - - for (bw = 0; bw < MAX_5G_BANDWIDTH_NUM; bw++) { - - if (bw >= CHANNEL_WIDTH_160) - break; - if (band == BAND_ON_2_4G && bw >= CHANNEL_WIDTH_80) - break; - - if (band == BAND_ON_2_4G) - ch_num = CENTER_CH_2G_NUM; - else - ch_num = center_chs_5g_num(bw); - - if (ch_num == 0) { - rtw_warn_on(1); - break; - } - - for (tlrs = TXPWR_LMT_RS_CCK; tlrs < TXPWR_LMT_RS_NUM; tlrs++) { - - if (band == BAND_ON_2_4G && tlrs == TXPWR_LMT_RS_VHT) - continue; - if (band == BAND_ON_5G && tlrs == TXPWR_LMT_RS_CCK) - continue; - if (bw > CHANNEL_WIDTH_20 && (tlrs == TXPWR_LMT_RS_CCK || tlrs == TXPWR_LMT_RS_OFDM)) - continue; - if (bw > CHANNEL_WIDTH_40 && tlrs == TXPWR_LMT_RS_HT) - continue; - if (tlrs == TXPWR_LMT_RS_VHT && !IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(adapter)) - continue; - - for (ntx_idx = RF_1TX; ntx_idx < MAX_TX_COUNT; ntx_idx++) { - struct txpwr_lmt_ent *ent; - _list *cur, *head; - - if (ntx_idx >= hal_spec->tx_nss_num) - continue; - - /* bypass CCK multi-TX is not defined */ - if (tlrs == TXPWR_LMT_RS_CCK && ntx_idx > RF_1TX) { - if (band == BAND_ON_2_4G - && !(rfctl->txpwr_lmt_2g_cck_ofdm_state & (TXPWR_LMT_HAS_CCK_1T << ntx_idx))) - continue; - } - - /* bypass OFDM multi-TX is not defined */ - if (tlrs == TXPWR_LMT_RS_OFDM && ntx_idx > RF_1TX) { - if (band == BAND_ON_2_4G - && !(rfctl->txpwr_lmt_2g_cck_ofdm_state & (TXPWR_LMT_HAS_OFDM_1T << ntx_idx))) - continue; - #ifdef CONFIG_IEEE80211_BAND_5GHZ - if (band == BAND_ON_5G - && !(rfctl->txpwr_lmt_5g_cck_ofdm_state & (TXPWR_LMT_HAS_OFDM_1T << ntx_idx))) - continue; - #endif - } - - /* bypass 5G 20M, 40M pure reference */ - #ifdef CONFIG_IEEE80211_BAND_5GHZ - if (band == BAND_ON_5G && (bw == CHANNEL_WIDTH_20 || bw == CHANNEL_WIDTH_40)) { - if (rfctl->txpwr_lmt_5g_20_40_ref == TXPWR_LMT_REF_HT_FROM_VHT) { - if (tlrs == TXPWR_LMT_RS_HT) - continue; - } else if (rfctl->txpwr_lmt_5g_20_40_ref == TXPWR_LMT_REF_VHT_FROM_HT) { - if (tlrs == TXPWR_LMT_RS_VHT && bw <= CHANNEL_WIDTH_40) - continue; - } - } - #endif - - /* choose n-SS mapping rate section to get lmt diff value */ - if (tlrs == TXPWR_LMT_RS_CCK) - rs = CCK; - else if (tlrs == TXPWR_LMT_RS_OFDM) - rs = OFDM; - else if (tlrs == TXPWR_LMT_RS_HT) - rs = HT_1SS + ntx_idx; - else if (tlrs == TXPWR_LMT_RS_VHT) - rs = VHT_1SS + ntx_idx; - else { - RTW_ERR("%s invalid tlrs %u\n", __func__, tlrs); - continue; - } - - RTW_PRINT_SEL(sel, "[%s][%s][%s][%uT]\n" - , band_str(band) - , ch_width_str(bw) - , txpwr_lmt_rs_str(tlrs) - , ntx_idx + 1 - ); - - /* header for limit in db */ - RTW_PRINT_SEL(sel, "%3s ", "ch"); - - head = &rfctl->txpwr_lmt_list; - cur = get_next(head); - while ((rtw_end_of_queue_search(head, cur)) == _FALSE) { - ent = LIST_CONTAINOR(cur, struct txpwr_lmt_ent, list); - cur = get_next(cur); - - sprintf(fmt, "%%%zus%%s ", strlen(ent->regd_name) >= 6 ? 1 : 6 - strlen(ent->regd_name)); - snprintf(tmp_str, TMP_STR_LEN, fmt - , strcmp(ent->regd_name, rfctl->regd_name) == 0 ? "*" : "" - , ent->regd_name); - _RTW_PRINT_SEL(sel, "%s", tmp_str); - } - sprintf(fmt, "%%%zus%%s ", strlen(regd_str(TXPWR_LMT_WW)) >= 6 ? 1 : 6 - strlen(regd_str(TXPWR_LMT_WW))); - snprintf(tmp_str, TMP_STR_LEN, fmt - , strcmp(rfctl->regd_name, regd_str(TXPWR_LMT_WW)) == 0 ? "*" : "" - , regd_str(TXPWR_LMT_WW)); - _RTW_PRINT_SEL(sel, "%s", tmp_str); - - /* header for limit offset */ - for (path = 0; path < RF_PATH_MAX; path++) { - if (path >= rfpath_num) - break; - _RTW_PRINT_SEL(sel, "|"); - head = &rfctl->txpwr_lmt_list; - cur = get_next(head); - while ((rtw_end_of_queue_search(head, cur)) == _FALSE) { - ent = LIST_CONTAINOR(cur, struct txpwr_lmt_ent, list); - cur = get_next(cur); - _RTW_PRINT_SEL(sel, "%3c " - , strcmp(ent->regd_name, rfctl->regd_name) == 0 ? rf_path_char(path) : ' '); - } - _RTW_PRINT_SEL(sel, "%3c " - , strcmp(rfctl->regd_name, regd_str(TXPWR_LMT_WW)) == 0 ? rf_path_char(path) : ' '); - } - _RTW_PRINT_SEL(sel, "\n"); - - for (n = 0; n < ch_num; n++) { - s8 lmt; - s8 lmt_offset; - u8 base; - - if (band == BAND_ON_2_4G) - ch = n + 1; - else - ch = center_chs_5g(bw, n); - - if (ch == 0) { - rtw_warn_on(1); - break; - } - - /* dump limit in db */ - RTW_PRINT_SEL(sel, "%3u ", ch); - head = &rfctl->txpwr_lmt_list; - cur = get_next(head); - while ((rtw_end_of_queue_search(head, cur)) == _FALSE) { - ent = LIST_CONTAINOR(cur, struct txpwr_lmt_ent, list); - cur = get_next(cur); - lmt = phy_get_txpwr_lmt_abs(adapter, ent->regd_name, band, bw, tlrs, ntx_idx, ch, 0); - if (lmt == hal_spec->txgi_max) { - sprintf(fmt, "%%%zus ", strlen(ent->regd_name) >= 6 ? strlen(ent->regd_name) + 1 : 6); - snprintf(tmp_str, TMP_STR_LEN, fmt, "NA"); - _RTW_PRINT_SEL(sel, "%s", tmp_str); - } else if (lmt > -hal_spec->txgi_pdbm && lmt < 0) { /* -0.xx */ - sprintf(fmt, "%%%zus-0.%%d ", strlen(ent->regd_name) >= 6 ? strlen(ent->regd_name) - 4 : 1); - snprintf(tmp_str, TMP_STR_LEN, fmt, "", (rtw_abs(lmt) % hal_spec->txgi_pdbm) * 100 / hal_spec->txgi_pdbm); - _RTW_PRINT_SEL(sel, "%s", tmp_str); - } else if (lmt % hal_spec->txgi_pdbm) { /* d.xx */ - sprintf(fmt, "%%%zud.%%d ", strlen(ent->regd_name) >= 6 ? strlen(ent->regd_name) - 2 : 3); - snprintf(tmp_str, TMP_STR_LEN, fmt, lmt / hal_spec->txgi_pdbm, (rtw_abs(lmt) % hal_spec->txgi_pdbm) * 100 / hal_spec->txgi_pdbm); - _RTW_PRINT_SEL(sel, "%s", tmp_str); - } else { /* d */ - sprintf(fmt, "%%%zud ", strlen(ent->regd_name) >= 6 ? strlen(ent->regd_name) + 1 : 6); - snprintf(tmp_str, TMP_STR_LEN, fmt, lmt / hal_spec->txgi_pdbm); - _RTW_PRINT_SEL(sel, "%s", tmp_str); - } - } - lmt = phy_get_txpwr_lmt_abs(adapter, regd_str(TXPWR_LMT_WW), band, bw, tlrs, ntx_idx, ch, 0); - if (lmt == hal_spec->txgi_max) { - sprintf(fmt, "%%%zus ", strlen(regd_str(TXPWR_LMT_WW)) >= 6 ? strlen(regd_str(TXPWR_LMT_WW)) + 1 : 6); - snprintf(tmp_str, TMP_STR_LEN, fmt, "NA"); - _RTW_PRINT_SEL(sel, "%s", tmp_str); - } else if (lmt > -hal_spec->txgi_pdbm && lmt < 0) { /* -0.xx */ - sprintf(fmt, "%%%zus-0.%%d ", strlen(regd_str(TXPWR_LMT_WW)) >= 6 ? strlen(regd_str(TXPWR_LMT_WW)) - 4 : 1); - snprintf(tmp_str, TMP_STR_LEN, fmt, "", (rtw_abs(lmt) % hal_spec->txgi_pdbm) * 100 / hal_spec->txgi_pdbm); - _RTW_PRINT_SEL(sel, "%s", tmp_str); - } else if (lmt % hal_spec->txgi_pdbm) { /* d.xx */ - sprintf(fmt, "%%%zud.%%d ", strlen(regd_str(TXPWR_LMT_WW)) >= 6 ? strlen(regd_str(TXPWR_LMT_WW)) - 2 : 3); - snprintf(tmp_str, TMP_STR_LEN, fmt, lmt / hal_spec->txgi_pdbm, (rtw_abs(lmt) % hal_spec->txgi_pdbm) * 100 / hal_spec->txgi_pdbm); - _RTW_PRINT_SEL(sel, "%s", tmp_str); - } else { /* d */ - sprintf(fmt, "%%%zud ", strlen(regd_str(TXPWR_LMT_WW)) >= 6 ? strlen(regd_str(TXPWR_LMT_WW)) + 1 : 6); - snprintf(tmp_str, TMP_STR_LEN, fmt, lmt / hal_spec->txgi_pdbm); - _RTW_PRINT_SEL(sel, "%s", tmp_str); - } - - /* dump limit offset of each path */ - for (path = RF_PATH_A; path < RF_PATH_MAX; path++) { - if (path >= rfpath_num) - break; - - base = PHY_GetTxPowerByRateBase(adapter, band, path, rs); - - _RTW_PRINT_SEL(sel, "|"); - head = &rfctl->txpwr_lmt_list; - cur = get_next(head); - i = 0; - while ((rtw_end_of_queue_search(head, cur)) == _FALSE) { - ent = LIST_CONTAINOR(cur, struct txpwr_lmt_ent, list); - cur = get_next(cur); - lmt_offset = phy_get_txpwr_lmt(adapter, ent->regd_name, band, bw, path, rs, ntx_idx, ch, 0); - if (lmt_offset == hal_spec->txgi_max) { - *(lmt_idx + i * RF_PATH_MAX + path) = hal_spec->txgi_max; - _RTW_PRINT_SEL(sel, "%3s ", "NA"); - } else { - *(lmt_idx + i * RF_PATH_MAX + path) = lmt_offset + base; - _RTW_PRINT_SEL(sel, "%3d ", lmt_offset); - } - i++; - } - lmt_offset = phy_get_txpwr_lmt(adapter, regd_str(TXPWR_LMT_WW), band, bw, path, rs, ntx_idx, ch, 0); - if (lmt_offset == hal_spec->txgi_max) - _RTW_PRINT_SEL(sel, "%3s ", "NA"); - else - _RTW_PRINT_SEL(sel, "%3d ", lmt_offset); - - } - - /* compare limit_idx of each path, print 'x' when mismatch */ - if (rfpath_num > 1) { - for (i = 0; i < rfctl->txpwr_regd_num; i++) { - for (path = 0; path < RF_PATH_MAX; path++) { - if (path >= rfpath_num) - break; - if (*(lmt_idx + i * RF_PATH_MAX + path) != *(lmt_idx + i * RF_PATH_MAX + ((path + 1) % rfpath_num))) - break; - } - if (path >= rfpath_num) - _RTW_PRINT_SEL(sel, " "); - else - _RTW_PRINT_SEL(sel, "x"); - } - } - _RTW_PRINT_SEL(sel, "\n"); - - } - RTW_PRINT_SEL(sel, "\n"); - } - } /* loop for rate sections */ - } /* loop for bandwidths */ - } /* loop for bands */ - - if (lmt_idx) - rtw_mfree(lmt_idx, sizeof(s8) * RF_PATH_MAX * rfctl->txpwr_regd_num); - -release_lock: - _exit_critical_mutex(&rfctl->txpwr_lmt_mutex, &irqL); -} - -/* search matcing first, if not found, alloc one */ -void rtw_txpwr_lmt_add_with_nlen(struct rf_ctl_t *rfctl, const char *regd_name, u32 nlen - , u8 band, u8 bw, u8 tlrs, u8 ntx_idx, u8 ch_idx, s8 lmt) -{ - struct hal_spec_t *hal_spec = GET_HAL_SPEC(dvobj_get_primary_adapter(rfctl_to_dvobj(rfctl))); - struct txpwr_lmt_ent *ent; - _irqL irqL; - _list *cur, *head; - s8 pre_lmt; - - if (!regd_name || !nlen) { - rtw_warn_on(1); - goto exit; - } - - _enter_critical_mutex(&rfctl->txpwr_lmt_mutex, &irqL); - - /* search for existed entry */ - head = &rfctl->txpwr_lmt_list; - cur = get_next(head); - while ((rtw_end_of_queue_search(head, cur)) == _FALSE) { - ent = LIST_CONTAINOR(cur, struct txpwr_lmt_ent, list); - cur = get_next(cur); - - if (strlen(ent->regd_name) == nlen - && _rtw_memcmp(ent->regd_name, regd_name, nlen) == _TRUE) - goto chk_lmt_val; - } - - /* alloc new one */ - ent = (struct txpwr_lmt_ent *)rtw_zvmalloc(sizeof(struct txpwr_lmt_ent) + nlen + 1); - if (!ent) - goto release_lock; - - _rtw_init_listhead(&ent->list); - _rtw_memcpy(ent->regd_name, regd_name, nlen); - { - u8 j, k, l, m; - - for (j = 0; j < MAX_2_4G_BANDWIDTH_NUM; ++j) - for (k = 0; k < TXPWR_LMT_RS_NUM_2G; ++k) - for (m = 0; m < CENTER_CH_2G_NUM; ++m) - for (l = 0; l < MAX_TX_COUNT; ++l) - ent->lmt_2g[j][k][m][l] = hal_spec->txgi_max; - #ifdef CONFIG_IEEE80211_BAND_5GHZ - for (j = 0; j < MAX_5G_BANDWIDTH_NUM; ++j) - for (k = 0; k < TXPWR_LMT_RS_NUM_5G; ++k) - for (m = 0; m < CENTER_CH_5G_ALL_NUM; ++m) - for (l = 0; l < MAX_TX_COUNT; ++l) - ent->lmt_5g[j][k][m][l] = hal_spec->txgi_max; - #endif - } - - rtw_list_insert_tail(&ent->list, &rfctl->txpwr_lmt_list); - rfctl->txpwr_regd_num++; - -chk_lmt_val: - if (band == BAND_ON_2_4G) - pre_lmt = ent->lmt_2g[bw][tlrs][ch_idx][ntx_idx]; - #ifdef CONFIG_IEEE80211_BAND_5GHZ - else if (band == BAND_ON_5G) - pre_lmt = ent->lmt_5g[bw][tlrs - 1][ch_idx][ntx_idx]; - #endif - else - goto release_lock; - - if (pre_lmt != hal_spec->txgi_max) - RTW_PRINT("duplicate txpwr_lmt for [%s][%s][%s][%s][%uT][%d]\n" - , regd_name, band_str(band), ch_width_str(bw), txpwr_lmt_rs_str(tlrs), ntx_idx + 1 - , band == BAND_ON_2_4G ? ch_idx + 1 : center_ch_5g_all[ch_idx]); - - lmt = rtw_min(pre_lmt, lmt); - if (band == BAND_ON_2_4G) - ent->lmt_2g[bw][tlrs][ch_idx][ntx_idx] = lmt; - #ifdef CONFIG_IEEE80211_BAND_5GHZ - else if (band == BAND_ON_5G) - ent->lmt_5g[bw][tlrs - 1][ch_idx][ntx_idx] = lmt; - #endif - - if (0) - RTW_PRINT("%s, %4s, %6s, %7s, %uT, ch%3d = %d\n" - , regd_name, band_str(band), ch_width_str(bw), txpwr_lmt_rs_str(tlrs), ntx_idx + 1 - , band == BAND_ON_2_4G ? ch_idx + 1 : center_ch_5g_all[ch_idx] - , lmt); - -release_lock: - _exit_critical_mutex(&rfctl->txpwr_lmt_mutex, &irqL); - -exit: - return; -} - -inline void rtw_txpwr_lmt_add(struct rf_ctl_t *rfctl, const char *regd_name - , u8 band, u8 bw, u8 tlrs, u8 ntx_idx, u8 ch_idx, s8 lmt) -{ - rtw_txpwr_lmt_add_with_nlen(rfctl, regd_name, strlen(regd_name) - , band, bw, tlrs, ntx_idx, ch_idx, lmt); -} - -struct txpwr_lmt_ent *_rtw_txpwr_lmt_get_by_name(struct rf_ctl_t *rfctl, const char *regd_name) -{ - struct txpwr_lmt_ent *ent; - _list *cur, *head; - u8 found = 0; - - head = &rfctl->txpwr_lmt_list; - cur = get_next(head); - - while ((rtw_end_of_queue_search(head, cur)) == _FALSE) { - ent = LIST_CONTAINOR(cur, struct txpwr_lmt_ent, list); - cur = get_next(cur); - - if (strcmp(ent->regd_name, regd_name) == 0) { - found = 1; - break; - } - } - - if (found) - return ent; - return NULL; -} - -inline struct txpwr_lmt_ent *rtw_txpwr_lmt_get_by_name(struct rf_ctl_t *rfctl, const char *regd_name) -{ - struct txpwr_lmt_ent *ent; - _irqL irqL; - - _enter_critical_mutex(&rfctl->txpwr_lmt_mutex, &irqL); - ent = _rtw_txpwr_lmt_get_by_name(rfctl, regd_name); - _exit_critical_mutex(&rfctl->txpwr_lmt_mutex, &irqL); - - return ent; -} - -void rtw_txpwr_lmt_list_free(struct rf_ctl_t *rfctl) -{ - struct txpwr_lmt_ent *ent; - _irqL irqL; - _list *cur, *head; - - _enter_critical_mutex(&rfctl->txpwr_lmt_mutex, &irqL); - - head = &rfctl->txpwr_lmt_list; - cur = get_next(head); - - while ((rtw_end_of_queue_search(head, cur)) == _FALSE) { - ent = LIST_CONTAINOR(cur, struct txpwr_lmt_ent, list); - cur = get_next(cur); - if (ent->regd_name == rfctl->regd_name) - rfctl->regd_name = regd_str(TXPWR_LMT_NONE); - rtw_list_delete(&ent->list); - rtw_vmfree((u8 *)ent, sizeof(struct txpwr_lmt_ent) + strlen(ent->regd_name) + 1); - } - rfctl->txpwr_regd_num = 0; - - _exit_critical_mutex(&rfctl->txpwr_lmt_mutex, &irqL); -} -#endif /* CONFIG_TXPWR_LIMIT */ - -int rtw_ch_to_bb_gain_sel(int ch) -{ - int sel = -1; - - if (ch >= 1 && ch <= 14) - sel = BB_GAIN_2G; -#ifdef CONFIG_IEEE80211_BAND_5GHZ - else if (ch >= 36 && ch < 48) - sel = BB_GAIN_5GLB1; - else if (ch >= 52 && ch <= 64) - sel = BB_GAIN_5GLB2; - else if (ch >= 100 && ch <= 120) - sel = BB_GAIN_5GMB1; - else if (ch >= 124 && ch <= 144) - sel = BB_GAIN_5GMB2; - else if (ch >= 149 && ch <= 177) - sel = BB_GAIN_5GHB; -#endif - - return sel; -} - -s8 rtw_rf_get_kfree_tx_gain_offset(_adapter *padapter, u8 path, u8 ch) -{ - s8 kfree_offset = 0; - -#ifdef CONFIG_RF_POWER_TRIM - struct kfree_data_t *kfree_data = GET_KFREE_DATA(padapter); - s8 bb_gain_sel = rtw_ch_to_bb_gain_sel(ch); - - if (bb_gain_sel < BB_GAIN_2G || bb_gain_sel >= BB_GAIN_NUM) { - rtw_warn_on(1); - goto exit; - } - - if (kfree_data->flag & KFREE_FLAG_ON) { - kfree_offset = kfree_data->bb_gain[bb_gain_sel][path]; - if (IS_HARDWARE_TYPE_8723D(padapter)) - RTW_INFO("%s path:%s, ch:%u, bb_gain_sel:%d, kfree_offset:%d\n" - , __func__, (path == 0)?"S1":"S0", - ch, bb_gain_sel, kfree_offset); - else - RTW_INFO("%s path:%u, ch:%u, bb_gain_sel:%d, kfree_offset:%d\n" - , __func__, path, ch, bb_gain_sel, kfree_offset); - } -exit: -#endif /* CONFIG_RF_POWER_TRIM */ - return kfree_offset; -} - -void rtw_rf_set_tx_gain_offset(_adapter *adapter, u8 path, s8 offset) -{ -#if defined(CONFIG_RTL8821A) - u8 write_value; -#endif - u8 target_path = 0; - u32 val32 = 0; - - if (IS_HARDWARE_TYPE_8723D(adapter)) { - target_path = RF_PATH_A; /*in 8723D case path means S0/S1*/ - if (path == PPG_8723D_S1) - RTW_INFO("kfree gain_offset 0x55:0x%x ", - rtw_hal_read_rfreg(adapter, target_path, 0x55, 0xffffffff)); - else if (path == PPG_8723D_S0) - RTW_INFO("kfree gain_offset 0x65:0x%x ", - rtw_hal_read_rfreg(adapter, target_path, 0x65, 0xffffffff)); - } else { - target_path = path; - RTW_INFO("kfree gain_offset 0x55:0x%x ", rtw_hal_read_rfreg(adapter, target_path, 0x55, 0xffffffff)); - } - - switch (rtw_get_chip_type(adapter)) { -#ifdef CONFIG_RTL8723D - case RTL8723D: - write_value = RF_TX_GAIN_OFFSET_8723D(offset); - if (path == PPG_8723D_S1) - rtw_hal_write_rfreg(adapter, target_path, 0x55, 0x0f8000, write_value); - else if (path == PPG_8723D_S0) - rtw_hal_write_rfreg(adapter, target_path, 0x65, 0x0f8000, write_value); - break; -#endif /* CONFIG_RTL8723D */ -#ifdef CONFIG_RTL8703B - case RTL8703B: - write_value = RF_TX_GAIN_OFFSET_8703B(offset); - rtw_hal_write_rfreg(adapter, target_path, 0x55, 0x0fc000, write_value); - break; -#endif /* CONFIG_RTL8703B */ -#ifdef CONFIG_RTL8188F - case RTL8188F: - write_value = RF_TX_GAIN_OFFSET_8188F(offset); - rtw_hal_write_rfreg(adapter, target_path, 0x55, 0x0fc000, write_value); - break; -#endif /* CONFIG_RTL8188F */ -#ifdef CONFIG_RTL8188GTV - case RTL8188GTV: - write_value = RF_TX_GAIN_OFFSET_8188GTV(offset); - rtw_hal_write_rfreg(adapter, target_path, 0x55, 0x0fc000, write_value); - break; -#endif /* CONFIG_RTL8188GTV */ -#ifdef CONFIG_RTL8192E - case RTL8192E: - write_value = RF_TX_GAIN_OFFSET_8192E(offset); - rtw_hal_write_rfreg(adapter, target_path, 0x55, 0x0f8000, write_value); - break; -#endif /* CONFIG_RTL8188F */ - -#ifdef CONFIG_RTL8821A - case RTL8821: - write_value = RF_TX_GAIN_OFFSET_8821A(offset); - rtw_hal_write_rfreg(adapter, target_path, 0x55, 0x0f8000, write_value); - break; -#endif /* CONFIG_RTL8821A */ -#if defined(CONFIG_RTL8814A) || defined(CONFIG_RTL8822B) || defined(CONFIG_RTL8821C) || defined(CONFIG_RTL8192F) - case RTL8814A: - case RTL8822B: - case RTL8821C: - case RTL8192F: - RTW_INFO("\nkfree by PhyDM on the sw CH. path %d\n", path); - break; -#endif /* CONFIG_RTL8814A || CONFIG_RTL8822B || CONFIG_RTL8821C */ - - default: - rtw_warn_on(1); - break; - } - - if (IS_HARDWARE_TYPE_8723D(adapter)) { - if (path == PPG_8723D_S1) - val32 = rtw_hal_read_rfreg(adapter, target_path, 0x55, 0xffffffff); - else if (path == PPG_8723D_S0) - val32 = rtw_hal_read_rfreg(adapter, target_path, 0x65, 0xffffffff); - } else { - val32 = rtw_hal_read_rfreg(adapter, target_path, 0x55, 0xffffffff); - } - RTW_INFO(" after :0x%x\n", val32); -} - -void rtw_rf_apply_tx_gain_offset(_adapter *adapter, u8 ch) -{ - HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter); - s8 kfree_offset = 0; - s8 tx_pwr_track_offset = 0; /* TODO: 8814A should consider tx pwr track when setting tx gain offset */ - s8 total_offset; - int i, total = 0; - - if (IS_HARDWARE_TYPE_8723D(adapter)) - total = 2; /* S1 and S0 */ - else - total = hal_data->NumTotalRFPath; - - for (i = 0; i < total; i++) { - kfree_offset = rtw_rf_get_kfree_tx_gain_offset(adapter, i, ch); - total_offset = kfree_offset + tx_pwr_track_offset; - rtw_rf_set_tx_gain_offset(adapter, i, total_offset); - } -} - -inline u8 rtw_is_dfs_range(u32 hi, u32 lo) -{ - return rtw_is_range_overlap(hi, lo, 5720 + 10, 5260 - 10); -} - -u8 rtw_is_dfs_ch(u8 ch) -{ - u32 hi, lo; - - if (!rtw_chbw_to_freq_range(ch, CHANNEL_WIDTH_20, HAL_PRIME_CHNL_OFFSET_DONT_CARE, &hi, &lo)) - return 0; - - return rtw_is_dfs_range(hi, lo); -} - -u8 rtw_is_dfs_chbw(u8 ch, u8 bw, u8 offset) -{ - u32 hi, lo; - - if (!rtw_chbw_to_freq_range(ch, bw, offset, &hi, &lo)) - return 0; - - return rtw_is_dfs_range(hi, lo); -} - -bool rtw_is_long_cac_range(u32 hi, u32 lo, u8 dfs_region) -{ - return (dfs_region == PHYDM_DFS_DOMAIN_ETSI && rtw_is_range_overlap(hi, lo, 5650, 5600)) ? _TRUE : _FALSE; -} - -bool rtw_is_long_cac_ch(u8 ch, u8 bw, u8 offset, u8 dfs_region) -{ - u32 hi, lo; - - if (rtw_chbw_to_freq_range(ch, bw, offset, &hi, &lo) == _FALSE) - return _FALSE; - - return rtw_is_long_cac_range(hi, lo, dfs_region) ? _TRUE : _FALSE; -} diff --git a/drivers/net/wireless/realtek/rtl8812au/dkms.conf b/drivers/net/wireless/realtek/rtl8812au/dkms.conf deleted file mode 100644 index 7086f3969a4450..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/dkms.conf +++ /dev/null @@ -1,9 +0,0 @@ -PACKAGE_NAME="realtek-rtl88xxau" -PACKAGE_VERSION="5.6.4.2~20240509" -CLEAN="'make' clean" -BUILT_MODULE_NAME[0]=88XXau -PROCS_NUM=`nproc` -[ $PROCS_NUM -gt 16 ] && PROCS_NUM=16 -DEST_MODULE_LOCATION[0]="/updates" -MAKE="'make' -j$PROCS_NUM KVER=${kernelver} KSRC=/lib/modules/${kernelver}/build" -AUTOINSTALL="yes" diff --git a/drivers/net/wireless/realtek/rtl8812au/docs/Driver_Configuration_for_RF_Regulatory_Certification.pdf b/drivers/net/wireless/realtek/rtl8812au/docs/Driver_Configuration_for_RF_Regulatory_Certification.pdf deleted file mode 100644 index 712553ac5f6e4f..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/docs/Driver_Configuration_for_RF_Regulatory_Certification.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/docs/HowTo_enable_and_verify_TDLS_function_in_Wi-Fi_driver.pdf b/drivers/net/wireless/realtek/rtl8812au/docs/HowTo_enable_and_verify_TDLS_function_in_Wi-Fi_driver.pdf deleted file mode 100644 index 52c9937fb50432..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/docs/HowTo_enable_and_verify_TDLS_function_in_Wi-Fi_driver.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/docs/HowTo_enable_driver_to_support_80211d.pdf b/drivers/net/wireless/realtek/rtl8812au/docs/HowTo_enable_driver_to_support_80211d.pdf deleted file mode 100644 index 1e523d579ab3e0..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/docs/HowTo_enable_driver_to_support_80211d.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/docs/HowTo_enable_the_power_saving_functionality.pdf b/drivers/net/wireless/realtek/rtl8812au/docs/HowTo_enable_the_power_saving_functionality.pdf deleted file mode 100644 index 50322aedf7aa74..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/docs/HowTo_enable_the_power_saving_functionality.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/docs/HowTo_support_WIFI_certification_test.pdf b/drivers/net/wireless/realtek/rtl8812au/docs/HowTo_support_WIFI_certification_test.pdf deleted file mode 100644 index e9c782d5d3bd5d..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/docs/HowTo_support_WIFI_certification_test.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/docs/HowTo_support_more_VidPids.pdf b/drivers/net/wireless/realtek/rtl8812au/docs/HowTo_support_more_VidPids.pdf deleted file mode 100644 index 3d1426d4c775cb..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/docs/HowTo_support_more_VidPids.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/docs/How_to_append_vendor_specific_ie_to_driver_management_frames.pdf b/drivers/net/wireless/realtek/rtl8812au/docs/How_to_append_vendor_specific_ie_to_driver_management_frames.pdf deleted file mode 100644 index c25fccbb4f3256..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/docs/How_to_append_vendor_specific_ie_to_driver_management_frames.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/docs/How_to_enable_Realtek_RSON_function.pdf b/drivers/net/wireless/realtek/rtl8812au/docs/How_to_enable_Realtek_RSON_function.pdf deleted file mode 100644 index 26c003029c8d75..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/docs/How_to_enable_Realtek_RSON_function.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/docs/How_to_set_driver_debug_log_level.pdf b/drivers/net/wireless/realtek/rtl8812au/docs/How_to_set_driver_debug_log_level.pdf deleted file mode 100644 index 4cf05d73d87914..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/docs/How_to_set_driver_debug_log_level.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/docs/LinuxDriver_MP_Iwpriv_UserGuide_V3.doc b/drivers/net/wireless/realtek/rtl8812au/docs/LinuxDriver_MP_Iwpriv_UserGuide_V3.doc deleted file mode 100644 index 6e8dc6f6725116..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/docs/LinuxDriver_MP_Iwpriv_UserGuide_V3.doc and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/docs/Miracast_for_Realtek_WiFi.pdf b/drivers/net/wireless/realtek/rtl8812au/docs/Miracast_for_Realtek_WiFi.pdf deleted file mode 100644 index 238dbea3ee6c7e..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/docs/Miracast_for_Realtek_WiFi.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/docs/Quick_Start_Guide_for_Adaptivity_and_Carrier_Sensing_Test.pdf b/drivers/net/wireless/realtek/rtl8812au/docs/Quick_Start_Guide_for_Adaptivity_and_Carrier_Sensing_Test.pdf deleted file mode 100644 index 53cd475c719065..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/docs/Quick_Start_Guide_for_Adaptivity_and_Carrier_Sensing_Test.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/docs/Quick_Start_Guide_for_Bridge.pdf b/drivers/net/wireless/realtek/rtl8812au/docs/Quick_Start_Guide_for_Bridge.pdf deleted file mode 100644 index f03c86d90feb10..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/docs/Quick_Start_Guide_for_Bridge.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/docs/Quick_Start_Guide_for_Driver_Compilation_and_Installation.pdf b/drivers/net/wireless/realtek/rtl8812au/docs/Quick_Start_Guide_for_Driver_Compilation_and_Installation.pdf deleted file mode 100644 index 1e1b24ed500596..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/docs/Quick_Start_Guide_for_Driver_Compilation_and_Installation.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/docs/Quick_Start_Guide_for_SoftAP.pdf b/drivers/net/wireless/realtek/rtl8812au/docs/Quick_Start_Guide_for_SoftAP.pdf deleted file mode 100644 index efcbddb4ce8828..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/docs/Quick_Start_Guide_for_SoftAP.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/docs/Quick_Start_Guide_for_Station_Mode.pdf b/drivers/net/wireless/realtek/rtl8812au/docs/Quick_Start_Guide_for_Station_Mode.pdf deleted file mode 100644 index d70263630156be..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/docs/Quick_Start_Guide_for_Station_Mode.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/docs/Quick_Start_Guide_for_WOW.pdf b/drivers/net/wireless/realtek/rtl8812au/docs/Quick_Start_Guide_for_WOW.pdf deleted file mode 100644 index 548129f71c2e53..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/docs/Quick_Start_Guide_for_WOW.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/docs/Quick_Start_Guide_for_WPA3.pdf b/drivers/net/wireless/realtek/rtl8812au/docs/Quick_Start_Guide_for_WPA3.pdf deleted file mode 100644 index a886d04d9b7b68..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/docs/Quick_Start_Guide_for_WPA3.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/docs/Quick_Start_Guide_for_wpa_supplicant_WiFi_P2P_test.pdf b/drivers/net/wireless/realtek/rtl8812au/docs/Quick_Start_Guide_for_wpa_supplicant_WiFi_P2P_test.pdf deleted file mode 100644 index e3e7b2a5ca6063..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/docs/Quick_Start_Guide_for_wpa_supplicant_WiFi_P2P_test.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/docs/REALTEK_README.txt b/drivers/net/wireless/realtek/rtl8812au/docs/REALTEK_README.txt deleted file mode 100644 index 2db929613373c3..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/docs/REALTEK_README.txt +++ /dev/null @@ -1,248 +0,0 @@ -=============================================================================== - Software Package - Component -=============================================================================== - 1. ReleaseNotes.pdf - - 2. document/ - 2.1 Quick_Start_Guide_for_Driver_Compilation_and_Installation.pdf - 2.2 Quick_Start_Guide_for_Station_Mode.pdf - 2.3 Quick_Start_Guide_for_SoftAP.pdf - 2.4 Quick_Start_Guide_for_Bridge.pdf - 2.5 Quick_Start_Guide_for_WOW.pdf - 2.6 Quick_Start_Guide_for_Adaptivity_and_Carrier_Sensing_Test.pdf - 2.7 HowTo_support_more_VidPids.pdf - 2.8 HowTo_support_WIFI_certification_test.pdf - 2.9 HowTo_enable_the_power_saving_functionality.pdf - 2.10 HowTo_enable_driver_to_support_80211d.pdf - 2.11 HowTo_enable_and_verify_TDLS_function_in_Wi-Fi_driver.pdf - 2.12 How_to_set_driver_debug_log_level.pdf - 2.13 How_to_append_vendor_specific_ie_to_driver_management_frames.pdf - 2.14 wpa_cli_with_wpa_supplicant.pdf - 2.15 Wireless_tools_porting_guide.pdf - 2.16 SoftAP_Mode_features.pdf - 2.17 linux_dhcp_server_notes.txt - 2.18 RTK_P2P_WFD_Programming_guide.pdf - 2.19 Realtek_WiFi_concurrent_mode_Introduction.pdf - 2.20 Miracast_for_Realtek_WiFi.pdf - 2.21 Driver_Configuration_for_RF_Regulatory_Certification.pdf - - 3. driver/ - 3.1 rtl8812AU_linux_v5.6.4_33522.20190509.tar.gz - Naming rule: rtlCHIPS_linux_vM.N.P[.H]_sssss.yyyymmdd[_COEX_VER][_beta].tar.gz - where: - CHIPS: supported chips - M: Major version - N: miNor version - P: Patch number - H: Hotfix number - s: SVN number - y: package year - m: package month - d: package day - COEX_VER: Coext version - _beta: beta driver - - 4. wpa_supplicant_hostapd/ - 4.1 wpa_supplicant_hostapd-0.8_rtw_r24647.20171025.tar.gz - 4.1.1 wpa_supplicant - The tool help the wlan network to communicate under the - protection of WPAPSK mechanism (WPA/WPA2) and add WPS patch - 4.1.2 hostapd - 4.2 wpa_0_8.conf - Configure file sample for wpa_supplicant-0.8 - 4.3 rtl_hostapd_2G.conf - 4.4 rtl_hostapd_5G.conf - Configure files for Soft-AP mode 2.4G/5G - 4.5 p2p_hostapd.conf - Configure file for hostapd for Wi-Fi Direct (P2P) - - 4.6 wpa_supplicant_8_jb_4.2_rtw_r25670.20171213.tar.gz - wpa_supplicant_8 from Android 4.2 SDK and patched by Realtek - could be used for pure-linux and Android 4.2. Support only cfg80211/nl80211. - - 4.7 wpa_supplicant_8_kk_4.4_rtw_r25669.20171213.tar.gz - wpa_supplicant_8 from Android 4.4 SDK and patched by Realtek - could be used for pure-linux and Android 4.4. Support only cfg80211/nl80211. - - 4.8 wpa_supplicant_8_L_5.x_rtw_r24600.20171025.tar.gz - wpa_supplicant_8 from Android 5.x SDK and patched by Realtek - could be used for pure-linux and Android 5.x Support only cfg80211/nl80211. - - 4.9 wpa_supplicant_8_M_6.x_rtw_r24570.20171025.tar.gz - wpa_supplicant_8 from Android 6.x SDK and patched by Realtek - could be used for pure-linux and Android 6.x. Support only cfg80211/nl80211. - - 4.10 wpa_supplicant_8_N_7.x_rtw_r24577.20171025.tar.gz - wpa_supplicant_8 from Android 7.x SDK and patched by Realtek - could be used for pure-linux and Android 7.x. Support only cfg80211/nl80211. - - 4.11 wpa_supplicant_8_O_8.x_rtw_r31832.20190226.tar.gz - wpa_supplicant_8 from Android 8.x SDK and patched by Realtek - could be used for pure-linux and Android 8.x. Support only cfg80211/nl80211. - - 4.12 wpa_supplicant_8_P_9.x_rtw_r29226.20180827.tar.gz - wpa_supplicant_8 from Android 8.x SDK and patched by Realtek - could be used for pure-linux and Android 9.x. Support only cfg80211/nl80211. - - 5. wireless_tools/ - 5.1 wireless_tools.30.rtl.tar.gz - - 6. WiFi_Direct_User_Interface/ - 6.1 p2p_api_test_linux.c - 6.2 p2p_ui_test_linux.c - 6.3 p2p_test.h - 6.4 Start_Guide_P2P_User_Interface_Linux.pdf - - 7. android_ref_codes_JB_4.2 - 7.1 linux-3.0.42_STATION_INFO_ASSOC_REQ_IES.diff - Kernel patch file for cfg80211's STATION_INFO_ASSOC_REQ_IES event for kernel 3.0. - - 7.2 realtek_wifi_SDK_for_android_JB_4.2_20130208.tar.gz - This tar ball includes our android wifi reference codes for Android 4.2 - - 7.3 Realtek_Wi-Fi_SDK_for_Android_JB_4.2.pdf - Guide for porting Realtek wifi onto your Android 4.2 system - - 8. android_ref_codes_KK_4.4 - 8.1 linux-3.0.42_STATION_INFO_ASSOC_REQ_IES.diff - Kernel patch file for cfg80211's STATION_INFO_ASSOC_REQ_IES event for kernel 3.0. - - 8.2 realtek_wifi_SDK_for_android_KK_4.4_20140117.tar.gz - This tar ball includes our android wifi reference codes for Android 4.4 - - 8.3 Realtek_Wi-Fi_SDK_for_Android_KK_4.4.pdf - Guide for porting Realtek wifi onto your Android 4.4 system - - 9. android_ref_codes_L_5.x - 9.1 linux-3.0.42_STATION_INFO_ASSOC_REQ_IES.diff - Kernel patch file for cfg80211's STATION_INFO_ASSOC_REQ_IES event for kernel 3.0. - - 9.2 realtek_wifi_SDK_for_android_L_5.x_20150811.tgz - This tar ball includes our android wifi reference codes for Android 5.x - - 9.3 Realtek_Wi-Fi_SDK_for_Android_L_5.x.pdf - Guide for porting Realtek wifi onto your Android 5.x system - - 10. android_ref_codes_M_6.x - 10.1 linux-3.0.42_STATION_INFO_ASSOC_REQ_IES.diff - Kernel patch file for cfg80211's STATION_INFO_ASSOC_REQ_IES event for kernel 3.0. - - 10.2 realtek_wifi_SDK_for_android_L_6.x_20151116.tgz - This tar ball includes our android wifi reference codes for Android 6.x - - 10.3 Realtek_Wi-Fi_SDK_for_Android_M_6.x.pdf - Guide for porting Realtek wifi onto your Android 6.x system - - 11. android_ref_codes_M_7.0 - 11.1 linux-3.0.42_STATION_INFO_ASSOC_REQ_IES.diff - Kernel patch file for cfg80211's STATION_INFO_ASSOC_REQ_IES event for kernel 3.0. - - 11.2 realtek_wifi_SDK_for_android_N_7.0_20161024.zip - This tar ball includes our android wifi reference codes for Android 7.0 - - 11.3 Realtek_Wi-Fi_SDK_for_Android_N_7.0.pdf - Guide for porting Realtek wifi onto your Android 7.0 system - - 12. android_ref_codes_O_8.0 - 12.1 linux-3.0.42_STATION_INFO_ASSOC_REQ_IES.diff - Kernel patch file for cfg80211's STATION_INFO_ASSOC_REQ_IES event for kernel 3.0. - - 12.2 realtek_wifi_SDK_for_android_O_8.0_20181001.tar.gz - This tar ball includes our android wifi reference codes for Android 8.0 - - 12.3 Realtek_Wi-Fi_SDK_for_Android_O_8.0.pdf - Guide for porting Realtek wifi onto your Android 8.0 system - - 13. android_ref_codes_P_9.x - 13.1 linux-3.0.42_STATION_INFO_ASSOC_REQ_IES.diff - Kernel patch file for cfg80211's STATION_INFO_ASSOC_REQ_IES event for kernel 3.0. - - 13.2 realtek_wifi_SDK_for_android_P_9.x_20180813.tar.gz - This tar ball includes our android wifi reference codes for Android 9.x - - 13.3 Realtek_Wi-Fi_SDK_for_Android_P_9.x.pdf - Guide for porting Realtek wifi onto your Android 9.x system - - 13. install.sh - Script to compile and install WiFi driver easily in PC-Linux - -================================================================================================================== - User Guide for Driver compilation and installation -================================================================================================================== - (*) Please refer to document/Quick_Start_Guide_for_Driver_Compilation_and_Installation.pdf -================================================================================================================== - User Guide for Station mode -================================================================================================================== - (*) Please refer to document/Quick_Start_Guide_for_Station_Mode.pdf -================================================================================================================== - User Guide for Soft-AP mode -================================================================================================================== - (*) Please refer to document/Quick_Start_Guide_for_SoftAP.pdf - (*) Please use wpa_supplicant_hostapd-0.8_rtw_r24647.20171025.tar.gz - (*) Please refer to document/linux_dhcp_server_notes.txt -================================================================================================================== - User Guide for Wi-Fi Direct -================================================================================================================== - Realtek Legacy Wi-Fi Direct: - (*) Please refer to document/RTK_P2P_WFD_Programming_guide.pdf - (*) Please use wpa_supplicant_hostapd-0.8_rtw_r24647.20171025.tar.gz - (*) Please refer to document/linux_dhcp_server_notes.txt - (*) Please refer to WiFi_Direct_User_Interface/ - Wi-Fi Direct with nl80211 - (*) Please use: - or - wpa_supplicant_8_jb_4.2_rtw_r25670.20171213.tar.gz - or - wpa_supplicant_8_kk_4.4_rtw_r25669.20171213.tar.gz - or - wpa_supplicant_8_L_5.x_rtw_r24600.20171025.tar.gz - or - wpa_supplicant_8_M_6.x_rtw_r24570.20171025.tar.gz - or - wpa_supplicant_8_N_7.x_rtw_r24577.20171025.tar.gz - or - wpa_supplicant_8_O_8.x_rtw_r33457.20190507.tar.gz - or - wpa_supplicant_8_P_9.x_rtw_r29226.20180827.tar.gz - - (*) For P2P instruction/command, please refer to: - README-P2P inside the wpa_supplicant folder of the wpa_supplicant_8 you choose - (*) For DHCP server, please refer to: - document/linux_dhcp_server_notes.txt -================================================================================================================== - User Guide for WPS2.0 -================================================================================================================== - (*) Please use: - wpa_supplicant_hostapd-0.8_rtw_r24647.20171025.tar.gz - or - wpa_supplicant_8_jb_4.2_rtw_r25670.20171213.tar.gz - or - wpa_supplicant_8_kk_4.4_rtw_r25669.20171213.tar.gz - or - wpa_supplicant_8_L_5.x_rtw_r24600.20171025.tar.gz - or - wpa_supplicant_8_M_6.x_rtw_r24570.20171025.tar.gz - or - wpa_supplicant_8_N_7.x_rtw_r24577.20171025.tar.gz - or - wpa_supplicant_8_O_8.x_rtw_r33457.20190507.tar.gz - or - wpa_supplicant_8_P_9.x_rtw_r29226.20180827.tar.gz - - (*) For WPS instruction/command, please refert to: - README-WPS inside the wpa_supplicant folder of the wpa_supplicant_8 you choose -================================================================================================================== - User Guide for Power Saving Mode -================================================================================================================== - (*) Please refer to document/HowTo_enable_the_power_saving_functionality.pdf -================================================================================================================== - User Guide for Applying Wi-Fi solution onto Andriod System -================================================================================================================== - (*) For Android 1.6 ~ 2.3, 4.0, 4.1, 4.3, please contact us for further information - (*) For Android 4.2, please refer to android_ref_codes_JB_4.2/Realtek_Wi-Fi_SDK_for_Android_JB_4.2.pdf - (*) For Android 4.4, please refer to android_ref_codes_KK_4.4/Realtek_Wi-Fi_SDK_for_Android_KK_4.4.pdf - (*) For Android 5.X, please refer to android_ref_codes_L_5.x/Realtek_Wi-Fi_SDK_for_Android_L_5.x.pdf - (*) For Android 6.X, please refer to android_ref_codes_M_6.x/Realtek_Wi-Fi_SDK_for_Android_M_6.x.pdf - (*) For Android 7.X, please refer to android_ref_codes_N_7.0/Realtek_Wi-Fi_SDK_for_Android_N_7.0.pdf - (*) For Android 8.X, please refer to android_ref_codes_O_8.0/Realtek_Wi-Fi_SDK_for_Android_O_8.0.pdf - (*) For Android 9.X, please refer to android_ref_codes_P_9.x/Realtek_Wi-Fi_SDK_for_Android_P_9.x.pdf \ No newline at end of file diff --git a/drivers/net/wireless/realtek/rtl8812au/docs/RTK_P2P_WFD_Programming_guide.pdf b/drivers/net/wireless/realtek/rtl8812au/docs/RTK_P2P_WFD_Programming_guide.pdf deleted file mode 100644 index 2a6e5ff0cb7274..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/docs/RTK_P2P_WFD_Programming_guide.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/docs/RTL8812AU-CG-RealtekMicroelectronics.pdf b/drivers/net/wireless/realtek/rtl8812au/docs/RTL8812AU-CG-RealtekMicroelectronics.pdf deleted file mode 100644 index c3fbde4ede03a5..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/docs/RTL8812AU-CG-RealtekMicroelectronics.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/docs/Realtek_Wi-Fi_SDK_for_Android_O_8.0.pdf b/drivers/net/wireless/realtek/rtl8812au/docs/Realtek_Wi-Fi_SDK_for_Android_O_8.0.pdf deleted file mode 100644 index 813181e8c7c775..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/docs/Realtek_Wi-Fi_SDK_for_Android_O_8.0.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/docs/Realtek_WiFi_concurrent_mode_Introduction.pdf b/drivers/net/wireless/realtek/rtl8812au/docs/Realtek_WiFi_concurrent_mode_Introduction.pdf deleted file mode 100644 index b8ce9b58856910..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/docs/Realtek_WiFi_concurrent_mode_Introduction.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/docs/SoftAP_Mode_features.pdf b/drivers/net/wireless/realtek/rtl8812au/docs/SoftAP_Mode_features.pdf deleted file mode 100644 index 4dcdcd0f90c362..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/docs/SoftAP_Mode_features.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/docs/Wireless_tools_porting_guide.pdf b/drivers/net/wireless/realtek/rtl8812au/docs/Wireless_tools_porting_guide.pdf deleted file mode 100644 index 3aa33195339c85..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/docs/Wireless_tools_porting_guide.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/docs/hostapd.conf b/drivers/net/wireless/realtek/rtl8812au/docs/hostapd.conf deleted file mode 100644 index 5734bdf9b9b7e9..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/docs/hostapd.conf +++ /dev/null @@ -1,80 +0,0 @@ -### hostapd configuration file -### for RTL8812AU and hostapd 2.5 -### Operates at 135 Mbps in 802.11n/ht mode. iperf measures ~8.00 MBytes/sec 67.1 Mbits/sec -### I was not able to get 802.11ac/vht mode with additional side-channels configured with the driver. - -ctrl_interface=/var/run/hostapd -ctrl_interface_group=0 -interface=wlan0 -driver=nl80211 -bridge=br0 - -### IEEE 802.11 -ssid=test -hw_mode=a -channel=36 -max_num_sta=128 -auth_algs=1 - -### DFS -country_code=NO -ieee80211d=1 -ieee80211h=1 - -### IEEE 802.11n -ieee80211n=1 -ht_capab=[HT20][HT40+][SHORT-GI-20][SHORT-GI-40][DSSS_CCK-40] - -### IEEE 802.11ac -ieee80211ac=1 -#vht_oper_chwidth=1 -#vht_capab=[HT40-] -#vht_oper_centr_freq_seg0_idx=46 - -### IEEE 802.11i -wpa=2 -wpa_key_mgmt=WPA-PSK -wpa_passphrase=test -rsn_pairwise=CCMP - -### WMM -wmm_enabled=1 -uapsd_advertisement_enabled=1 -wmm_ac_bk_cwmin=4 -wmm_ac_bk_cwmax=10 -wmm_ac_bk_aifs=7 -wmm_ac_bk_txop_limit=0 -wmm_ac_bk_acm=0 -wmm_ac_be_aifs=3 -wmm_ac_be_cwmin=4 -wmm_ac_be_cwmax=10 -wmm_ac_be_txop_limit=0 -wmm_ac_be_acm=0 -wmm_ac_vi_aifs=2 -wmm_ac_vi_cwmin=3 -wmm_ac_vi_cwmax=4 -wmm_ac_vi_txop_limit=94 -wmm_ac_vi_acm=0 -wmm_ac_vo_aifs=2 -wmm_ac_vo_cwmin=2 -wmm_ac_vo_cwmax=3 -wmm_ac_vo_txop_limit=47 -wmm_ac_vo_acm=0 - -### TX queue parameters -tx_queue_data3_aifs=7 -tx_queue_data3_cwmin=15 -tx_queue_data3_cwmax=1023 -tx_queue_data3_burst=0 -tx_queue_data2_aifs=3 -tx_queue_data2_cwmin=15 -tx_queue_data2_cwmax=63 -tx_queue_data2_burst=0 -tx_queue_data1_aifs=1 -tx_queue_data1_cwmin=7 -tx_queue_data1_cwmax=15 -tx_queue_data1_burst=3.0 -tx_queue_data0_aifs=1 -tx_queue_data0_cwmin=3 -tx_queue_data0_cwmax=7 -tx_queue_data0_burst=1.5 diff --git a/drivers/net/wireless/realtek/rtl8812au/docs/iwpriv_mp_settings_for_different_data_rate.xls b/drivers/net/wireless/realtek/rtl8812au/docs/iwpriv_mp_settings_for_different_data_rate.xls deleted file mode 100644 index 534750d49d9eb3..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/docs/iwpriv_mp_settings_for_different_data_rate.xls and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/docs/linux_dhcp_server_notes.txt b/drivers/net/wireless/realtek/rtl8812au/docs/linux_dhcp_server_notes.txt deleted file mode 100644 index da379f314aaea5..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/docs/linux_dhcp_server_notes.txt +++ /dev/null @@ -1,132 +0,0 @@ - -//Install dhcp server -[root@localhost ~]#yum install dhcp - -//We shoule copy /usr/share/doc/dhcp-4.2.0/dhcpd.conf.sample to /etc/dhcp/dhcpd.conf -//and modifiy /etc/dhcp/dhcpd.conf as the following -[root@localhost ~]#cat /etc/dhcp/dhcpd.conf -# dhcpd.conf -# -# Sample configuration file for ISC dhcpd -# - -# option definitions common to all supported networks... -option domain-name "example.org"; -option domain-name-servers ns1.example.org, ns2.example.org; - -default-lease-time 600; -max-lease-time 7200; - -# Use this to enble / disable dynamic dns updates globally. -#ddns-update-style none; - -# If this DHCP server is the official DHCP server for the local -# network, the authoritative directive should be uncommented. -#authoritative; - -# Use this to send dhcp log messages to a different log file (you also -# have to hack syslog.conf to complete the redirection). -log-facility local7; - -# No service will be given on this subnet, but declaring it helps the -# DHCP server to understand the network topology. - -subnet 10.152.187.0 netmask 255.255.255.0 { -} - -# This is a very basic subnet declaration. - -subnet 10.254.239.0 netmask 255.255.255.224 { - range 10.254.239.10 10.254.239.20; - option routers rtr-239-0-1.example.org, rtr-239-0-2.example.org; -} - -# This declaration allows BOOTP clients to get dynamic addresses, -# which we don't really recommend. - -subnet 10.254.239.32 netmask 255.255.255.224 { - range dynamic-bootp 10.254.239.40 10.254.239.60; - option broadcast-address 10.254.239.31; - option routers rtr-239-32-1.example.org; -} - -# A slightly different configuration for an internal subnet. -subnet 192.168.1.0 netmask 255.255.255.0 { - range 192.168.1.30 192.168.1.150; - option domain-name-servers 192.168.1.254; - option domain-name "internal.org"; - option routers 192.168.1.254; - option broadcast-address 192.168.1.255; - default-lease-time 6000; - max-lease-time 7200; -} - -subnet 172.21.69.0 netmask 255.255.255.0 { - -} - -# Hosts which require special configuration options can be listed in -# host statements. If no address is specified, the address will be -# allocated dynamically (if possible), but the host-specific information -# will still come from the host declaration. - -host passacaglia { - hardware ethernet 0:0:c0:5d:bd:95; - filename "vmunix.passacaglia"; - server-name "toccata.fugue.com"; -} - -# Fixed IP addresses can also be specified for hosts. These addresses -# should not also be listed as being available for dynamic assignment. -# Hosts for which fixed IP addresses have been specified can boot using -# BOOTP or DHCP. Hosts for which no fixed address is specified can only -# be booted with DHCP, unless there is an address range on the subnet -# to which a BOOTP client is connected which has the dynamic-bootp flag -# set. -host fantasia { - hardware ethernet 08:00:07:26:c0:a5; - fixed-address fantasia.fugue.com; -} - -# You can declare a class of clients and then do address allocation -# based on that. The example below shows a case where all clients -# in a certain class get addresses on the 10.17.224/24 subnet, and all -# other clients get addresses on the 10.0.29/24 subnet. - -class "foo" { - match if substring (option vendor-class-identifier, 0, 4) = "SUNW"; -} - -shared-network 224-29 { - subnet 10.17.224.0 netmask 255.255.255.0 { - option routers rtr-224.example.org; - } - subnet 10.0.29.0 netmask 255.255.255.0 { - option routers rtr-29.example.org; - } - pool { - allow members of "foo"; - range 10.17.224.10 10.17.224.250; - } - pool { - deny members of "foo"; - range 10.0.29.10 10.0.29.230; - } -} -[root@localhost ~]# - -//Depends on the above setting, wlan interface IP would be 192.168.1.254 -[root@localhost ~]#ifconfig wlan14 192.168.1.254 - -//Set only one interface as dhcp server -[root@localhost ~]#cat /etc/sysconfig/dhcpd -# Command line options here -DHCPDARGS=wlan0 - -//If /var/lib/dhcpd/dhcpd.leases doesn't exist, -//we should establish it -//This file is used to record clients information. -[root@localhost ~]#touch /var/lib/dhcpd/dhcpd.leases - -//Execute -[root@localhost ~]#/etc/rc.d/init.d/dhcpd start diff --git a/drivers/net/wireless/realtek/rtl8812au/docs/rtl8712-d0-1-programming-guide-20090601.doc b/drivers/net/wireless/realtek/rtl8812au/docs/rtl8712-d0-1-programming-guide-20090601.doc deleted file mode 100644 index 99a725cfa94d95..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/docs/rtl8712-d0-1-programming-guide-20090601.doc and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/docs/wpa_cli_with_wpa_supplicant.pdf b/drivers/net/wireless/realtek/rtl8812au/docs/wpa_cli_with_wpa_supplicant.pdf deleted file mode 100644 index 249f1a14688048..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/docs/wpa_cli_with_wpa_supplicant.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.c b/drivers/net/wireless/realtek/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.c deleted file mode 100644 index 22f793cc35fb8a..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.c +++ /dev/null @@ -1,93 +0,0 @@ -/****************************************************************************** -* -* Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., -* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA -* -* -******************************************************************************/ -#include - -#include "HalEfuseMask8814A_PCIE.h" - -/****************************************************************************** -* MPCIE.TXT -******************************************************************************/ - -u1Byte Array_MP_8814A_MPCIE[] = { - 0xFF, - 0xFF, - 0xFF, - 0xFF, - 0xFF, - 0xFF, - 0xFF, - 0xFF, - 0xFF, - 0xFF, - 0xFF, - 0xFF, - 0xF3, - 0xFF, - 0x10, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - -}; - -u2Byte -EFUSE_GetArrayLen_MP_8814A_MPCIE(VOID) -{ - return sizeof(Array_MP_8814A_MPCIE)/sizeof(u1Byte); -} - -VOID -EFUSE_GetMaskArray_MP_8814A_MPCIE(pu1Byte Array) -{ - u2Byte len = EFUSE_GetArrayLen_MP_8814A_MPCIE(), i = 0; - - for (i = 0; i < len; ++i) - Array[i] = Array_MP_8814A_MPCIE[i]; -} - -BOOLEAN -EFUSE_IsAddressMasked_MP_8814A_MPCIE(u2Byte Offset) -{ - int r = Offset/16; - int c = (Offset%16) / 2; - int result = 0; - - if (c < 4) /*Upper double word*/ - result = (Array_MP_8814A_MPCIE[r] & (0x10 << c)); - else - result = (Array_MP_8814A_MPCIE[r] & (0x01 << (c-4))); - - return (result > 0) ? 0 : 1; -} - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.h b/drivers/net/wireless/realtek/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.h deleted file mode 100644 index 8b51c1b4a6a797..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_PCIE.h +++ /dev/null @@ -1,33 +0,0 @@ -/****************************************************************************** -* -* Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., -* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA -* -* -******************************************************************************/ - - -/****************************************************************************** -* MPCIE.TXT -******************************************************************************/ - - -u2Byte EFUSE_GetArrayLen_MP_8814A_MPCIE(VOID); - -VOID EFUSE_GetMaskArray_MP_8814A_MPCIE(pu1Byte Array); - -BOOLEAN EFUSE_IsAddressMasked_MP_8814A_MPCIE(u2Byte Offset); - - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_USB.c b/drivers/net/wireless/realtek/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_USB.c deleted file mode 100644 index cd80e92943e48a..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_USB.c +++ /dev/null @@ -1,90 +0,0 @@ -/****************************************************************************** -* -* Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., -* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA -* -* -******************************************************************************/ -#include - -#include "HalEfuseMask8814A_USB.h" - -/****************************************************************************** -* MUSB.TXT -******************************************************************************/ - -u1Byte Array_MP_8814A_MUSB[] = { - 0xFF, - 0xFF, - 0xFF, - 0xFF, - 0xFF, - 0xFF, - 0xFF, - 0xFF, - 0xFF, - 0xFF, - 0xFF, - 0xFF, - 0xF3, - 0x7F, - 0xFF, - 0xFF, - 0xFF, - 0x70, - 0x04, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - -}; - -u2Byte EFUSE_GetArrayLen_MP_8814A_MUSB(VOID) -{ - return sizeof(Array_MP_8814A_MUSB)/sizeof(u1Byte); -} - -VOID EFUSE_GetMaskArray_MP_8814A_MUSB(pu1Byte Array) -{ - u2Byte len = EFUSE_GetArrayLen_MP_8814A_MUSB(), i = 0; - - for (i = 0; i < len; ++i) - Array[i] = Array_MP_8814A_MUSB[i]; -} - -BOOLEAN EFUSE_IsAddressMasked_MP_8814A_MUSB(u2Byte Offset) -{ - int r = Offset/16; - int c = (Offset%16) / 2; - int result = 0; - - if (c < 4) /*Upper double word*/ - result = (Array_MP_8814A_MUSB[r] & (0x10 << c)); - else - result = (Array_MP_8814A_MUSB[r] & (0x01 << (c-4))); - - return (result > 0) ? 0 : 1; -} - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_USB.h b/drivers/net/wireless/realtek/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_USB.h deleted file mode 100644 index 4262400d713dd2..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/efuse/rtl8814a/HalEfuseMask8814A_USB.h +++ /dev/null @@ -1,33 +0,0 @@ -/****************************************************************************** -* -* Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., -* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA -* -* -******************************************************************************/ - - - -/****************************************************************************** -* MUSB.TXT -******************************************************************************/ - - -u2Byte EFUSE_GetArrayLen_MP_8814A_MUSB(VOID); - -VOID EFUSE_GetMaskArray_MP_8814A_MUSB(pu1Byte Array); - -BOOLEAN EFUSE_IsAddressMasked_MP_8814A_MUSB(u2Byte Offset); - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/halrf_dpk.h b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/halrf_dpk.h deleted file mode 100644 index c9efc7e9375e72..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/halrf_dpk.h +++ /dev/null @@ -1,86 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2017 Realtek Corporation. - * - * 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 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. - * - * The full GNU General Public License is included in this distribution in the - * file called LICENSE. - * - * Contact Information: - * wlanfae - * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park, - * Hsinchu 300, Taiwan. - * - * Larry Finger - * - *****************************************************************************/ - -#ifndef __HALRF_DPK_H__ -#define __HALRF_DPK_H__ - -/*@--------------------------Define Parameters-------------------------------*/ -#define GAIN_LOSS 1 -#define DO_DPK 2 -#define DPK_ON 3 -#define DPK_LOK 4 -#define DPK_TXK 5 - -#define DAGC 4 -#define LOSS_CHK 0 -#define GAIN_CHK 1 -#define PAS_READ 2 -#define AVG_THERMAL_NUM 8 -#define AVG_THERMAL_NUM_DPK 8 -#define THERMAL_DPK_AVG_NUM 4 - -/*@---------------------------End Define Parameters---------------------------*/ - -struct dm_dpk_info { - - boolean is_dpk_enable; - boolean is_dpk_pwr_on; - boolean is_dpk_by_channel; - u16 dpk_path_ok; - /*@BIT(15)~BIT(12) : 5G reserved, BIT(11)~BIT(8) 5G_S3~5G_S0*/ - /*@BIT(7)~BIT(4) : 2G reserved, BIT(3)~BIT(0) 2G_S3~2G_S0*/ - u8 thermal_dpk; - u8 thermal_dpk_avg[AVG_THERMAL_NUM_DPK]; - u8 thermal_dpk_avg_index; - -#if (RTL8822C_SUPPORT == 1) - u8 result[2][1]; /*path/group*/ - u8 tx_agc[2][1]; /*path/group*/ - u32 coef[2][1][20]; /*path/group/MDPD coefficient*/ -#endif - -#if (RTL8198F_SUPPORT == 1 || RTL8192F_SUPPORT == 1 || RTL8197F_SUPPORT == 1) - /*2G DPK data*/ - u8 dpk_result[4][3]; /*path/group*/ - u8 pwsf_2g[4][3]; /*path/group*/ - u32 lut_2g_even[4][3][64]; /*path/group/LUT data*/ - u32 lut_2g_odd[4][3][64]; /*path/group/LUT data*/ -#endif - -#if (RTL8195B_SUPPORT == 1) - /*2G DPK data*/ - u8 dpk_2g_result[1][3]; /*path/group*/ - u8 pwsf_2g[1][3]; /*path/group*/ - u32 lut_2g_even[1][3][16]; /*path/group/LUT data*/ - u32 lut_2g_odd[1][3][16]; /*path/group/LUT data*/ - /*5G DPK data*/ - u8 dpk_5g_result[1][6]; /*path/group*/ - u8 pwsf_5g[1][6]; /*path/group*/ - u32 lut_5g_even[1][6][16]; /*path/group/LUT data*/ - u32 lut_5g_odd[1][6][16]; /*path/group/LUT data*/ -#endif -}; - -#endif /*__HALRF_DPK_H__*/ diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/halrf_kfree.c b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/halrf_kfree.c deleted file mode 100644 index cee13be26586e3..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/halrf_kfree.c +++ /dev/null @@ -1,1191 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2017 Realtek Corporation. - * - * 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 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. - * - * The full GNU General Public License is included in this distribution in the - * file called LICENSE. - * - * Contact Information: - * wlanfae - * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park, - * Hsinchu 300, Taiwan. - * - * Larry Finger - * - *****************************************************************************/ - -/*@============================================================*/ -/*@include files*/ -/*@============================================================*/ -#include "mp_precomp.h" -#include "phydm_precomp.h" - -/*@ Add for KFree Feature Requested by RF David.*/ -/*@This is a phydm API*/ - -void phydm_set_kfree_to_rf_8814a(void *dm_void, u8 e_rf_path, u8 data) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct dm_rf_calibration_struct *cali_info = &dm->rf_calibrate_info; - boolean is_odd; - u32 tx_gain_bitmask = (BIT(17) | BIT(16) | BIT(15)); - - if ((data % 2) != 0) { /*odd->positive*/ - data = data - 1; - odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(19), 1); - is_odd = true; - } else { /*even->negative*/ - odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(19), 0); - is_odd = false; - } - RF_DBG(dm, DBG_RF_MP, "phy_ConfigKFree8814A(): RF_0x55[19]= %d\n", - is_odd); - switch (data) { - case 0: - odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(14), 0); - odm_set_rf_reg(dm, e_rf_path, RF_0x55, tx_gain_bitmask, 0); - cali_info->kfree_offset[e_rf_path] = 0; - break; - case 2: - odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(14), 1); - odm_set_rf_reg(dm, e_rf_path, RF_0x55, tx_gain_bitmask, 0); - cali_info->kfree_offset[e_rf_path] = 0; - break; - case 4: - odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(14), 0); - odm_set_rf_reg(dm, e_rf_path, RF_0x55, tx_gain_bitmask, 1); - cali_info->kfree_offset[e_rf_path] = 1; - break; - case 6: - odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(14), 1); - odm_set_rf_reg(dm, e_rf_path, RF_0x55, tx_gain_bitmask, 1); - cali_info->kfree_offset[e_rf_path] = 1; - break; - case 8: - odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(14), 0); - odm_set_rf_reg(dm, e_rf_path, RF_0x55, tx_gain_bitmask, 2); - cali_info->kfree_offset[e_rf_path] = 2; - break; - case 10: - odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(14), 1); - odm_set_rf_reg(dm, e_rf_path, RF_0x55, tx_gain_bitmask, 2); - cali_info->kfree_offset[e_rf_path] = 2; - break; - case 12: - odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(14), 0); - odm_set_rf_reg(dm, e_rf_path, RF_0x55, tx_gain_bitmask, 3); - cali_info->kfree_offset[e_rf_path] = 3; - break; - case 14: - odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(14), 1); - odm_set_rf_reg(dm, e_rf_path, RF_0x55, tx_gain_bitmask, 3); - cali_info->kfree_offset[e_rf_path] = 3; - break; - case 16: - odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(14), 0); - odm_set_rf_reg(dm, e_rf_path, RF_0x55, tx_gain_bitmask, 4); - cali_info->kfree_offset[e_rf_path] = 4; - break; - case 18: - odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(14), 1); - odm_set_rf_reg(dm, e_rf_path, RF_0x55, tx_gain_bitmask, 4); - cali_info->kfree_offset[e_rf_path] = 4; - break; - case 20: - odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(14), 0); - odm_set_rf_reg(dm, e_rf_path, RF_0x55, tx_gain_bitmask, 5); - cali_info->kfree_offset[e_rf_path] = 5; - break; - - default: - break; - } - - if (!is_odd) { - /*that means Kfree offset is negative, we need to record it.*/ - cali_info->kfree_offset[e_rf_path] = - (-1) * cali_info->kfree_offset[e_rf_path]; - RF_DBG(dm, DBG_RF_MP, - "phy_ConfigKFree8814A(): kfree_offset = %d\n", - cali_info->kfree_offset[e_rf_path]); - } else { - RF_DBG(dm, DBG_RF_MP, - "phy_ConfigKFree8814A(): kfree_offset = %d\n", - cali_info->kfree_offset[e_rf_path]); - } -} - -void phydm_get_thermal_trim_offset_8821c(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct odm_power_trim_data *power_trim_info = &dm->power_trim_data; - - u8 pg_therm = 0xff; - - odm_efuse_one_byte_read(dm, PPG_THERMAL_OFFSET_21C, &pg_therm, false); - - if (pg_therm != 0xff) { - pg_therm = pg_therm & 0x1f; - if ((pg_therm & BIT(0)) == 0) - power_trim_info->thermal = (-1 * (pg_therm >> 1)); - else - power_trim_info->thermal = (pg_therm >> 1); - - power_trim_info->flag |= KFREE_FLAG_THERMAL_K_ON; - } - - RF_DBG(dm, DBG_RF_MP, "[kfree] 8821c thermal trim flag:0x%02x\n", - power_trim_info->flag); - - if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON) - RF_DBG(dm, DBG_RF_MP, "[kfree] 8821c thermal:%d\n", - power_trim_info->thermal); -} - -void phydm_get_power_trim_offset_8821c(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct odm_power_trim_data *power_trim_info = &dm->power_trim_data; - - u8 pg_power = 0xff, i; - - odm_efuse_one_byte_read(dm, PPG_2G_TXAB_21C, &pg_power, false); - - if (pg_power != 0xff) { - power_trim_info->bb_gain[0][0] = pg_power; - odm_efuse_one_byte_read(dm, PPG_5GL1_TXA_21C, &pg_power, false); - power_trim_info->bb_gain[1][0] = pg_power; - odm_efuse_one_byte_read(dm, PPG_5GL2_TXA_21C, &pg_power, false); - power_trim_info->bb_gain[2][0] = pg_power; - odm_efuse_one_byte_read(dm, PPG_5GM1_TXA_21C, &pg_power, false); - power_trim_info->bb_gain[3][0] = pg_power; - odm_efuse_one_byte_read(dm, PPG_5GM2_TXA_21C, &pg_power, false); - power_trim_info->bb_gain[4][0] = pg_power; - odm_efuse_one_byte_read(dm, PPG_5GH1_TXA_21C, &pg_power, false); - power_trim_info->bb_gain[5][0] = pg_power; - power_trim_info->flag = - power_trim_info->flag | KFREE_FLAG_ON | - KFREE_FLAG_ON_2G | KFREE_FLAG_ON_5G; - } - - RF_DBG(dm, DBG_RF_MP, "[kfree] 8821c power trim flag:0x%02x\n", - power_trim_info->flag); - - if (power_trim_info->flag & KFREE_FLAG_ON) { - for (i = 0; i < KFREE_BAND_NUM; i++) - RF_DBG(dm, DBG_RF_MP, - "[kfree] 8821c pwr_trim->bb_gain[%d][0]=0x%X\n", - i, power_trim_info->bb_gain[i][0]); - } -} - -void phydm_set_kfree_to_rf_8821c(void *dm_void, u8 e_rf_path, boolean wlg_btg, - u8 data) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - u8 wlg, btg; - u32 gain_bmask = (BIT(18) | BIT(17) | BIT(16) | BIT(15) | BIT(14)); - u32 s_gain_bmask = (BIT(19) | BIT(18) | BIT(17) | - BIT(16) | BIT(15) | BIT(14)); - - odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(0), 1); - odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(5), 1); - odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(6), 1); - odm_set_rf_reg(dm, e_rf_path, RF_0x65, BIT(6), 1); - - if (wlg_btg) { - wlg = data & 0xf; - btg = (data & 0xf0) >> 4; - - odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(19), (wlg & BIT(0))); - odm_set_rf_reg(dm, e_rf_path, RF_0x55, gain_bmask, (wlg >> 1)); - - odm_set_rf_reg(dm, e_rf_path, RF_0x65, BIT(19), (btg & BIT(0))); - odm_set_rf_reg(dm, e_rf_path, RF_0x65, gain_bmask, (btg >> 1)); - } else { - odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(19), data & BIT(0)); - odm_set_rf_reg(dm, e_rf_path, RF_0x55, gain_bmask, - ((data & 0x1f) >> 1)); - } - - RF_DBG(dm, DBG_RF_MP, - "[kfree] 8821c 0x55[19:14]=0x%X 0x65[19:14]=0x%X\n", - odm_get_rf_reg(dm, e_rf_path, RF_0x55, s_gain_bmask), - odm_get_rf_reg(dm, e_rf_path, RF_0x65, s_gain_bmask)); -} - -void phydm_clear_kfree_to_rf_8821c(void *dm_void, u8 e_rf_path, u8 data) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - u32 gain_bmask = (BIT(18) | BIT(17) | BIT(16) | BIT(15) | BIT(14)); - u32 s_gain_bmask = (BIT(19) | BIT(18) | BIT(17) | - BIT(16) | BIT(15) | BIT(14)); - - odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(0), 1); - odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(5), 1); - odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(6), 1); - odm_set_rf_reg(dm, e_rf_path, RF_0x65, BIT(6), 1); - - odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(19), (data & BIT(0))); - odm_set_rf_reg(dm, e_rf_path, RF_0x55, gain_bmask, (data >> 1)); - - odm_set_rf_reg(dm, e_rf_path, RF_0x65, BIT(19), (data & BIT(0))); - odm_set_rf_reg(dm, e_rf_path, RF_0x65, gain_bmask, (data >> 1)); - - odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(0), 0); - odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(5), 0); - odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(6), 0); - odm_set_rf_reg(dm, e_rf_path, RF_0x65, BIT(6), 0); - - RF_DBG(dm, DBG_RF_MP, - "[kfree] 8821c 0x55[19:14]=0x%X 0x65[19:14]=0x%X\n", - odm_get_rf_reg(dm, e_rf_path, RF_0x55, s_gain_bmask), - odm_get_rf_reg(dm, e_rf_path, RF_0x65, s_gain_bmask)); -} - -void phydm_get_thermal_trim_offset_8822b(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct odm_power_trim_data *power_trim_info = &dm->power_trim_data; - - u8 pg_therm = 0xff; - - odm_efuse_one_byte_read(dm, PPG_THERMAL_OFFSET_22B, &pg_therm, false); - - if (pg_therm != 0xff) { - pg_therm = pg_therm & 0x1f; - if ((pg_therm & BIT(0)) == 0) - power_trim_info->thermal = (-1 * (pg_therm >> 1)); - else - power_trim_info->thermal = (pg_therm >> 1); - - power_trim_info->flag |= KFREE_FLAG_THERMAL_K_ON; - } - - RF_DBG(dm, DBG_RF_MP, "[kfree] 8822b thermal trim flag:0x%02x\n", - power_trim_info->flag); - - if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON) - RF_DBG(dm, DBG_RF_MP, "[kfree] 8822b thermal:%d\n", - power_trim_info->thermal); -} - -void phydm_get_power_trim_offset_8822b(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct odm_power_trim_data *power_trim_info = &dm->power_trim_data; - - u8 pg_power = 0xff, i, j; - - odm_efuse_one_byte_read(dm, PPG_2G_TXAB_22B, &pg_power, false); - - if (pg_power != 0xff) { - /*Path A*/ - odm_efuse_one_byte_read(dm, PPG_2G_TXAB_22B, &pg_power, false); - power_trim_info->bb_gain[0][0] = (pg_power & 0xf); - - /*Path B*/ - odm_efuse_one_byte_read(dm, PPG_2G_TXAB_22B, &pg_power, false); - power_trim_info->bb_gain[0][1] = ((pg_power & 0xf0) >> 4); - - power_trim_info->flag |= KFREE_FLAG_ON_2G; - power_trim_info->flag |= KFREE_FLAG_ON; - } - - odm_efuse_one_byte_read(dm, PPG_5GL1_TXA_22B, &pg_power, false); - - if (pg_power != 0xff) { - /*Path A*/ - odm_efuse_one_byte_read(dm, PPG_5GL1_TXA_22B, &pg_power, false); - power_trim_info->bb_gain[1][0] = pg_power; - odm_efuse_one_byte_read(dm, PPG_5GL2_TXA_22B, &pg_power, false); - power_trim_info->bb_gain[2][0] = pg_power; - odm_efuse_one_byte_read(dm, PPG_5GM1_TXA_22B, &pg_power, false); - power_trim_info->bb_gain[3][0] = pg_power; - odm_efuse_one_byte_read(dm, PPG_5GM2_TXA_22B, &pg_power, false); - power_trim_info->bb_gain[4][0] = pg_power; - odm_efuse_one_byte_read(dm, PPG_5GH1_TXA_22B, &pg_power, false); - power_trim_info->bb_gain[5][0] = pg_power; - - /*Path B*/ - odm_efuse_one_byte_read(dm, PPG_5GL1_TXB_22B, &pg_power, false); - power_trim_info->bb_gain[1][1] = pg_power; - odm_efuse_one_byte_read(dm, PPG_5GL2_TXB_22B, &pg_power, false); - power_trim_info->bb_gain[2][1] = pg_power; - odm_efuse_one_byte_read(dm, PPG_5GM1_TXB_22B, &pg_power, false); - power_trim_info->bb_gain[3][1] = pg_power; - odm_efuse_one_byte_read(dm, PPG_5GM2_TXB_22B, &pg_power, false); - power_trim_info->bb_gain[4][1] = pg_power; - odm_efuse_one_byte_read(dm, PPG_5GH1_TXB_22B, &pg_power, false); - power_trim_info->bb_gain[5][1] = pg_power; - - power_trim_info->flag |= KFREE_FLAG_ON_5G; - power_trim_info->flag |= KFREE_FLAG_ON; - } - - RF_DBG(dm, DBG_RF_MP, "[kfree] 8822b power trim flag:0x%02x\n", - power_trim_info->flag); - - if (!(power_trim_info->flag & KFREE_FLAG_ON)) - return; - - for (i = 0; i < KFREE_BAND_NUM; i++) { - for (j = 0; j < 2; j++) - RF_DBG(dm, DBG_RF_MP, - "[kfree] 8822b PwrTrim->bb_gain[%d][%d]=0x%X\n", - i, j, power_trim_info->bb_gain[i][j]); - } -} - -void phydm_set_pa_bias_to_rf_8822b(void *dm_void, u8 e_rf_path, s8 tx_pa_bias) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - u32 rf_reg_51 = 0, rf_reg_52 = 0, rf_reg_3f = 0; - u32 tx_pa_bias_bmask = (BIT(12) | BIT(11) | BIT(10) | BIT(9)); - - rf_reg_51 = odm_get_rf_reg(dm, e_rf_path, RF_0x51, RFREGOFFSETMASK); - rf_reg_52 = odm_get_rf_reg(dm, e_rf_path, RF_0x52, RFREGOFFSETMASK); - - RF_DBG(dm, DBG_RF_MP, - "[kfree] 8822b 2g rf(0x51)=0x%X rf(0x52)=0x%X path=%d\n", - rf_reg_51, rf_reg_52, e_rf_path); - -#if 0 - /*rf3f => rf52[19:17] = rf3f[2:0] rf52[16:15] = rf3f[4:3] rf52[3:0] = rf3f[8:5]*/ - /*rf3f => rf51[6:3] = rf3f[12:9] rf52[13] = rf3f[13]*/ -#endif - rf_reg_3f = ((rf_reg_52 & 0xe0000) >> 17) | - (((rf_reg_52 & 0x18000) >> 15) << 3) | - ((rf_reg_52 & 0xf) << 5) | - (((rf_reg_51 & 0x78) >> 3) << 9) | - (((rf_reg_52 & 0x2000) >> 13) << 13); - - RF_DBG(dm, DBG_RF_MP, - "[kfree] 8822b 2g original pa_bias=%d rf_reg_3f=0x%X path=%d\n", - tx_pa_bias, rf_reg_3f, e_rf_path); - - tx_pa_bias = (s8)((rf_reg_3f & tx_pa_bias_bmask) >> 9) + tx_pa_bias; - - if (tx_pa_bias < 0) - tx_pa_bias = 0; - else if (tx_pa_bias > 7) - tx_pa_bias = 7; - - rf_reg_3f = ((rf_reg_3f & 0xfe1ff) | (tx_pa_bias << 9)); - - RF_DBG(dm, DBG_RF_MP, - "[kfree] 8822b 2g 0x%X 0x%X pa_bias=%d rfreg_3f=0x%X path=%d\n", - PPG_PABIAS_2GA_22B, PPG_PABIAS_2GB_22B, - tx_pa_bias, rf_reg_3f, e_rf_path); - - odm_set_rf_reg(dm, e_rf_path, RF_0xef, BIT(10), 0x1); - odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x0); - odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK, rf_reg_3f); - odm_set_rf_reg(dm, e_rf_path, RF_0x33, BIT(0), 0x1); - odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK, rf_reg_3f); - odm_set_rf_reg(dm, e_rf_path, RF_0x33, BIT(1), 0x1); - odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK, rf_reg_3f); - odm_set_rf_reg(dm, e_rf_path, RF_0x33, (BIT(1) | BIT(0)), 0x3); - odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK, rf_reg_3f); - odm_set_rf_reg(dm, e_rf_path, RF_0xef, BIT(10), 0x0); - - RF_DBG(dm, DBG_RF_MP, - "[kfree] 8822b 2g tx pa bias rf_0x3f(0x%X) path=%d\n", - odm_get_rf_reg(dm, e_rf_path, RF_0x3f, - (BIT(12) | BIT(11) | BIT(10) | BIT(9))), - e_rf_path); -} - -void phydm_get_pa_bias_offset_8822b(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct odm_power_trim_data *power_trim_info = &dm->power_trim_data; - - u8 pg_pa_bias = 0xff, e_rf_path = 0; - s8 tx_pa_bias[2] = {0}; - - odm_efuse_one_byte_read(dm, PPG_PABIAS_2GA_22B, &pg_pa_bias, false); - - if (pg_pa_bias != 0xff) { - /*paht a*/ - odm_efuse_one_byte_read(dm, PPG_PABIAS_2GA_22B, - &pg_pa_bias, false); - pg_pa_bias = pg_pa_bias & 0xf; - - if ((pg_pa_bias & BIT(0)) == 0) - tx_pa_bias[0] = (-1 * (pg_pa_bias >> 1)); - else - tx_pa_bias[0] = (pg_pa_bias >> 1); - - /*paht b*/ - odm_efuse_one_byte_read(dm, PPG_PABIAS_2GB_22B, - &pg_pa_bias, false); - pg_pa_bias = pg_pa_bias & 0xf; - - if ((pg_pa_bias & BIT(0)) == 0) - tx_pa_bias[1] = (-1 * (pg_pa_bias >> 1)); - else - tx_pa_bias[1] = (pg_pa_bias >> 1); - - RF_DBG(dm, DBG_RF_MP, - "[kfree] 8822b 2g PathA_pa_bias:%d PathB_pa_bias:%d\n", - tx_pa_bias[0], tx_pa_bias[1]); - - for (e_rf_path = RF_PATH_A; e_rf_path < 2; e_rf_path++) - phydm_set_pa_bias_to_rf_8822b(dm, e_rf_path, - tx_pa_bias[e_rf_path]); - - power_trim_info->pa_bias_flag |= PA_BIAS_FLAG_ON; - } else { - RF_DBG(dm, DBG_RF_MP, "[kfree] 8822b 2g tx pa bias no pg\n"); - } -} - -void phydm_set_kfree_to_rf_8822b(void *dm_void, u8 e_rf_path, u8 data) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - u32 gain_bmask = (BIT(18) | BIT(17) | BIT(16) | BIT(15) | BIT(14)); - - odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(0), 1); - odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(4), 1); - odm_set_rf_reg(dm, e_rf_path, RF_0x65, MASKLWORD, 0x9000); - odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(5), 1); - - odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(19), (data & BIT(0))); - odm_set_rf_reg(dm, e_rf_path, RF_0x55, gain_bmask, - ((data & 0x1f) >> 1)); - - RF_DBG(dm, DBG_RF_MP, "[kfree] 8822b 0x55[19:14]=0x%X path=%d\n", - odm_get_rf_reg(dm, e_rf_path, RF_0x55, - (BIT(19) | BIT(18) | BIT(17) | BIT(16) | - BIT(15) | BIT(14))), e_rf_path); -} - -void phydm_clear_kfree_to_rf_8822b(void *dm_void, u8 e_rf_path, u8 data) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - u32 gain_bmask = (BIT(18) | BIT(17) | BIT(16) | BIT(15) | BIT(14)); - - odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(0), 1); - odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(4), 1); - odm_set_rf_reg(dm, e_rf_path, RF_0x65, MASKLWORD, 0x9000); - odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(5), 1); - - odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(19), (data & BIT(0))); - odm_set_rf_reg(dm, e_rf_path, RF_0x55, gain_bmask, - ((data & 0x1f) >> 1)); - - odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(0), 0); - odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(4), 1); - odm_set_rf_reg(dm, e_rf_path, RF_0x65, MASKLWORD, 0x9000); - odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(5), 0); - odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(7), 0); - - RF_DBG(dm, DBG_RF_MP, - "[kfree] 8822b clear power trim 0x55[19:14]=0x%X path=%d\n", - odm_get_rf_reg(dm, e_rf_path, RF_0x55, - (BIT(19) | BIT(18) | BIT(17) | BIT(16) | - BIT(15) | BIT(14))), e_rf_path); -} - -void phydm_get_thermal_trim_offset_8710b(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct odm_power_trim_data *power_trim_info = &dm->power_trim_data; - - u8 pg_therm = 0xff; - - odm_efuse_one_byte_read(dm, 0x0EF, &pg_therm, false); - - if (pg_therm != 0xff) { - pg_therm = pg_therm & 0x1f; - if ((pg_therm & BIT(0)) == 0) - power_trim_info->thermal = (-1 * (pg_therm >> 1)); - else - power_trim_info->thermal = (pg_therm >> 1); - - power_trim_info->flag |= KFREE_FLAG_THERMAL_K_ON; - } - - RF_DBG(dm, DBG_RF_MP, "[kfree] 8710b thermal trim flag:0x%02x\n", - power_trim_info->flag); - - if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON) - RF_DBG(dm, DBG_RF_MP, "[kfree] 8710b thermal:%d\n", - power_trim_info->thermal); -} - -void phydm_get_power_trim_offset_8710b(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct odm_power_trim_data *power_trim_info = &dm->power_trim_data; - - u8 pg_power = 0xff; - - odm_efuse_one_byte_read(dm, 0xEE, &pg_power, false); - - if (pg_power != 0xff) { - /*Path A*/ - odm_efuse_one_byte_read(dm, 0xEE, &pg_power, false); - power_trim_info->bb_gain[0][0] = (pg_power & 0xf); - - power_trim_info->flag |= KFREE_FLAG_ON_2G; - power_trim_info->flag |= KFREE_FLAG_ON; - } - - RF_DBG(dm, DBG_RF_MP, "[kfree] 8710b power trim flag:0x%02x\n", - power_trim_info->flag); - - if (power_trim_info->flag & KFREE_FLAG_ON) - RF_DBG(dm, DBG_RF_MP, - "[kfree] 8710b power_trim_data->bb_gain[0][0]=0x%X\n", - power_trim_info->bb_gain[0][0]); -} - -void phydm_set_kfree_to_rf_8710b(void *dm_void, u8 e_rf_path, u8 data) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - u32 gain_bmask = (BIT(18) | BIT(17) | BIT(16) | BIT(15)); - - odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(19), (data & BIT(0))); - odm_set_rf_reg(dm, e_rf_path, RF_0x55, gain_bmask, ((data & 0xf) >> 1)); - - RF_DBG(dm, DBG_RF_MP, "[kfree] 8710b 0x55[19:14]=0x%X path=%d\n", - odm_get_rf_reg(dm, e_rf_path, RF_0x55, - (BIT(19) | BIT(18) | BIT(17) | BIT(16) | - BIT(15) | BIT(14))), e_rf_path); -} - -void phydm_clear_kfree_to_rf_8710b(void *dm_void, u8 e_rf_path, u8 data) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - u32 gain_bmask = (BIT(18) | BIT(17) | BIT(16) | BIT(15) | BIT(14)); - - odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(19), (data & BIT(0))); - odm_set_rf_reg(dm, e_rf_path, RF_0x55, gain_bmask, - ((data & 0x1f) >> 1)); - - RF_DBG(dm, DBG_RF_MP, - "[kfree] 8710b clear power trim 0x55[19:14]=0x%X path=%d\n", - odm_get_rf_reg(dm, e_rf_path, RF_0x55, - (BIT(19) | BIT(18) | BIT(17) | BIT(16) | - BIT(15) | BIT(14))), e_rf_path); -} - -void phydm_get_thermal_trim_offset_8192f(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct odm_power_trim_data *power_trim_info = &dm->power_trim_data; - - u8 pg_therm = 0xff; - - odm_efuse_one_byte_read(dm, 0x1EF, &pg_therm, false); - - if (pg_therm != 0xff) { - pg_therm = pg_therm & 0x1f; - if ((pg_therm & BIT(0)) == 0) - power_trim_info->thermal = (-1 * (pg_therm >> 1)); - else - power_trim_info->thermal = (pg_therm >> 1); - - power_trim_info->flag |= KFREE_FLAG_THERMAL_K_ON; - } - - RF_DBG(dm, DBG_RF_MP, "[kfree] 8192f thermal trim flag:0x%02x\n", - power_trim_info->flag); - - if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON) - RF_DBG(dm, DBG_RF_MP, "[kfree] 8192f thermal:%d\n", - power_trim_info->thermal); -} - -void phydm_get_power_trim_offset_8192f(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct odm_power_trim_data *power_trim_info = &dm->power_trim_data; - - u8 pg_power1 = 0xff, pg_power2 = 0xff, pg_power3 = 0xff, i, j; - - odm_efuse_one_byte_read(dm, 0x1EE, &pg_power1, false); /*CH4-9*/ - - if (pg_power1 != 0xff) { - /*Path A*/ - odm_efuse_one_byte_read(dm, 0x1EE, &pg_power1, false); - power_trim_info->bb_gain[1][0] = (pg_power1 & 0xf); - /*Path B*/ - odm_efuse_one_byte_read(dm, 0x1EE, &pg_power1, false); - power_trim_info->bb_gain[1][1] = ((pg_power1 & 0xf0) >> 4); - - power_trim_info->flag |= KFREE_FLAG_ON_2G; - power_trim_info->flag |= KFREE_FLAG_ON; - } - - odm_efuse_one_byte_read(dm, 0x1EC, &pg_power2, false); /*CH1-3*/ - - if (pg_power2 != 0xff) { - /*Path A*/ - odm_efuse_one_byte_read(dm, 0x1EC, &pg_power2, false); - power_trim_info->bb_gain[0][0] = (pg_power2 & 0xf); - /*Path B*/ - odm_efuse_one_byte_read(dm, 0x1EC, &pg_power2, false); - power_trim_info->bb_gain[0][1] = ((pg_power2 & 0xf0) >> 4); - - power_trim_info->flag |= KFREE_FLAG_ON_2G; - power_trim_info->flag |= KFREE_FLAG_ON; - } else { - power_trim_info->bb_gain[0][0] = (pg_power1 & 0xf); - power_trim_info->bb_gain[0][1] = ((pg_power1 & 0xf0) >> 4); - } - - odm_efuse_one_byte_read(dm, 0x1EA, &pg_power3, false); /*CH10-14*/ - - if (pg_power3 != 0xff) { - /*Path A*/ - odm_efuse_one_byte_read(dm, 0x1EA, &pg_power3, false); - power_trim_info->bb_gain[2][0] = (pg_power3 & 0xf); - /*Path B*/ - odm_efuse_one_byte_read(dm, 0x1EA, &pg_power3, false); - power_trim_info->bb_gain[2][1] = ((pg_power3 & 0xf0) >> 4); - - power_trim_info->flag |= KFREE_FLAG_ON_2G; - power_trim_info->flag |= KFREE_FLAG_ON; - } else { - power_trim_info->bb_gain[2][0] = (pg_power1 & 0xf); - power_trim_info->bb_gain[2][1] = ((pg_power1 & 0xf0) >> 4); - } - - RF_DBG(dm, DBG_RF_MP, "[kfree] 8192F power trim flag:0x%02x\n", - power_trim_info->flag); - - if (!(power_trim_info->flag & KFREE_FLAG_ON)) - return; - - for (i = 0; i < KFREE_CH_NUM; i++) { - for (j = 0; j < 2; j++) - RF_DBG(dm, DBG_RF_MP, - "[kfree] 8192F PwrTrim->bb_gain[%d][%d]=0x%X\n", - i, j, power_trim_info->bb_gain[i][j]); - } -} - -void phydm_set_kfree_to_rf_8192f(void *dm_void, u8 e_rf_path, u8 channel_idx, - u8 data) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - - /*power_trim based on 55[19:14]*/ - odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(5), 1); - /*enable 55[14] for 0.5db step*/ - odm_set_rf_reg(dm, e_rf_path, RF_0xf5, BIT(18), 1); - /*enter power_trim debug mode*/ - odm_set_rf_reg(dm, e_rf_path, RF_0xdf, BIT(7), 1); - /*write enable*/ - odm_set_rf_reg(dm, e_rf_path, RF_0xef, BIT(7), 1); - - if (e_rf_path == 0) { - if (channel_idx == 0) { - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 0); - odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data); - - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 1); - odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data); - - } else if (channel_idx == 1) { - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 2); - odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data); - - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 3); - odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data); - } else if (channel_idx == 2) { - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 4); - odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data); - - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 5); - odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data); - } - } else if (e_rf_path == 1) { - if (channel_idx == 0) { - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 0); - odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data); - - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 1); - odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data); - } else if (channel_idx == 1) { - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 2); - odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data); - - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 3); - odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data); - } else if (channel_idx == 2) { - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 4); - odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data); - - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 5); - odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data); - } - } - - /*leave power_trim debug mode*/ - odm_set_rf_reg(dm, e_rf_path, RF_0xdf, BIT(7), 0); - /*write disable*/ - odm_set_rf_reg(dm, e_rf_path, RF_0xef, BIT(7), 0); - - RF_DBG(dm, DBG_RF_MP, - "[kfree] 8192F 0x55[19:14]=0x%X path=%d channel=%d\n", - odm_get_rf_reg(dm, e_rf_path, RF_0x55, - (BIT(19) | BIT(18) | BIT(17) | BIT(16) | - BIT(15) | BIT(14))), e_rf_path, channel_idx); -} - -#if 0 -/* -void phydm_clear_kfree_to_rf_8192f(void *dm_void, u8 e_rf_path, u8 data) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct dm_rf_calibration_struct *cali_info = &dm->rf_calibrate_info; - - odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(19), (data & BIT(0))); - odm_set_rf_reg(dm, e_rf_path, RF_0x55, (BIT(18) | BIT(17) | BIT(16) | BIT(15) | BIT(14)), ((data & 0x1f) >> 1)); - - RF_DBG(dm, DBG_RF_MP, - "[kfree] 8192F clear power trim 0x55[19:14]=0x%X path=%d\n", - odm_get_rf_reg(dm, e_rf_path, RF_0x55, (BIT(19) | BIT(18) | BIT(17) | BIT(16) | BIT(15) | BIT(14))), - e_rf_path - ); -} -*/ -#endif - -void phydm_get_thermal_trim_offset_8198f(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct odm_power_trim_data *power_trim_info = &dm->power_trim_data; - - u8 pg_therm = 0xff; - - odm_efuse_one_byte_read(dm, PPG_THERMAL_OFFSET_98F, &pg_therm, false); - - if (pg_therm != 0xff) { - pg_therm = pg_therm & 0x1f; - if ((pg_therm & BIT(0)) == 0) - power_trim_info->thermal = (-1 * (pg_therm >> 1)); - else - power_trim_info->thermal = (pg_therm >> 1); - - power_trim_info->flag |= KFREE_FLAG_THERMAL_K_ON; - } - - RF_DBG(dm, DBG_RF_MP, "[kfree] 8198f thermal trim flag:0x%02x\n", - power_trim_info->flag); - - if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON) - RF_DBG(dm, DBG_RF_MP, "[kfree] 8198f thermal:%d\n", - power_trim_info->thermal); -} - -void phydm_get_power_trim_offset_8198f(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct odm_power_trim_data *power_trim_info = &dm->power_trim_data; - - u8 pg_power = 0xff, i, j; - - odm_efuse_one_byte_read(dm, PPG_2GL_TXAB_98F, &pg_power, false); - - if (pg_power != 0xff) { - power_trim_info->bb_gain[0][0] = pg_power & 0xf; - power_trim_info->bb_gain[0][1] = (pg_power & 0xf0) >> 4; - - odm_efuse_one_byte_read(dm, PPG_2GL_TXCD_98F, &pg_power, false); - power_trim_info->bb_gain[0][2] = pg_power & 0xf; - power_trim_info->bb_gain[0][3] = (pg_power & 0xf0) >> 4; - - odm_efuse_one_byte_read(dm, PPG_2GM_TXAB_98F, &pg_power, false); - power_trim_info->bb_gain[1][0] = pg_power & 0xf; - power_trim_info->bb_gain[1][1] = (pg_power & 0xf0) >> 4; - - odm_efuse_one_byte_read(dm, PPG_2GM_TXCD_98F, &pg_power, false); - power_trim_info->bb_gain[1][2] = pg_power & 0xf; - power_trim_info->bb_gain[1][3] = (pg_power & 0xf0) >> 4; - - odm_efuse_one_byte_read(dm, PPG_5GH_TXAB_98F, &pg_power, false); - power_trim_info->bb_gain[2][0] = pg_power & 0xf; - power_trim_info->bb_gain[2][1] = (pg_power & 0xf0) >> 4; - - odm_efuse_one_byte_read(dm, PPG_5GH_TXCD_98F, &pg_power, false); - power_trim_info->bb_gain[2][2] = pg_power & 0xf; - power_trim_info->bb_gain[2][3] = (pg_power & 0xf0) >> 4; - - power_trim_info->flag = - power_trim_info->flag | KFREE_FLAG_ON | KFREE_FLAG_ON_2G; - } - - RF_DBG(dm, DBG_RF_MP, "[kfree] 8198f power trim flag:0x%02x\n", - power_trim_info->flag); - - if (power_trim_info->flag & KFREE_FLAG_ON) { - for (i = 0; i < KFREE_BAND_NUM; i++) { - for (j = 0; j < MAX_RF_PATH; j++) { - RF_DBG(dm, DBG_RF_MP, - "[kfree] 8198f pwr_trim->bb_gain[%d][%d]=0x%X\n", - i, j, power_trim_info->bb_gain[i][j]); - } - } - } -} - -void phydm_set_kfree_to_rf_8198f(void *dm_void, u8 e_rf_path, u8 data) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct odm_power_trim_data *power_trim_info = &dm->power_trim_data; - u32 band, i; - s8 pwr_offset[3]; - - RF_DBG(dm, DBG_RF_MP, - "[kfree] %s:Set kfree to rf 0x33\n", __func__); - - /*power_trim based on 55[19:14]*/ - odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(5), 1); - /*enable 55[14] for 0.5db step*/ - odm_set_rf_reg(dm, e_rf_path, RF_0xf5, BIT(18), 1); - /*enter power_trim debug mode*/ - odm_set_rf_reg(dm, e_rf_path, RF_0xdf, BIT(7), 0); - /*write enable*/ - odm_set_rf_reg(dm, e_rf_path, RF_0xef, BIT(7), 1); - - for (i =0; i < 3; i++) - pwr_offset[i] = power_trim_info->bb_gain[i][e_rf_path]; - - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 0); - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, pwr_offset[0]); - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 1); - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, pwr_offset[0]); - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 2); - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, pwr_offset[1]); - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 3); - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, pwr_offset[1]); - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 4); - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, pwr_offset[2]); - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 5); - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, pwr_offset[2]); - - /*leave power_trim debug mode*/ - /*odm_set_rf_reg(dm, e_rf_path, RF_0xdf, BIT(7), 0);*/ - /*write disable*/ - odm_set_rf_reg(dm, e_rf_path, RF_0xef, BIT(7), 0); - -} - -void phydm_clear_kfree_to_rf_8198f(void *dm_void, u8 e_rf_path, u8 data) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - - RF_DBG(dm, DBG_RF_MP, - "[kfree] %s:Clear kfree to rf 0x55\n", __func__); -#if 0 - /*power_trim based on 55[19:14]*/ - odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(5), 1); - /*enable 55[14] for 0.5db step*/ - odm_set_rf_reg(dm, e_rf_path, RF_0xf5, BIT(18), 1); - /*enter power_trim debug mode*/ - odm_set_rf_reg(dm, e_rf_path, RF_0xdf, BIT(7), 0); - /*write enable*/ - odm_set_rf_reg(dm, e_rf_path, RF_0xef, BIT(7), 1); - - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 0); - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, data); - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 1); - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, data); - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 2); - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, data); - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 3); - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, data); - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 4); - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, data); - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 5); - odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, data); - - /*leave power_trim debug mode*/ - odm_set_rf_reg(dm, e_rf_path, RF_0xdf, BIT(7), 0); - /*enable 55[14] for 0.5db step*/ - odm_set_rf_reg(dm, e_rf_path, RF_0xf5, BIT(18), 0); - /*write disable*/ - odm_set_rf_reg(dm, e_rf_path, RF_0xef, BIT(7), 0); -#else - - odm_set_rf_reg(dm, e_rf_path, RF_0xdf, BIT(7), 1); - /*odm_set_rf_reg(dm, e_rf_path, RF_0xf5, BIT(18), 0);*/ - -#endif - -} - - -void phydm_set_kfree_to_rf(void *dm_void, u8 e_rf_path, u8 data) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - - if (dm->support_ic_type & ODM_RTL8814A) - phydm_set_kfree_to_rf_8814a(dm, e_rf_path, data); - - if ((dm->support_ic_type & ODM_RTL8821C) && - (*dm->band_type == ODM_BAND_2_4G)) - phydm_set_kfree_to_rf_8821c(dm, e_rf_path, true, data); - else if (dm->support_ic_type & ODM_RTL8821C) - phydm_set_kfree_to_rf_8821c(dm, e_rf_path, false, data); - - if (dm->support_ic_type & ODM_RTL8822B) - phydm_set_kfree_to_rf_8822b(dm, e_rf_path, data); - - if (dm->support_ic_type & ODM_RTL8710B) - phydm_set_kfree_to_rf_8710b(dm, e_rf_path, data); - - if (dm->support_ic_type & ODM_RTL8198F) - phydm_set_kfree_to_rf_8198f(dm, e_rf_path, data); -} - -void phydm_clear_kfree_to_rf(void *dm_void, u8 e_rf_path, u8 data) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - - if (dm->support_ic_type & ODM_RTL8822B) - phydm_clear_kfree_to_rf_8822b(dm, e_rf_path, 1); - - if (dm->support_ic_type & ODM_RTL8821C) - phydm_clear_kfree_to_rf_8821c(dm, e_rf_path, 1); - - if (dm->support_ic_type & ODM_RTL8198F) - phydm_clear_kfree_to_rf_8198f(dm, e_rf_path, 0); -} - -void phydm_get_thermal_trim_offset(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - -#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) - void *adapter = dm->adapter; - HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter)); - PEFUSE_HAL pEfuseHal = &hal_data->EfuseHal; - u1Byte eFuseContent[DCMD_EFUSE_MAX_SECTION_NUM * EFUSE_MAX_WORD_UNIT * 2]; - - if (HAL_MAC_Dump_EFUSE(&GET_HAL_MAC_INFO((PADAPTER)adapter), EFUSE_WIFI, eFuseContent, pEfuseHal->PhysicalLen_WiFi, HAL_MAC_EFUSE_PHYSICAL, HAL_MAC_EFUSE_PARSE_DRV) != RT_STATUS_SUCCESS) - RF_DBG(dm, DBG_RF_MP, "[kfree] dump efuse fail !!!\n"); -#endif - - if (dm->support_ic_type & ODM_RTL8821C) - phydm_get_thermal_trim_offset_8821c(dm_void); - else if (dm->support_ic_type & ODM_RTL8822B) - phydm_get_thermal_trim_offset_8822b(dm_void); - else if (dm->support_ic_type & ODM_RTL8710B) - phydm_get_thermal_trim_offset_8710b(dm_void); - else if (dm->support_ic_type & ODM_RTL8192F) - phydm_get_thermal_trim_offset_8192f(dm_void); - else if (dm->support_ic_type & ODM_RTL8198F) - phydm_get_thermal_trim_offset_8198f(dm_void); -} - -void phydm_get_power_trim_offset(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - -#if 0 //(DM_ODM_SUPPORT_TYPE & ODM_WIN) // 2017 MH DM Should use the same code.s - void *adapter = dm->adapter; - HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter)); - PEFUSE_HAL pEfuseHal = &hal_data->EfuseHal; - u1Byte eFuseContent[DCMD_EFUSE_MAX_SECTION_NUM * EFUSE_MAX_WORD_UNIT * 2]; - - if (HAL_MAC_Dump_EFUSE(&GET_HAL_MAC_INFO(adapter), EFUSE_WIFI, eFuseContent, pEfuseHal->PhysicalLen_WiFi, HAL_MAC_EFUSE_PHYSICAL, HAL_MAC_EFUSE_PARSE_DRV) != RT_STATUS_SUCCESS) - RF_DBG(dm, DBG_RF_MP, "[kfree] dump efuse fail !!!\n"); -#endif - - if (dm->support_ic_type & ODM_RTL8821C) - phydm_get_power_trim_offset_8821c(dm_void); - else if (dm->support_ic_type & ODM_RTL8822B) - phydm_get_power_trim_offset_8822b(dm_void); - else if (dm->support_ic_type & ODM_RTL8710B) - phydm_get_power_trim_offset_8710b(dm_void); - else if (dm->support_ic_type & ODM_RTL8192F) - phydm_get_power_trim_offset_8192f(dm_void); - else if (dm->support_ic_type & ODM_RTL8198F) - phydm_get_power_trim_offset_8198f(dm_void); -} - -void phydm_get_pa_bias_offset(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - -#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) - void *adapter = dm->adapter; - HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter)); - PEFUSE_HAL pEfuseHal = &hal_data->EfuseHal; - u1Byte eFuseContent[DCMD_EFUSE_MAX_SECTION_NUM * EFUSE_MAX_WORD_UNIT * 2]; - - if (HAL_MAC_Dump_EFUSE(&GET_HAL_MAC_INFO((PADAPTER)adapter), EFUSE_WIFI, eFuseContent, pEfuseHal->PhysicalLen_WiFi, HAL_MAC_EFUSE_PHYSICAL, HAL_MAC_EFUSE_PARSE_DRV) != RT_STATUS_SUCCESS) - RF_DBG(dm, DBG_RF_MP, "[kfree] dump efuse fail !!!\n"); -#endif - - if (dm->support_ic_type & ODM_RTL8822B) - phydm_get_pa_bias_offset_8822b(dm_void); -} - -s8 phydm_get_thermal_offset(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct odm_power_trim_data *power_trim_info = &dm->power_trim_data; - - if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON) - return power_trim_info->thermal; - else - return 0; -} - -void phydm_do_kfree(void *dm_void, u8 channel_to_sw) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct odm_power_trim_data *pwrtrim = &dm->power_trim_data; - u8 channel_idx = 0, rfpath = 0, max_path = 0, kfree_band_num = 0; - u8 i, j; - s8 bb_gain; - - if (dm->support_ic_type & ODM_RTL8814A) - max_path = 4; /*0~3*/ - else if (dm->support_ic_type & - (ODM_RTL8812 | ODM_RTL8822B | ODM_RTL8192F)) { - max_path = 2; /*0~1*/ - kfree_band_num = KFREE_BAND_NUM; - } else if (dm->support_ic_type & ODM_RTL8821C) { - max_path = 1; - kfree_band_num = KFREE_BAND_NUM; - } else if (dm->support_ic_type & ODM_RTL8710B) { - max_path = 1; - kfree_band_num = 1; - } else if (dm->support_ic_type & ODM_RTL8198F) { - max_path = 4; - kfree_band_num = 3; - } - - if (dm->support_ic_type & - (ODM_RTL8192F | ODM_RTL8822B | ODM_RTL8821C | - ODM_RTL8814A | ODM_RTL8710B)) { - for (i = 0; i < kfree_band_num; i++) { - for (j = 0; j < max_path; j++) - RF_DBG(dm, DBG_RF_MP, - "[kfree] PwrTrim->gain[%d][%d]=0x%X\n", - i, j, pwrtrim->bb_gain[i][j]); - } - } - if (*dm->band_type == ODM_BAND_2_4G && - pwrtrim->flag & KFREE_FLAG_ON_2G) { - if (!(dm->support_ic_type & ODM_RTL8192F)) { - if (channel_to_sw >= 1 && channel_to_sw <= 14) - channel_idx = PHYDM_2G; - for (rfpath = RF_PATH_A; rfpath < max_path; rfpath++) { - RF_DBG(dm, DBG_RF_MP, - "[kfree] %s:chnl=%d PATH=%d gain:0x%X\n", - __func__, channel_to_sw, rfpath, - pwrtrim->bb_gain[channel_idx][rfpath]); - bb_gain = pwrtrim->bb_gain[channel_idx][rfpath]; - phydm_set_kfree_to_rf(dm, rfpath, bb_gain); - } - } else if (dm->support_ic_type & ODM_RTL8192F) { - if (channel_to_sw >= 1 && channel_to_sw <= 3) - channel_idx = 0; - if (channel_to_sw >= 4 && channel_to_sw <= 9) - channel_idx = 1; - if (channel_to_sw >= 10 && channel_to_sw <= 14) - channel_idx = 2; - for (rfpath = RF_PATH_A; rfpath < max_path; rfpath++) { - RF_DBG(dm, DBG_RF_MP, - "[kfree] %s:chnl=%d PATH=%d gain:0x%X\n", - __func__, channel_to_sw, rfpath, - pwrtrim->bb_gain[channel_idx][rfpath]); - bb_gain = pwrtrim->bb_gain[channel_idx][rfpath]; - phydm_set_kfree_to_rf_8192f(dm, rfpath, - channel_idx, - bb_gain); - } - } - } else if (*dm->band_type == ODM_BAND_5G && - pwrtrim->flag & KFREE_FLAG_ON_5G) { - if (channel_to_sw >= 36 && channel_to_sw <= 48) - channel_idx = PHYDM_5GLB1; - if (channel_to_sw >= 52 && channel_to_sw <= 64) - channel_idx = PHYDM_5GLB2; - if (channel_to_sw >= 100 && channel_to_sw <= 120) - channel_idx = PHYDM_5GMB1; - if (channel_to_sw >= 122 && channel_to_sw <= 144) - channel_idx = PHYDM_5GMB2; - if (channel_to_sw >= 149 && channel_to_sw <= 177) - channel_idx = PHYDM_5GHB; - - for (rfpath = RF_PATH_A; rfpath < max_path; rfpath++) { - RF_DBG(dm, DBG_RF_MP, - "[kfree] %s: channel=%d PATH=%d bb_gain:0x%X\n", - __func__, channel_to_sw, rfpath, - pwrtrim->bb_gain[channel_idx][rfpath]); - bb_gain = pwrtrim->bb_gain[channel_idx][rfpath]; - phydm_set_kfree_to_rf(dm, rfpath, bb_gain); - } - } else { - RF_DBG(dm, DBG_RF_MP, "[kfree] Set default Register\n"); - if (!(dm->support_ic_type & ODM_RTL8192F)) { - for (rfpath = RF_PATH_A; rfpath < max_path; rfpath++) { - bb_gain = pwrtrim->bb_gain[channel_idx][rfpath]; - phydm_clear_kfree_to_rf(dm, rfpath, bb_gain); - } - } -#if 0 - /*else if(dm->support_ic_type & ODM_RTL8192F){ - if (channel_to_sw >= 1 && channel_to_sw <= 3) - channel_idx = 0; - if (channel_to_sw >= 4 && channel_to_sw <= 9) - channel_idx = 1; - if (channel_to_sw >= 9 && channel_to_sw <= 14) - channel_idx = 2; - for (rfpath = RF_PATH_A; rfpath < max_path; rfpath++) - phydm_clear_kfree_to_rf_8192f(dm, rfpath, pwrtrim->bb_gain[channel_idx][rfpath]); - }*/ -#endif - } -} - -void phydm_config_kfree(void *dm_void, u8 channel_to_sw) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct dm_rf_calibration_struct *cali_info = &dm->rf_calibrate_info; - struct odm_power_trim_data *pwrtrim = &dm->power_trim_data; - - RF_DBG(dm, DBG_RF_MP, "===>[kfree] phy_ConfigKFree()\n"); - - if (cali_info->reg_rf_kfree_enable == 2) { - RF_DBG(dm, DBG_RF_MP, - "[kfree] %s: reg_rf_kfree_enable == 2, Disable\n", - __func__); - return; - } else if (cali_info->reg_rf_kfree_enable == 1 || - cali_info->reg_rf_kfree_enable == 0) { - RF_DBG(dm, DBG_RF_MP, - "[kfree] %s: reg_rf_kfree_enable == true\n", __func__); - /*Make sure the targetval is defined*/ - if (!(pwrtrim->flag & KFREE_FLAG_ON)) { - RF_DBG(dm, DBG_RF_MP, - "[kfree] %s: efuse is 0xff, KFree not work\n", - __func__); - return; - } -#if 0 - /*if kfree_table[0] == 0xff, means no Kfree*/ -#endif - phydm_do_kfree(dm, channel_to_sw); - } - RF_DBG(dm, DBG_RF_MP, "<===[kfree] phy_ConfigKFree()\n"); -} diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/halrf_kfree.h b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/halrf_kfree.h deleted file mode 100644 index d57488ae83784c..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/halrf_kfree.h +++ /dev/null @@ -1,119 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2017 Realtek Corporation. - * - * 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 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. - * - * The full GNU General Public License is included in this distribution in the - * file called LICENSE. - * - * Contact Information: - * wlanfae - * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park, - * Hsinchu 300, Taiwan. - * - * Larry Finger - * - *****************************************************************************/ - -#ifndef __HALRF_KFREE_H__ -#define __HALRF_KFREE_H__ - -#define KFREE_VERSION "1.0" - -#define KFREE_BAND_NUM 6 -#define KFREE_CH_NUM 3 - -#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_AP)) - -#define BB_GAIN_NUM 6 - -#endif - -#define KFREE_FLAG_ON BIT(0) -#define KFREE_FLAG_THERMAL_K_ON BIT(1) - -#define KFREE_FLAG_ON_2G BIT(2) -#define KFREE_FLAG_ON_5G BIT(3) - -#define PA_BIAS_FLAG_ON BIT(4) - -#define PPG_THERMAL_OFFSET_98F 0x50 -#define PPG_2GM_TXAB_98F 0x51 -#define PPG_2GM_TXCD_98F 0x52 -#define PPG_2GL_TXAB_98F 0x53 -#define PPG_2GL_TXCD_98F 0x54 -#define PPG_5GH_TXAB_98F 0x55 -#define PPG_5GH_TXCD_98F 0x56 - -#define PPG_THERMAL_OFFSET_21C 0x1EF -#define PPG_2G_TXAB_21C 0x1EE -#define PPG_5GL1_TXA_21C 0x1EC -#define PPG_5GL2_TXA_21C 0x1E8 -#define PPG_5GM1_TXA_21C 0x1E4 -#define PPG_5GM2_TXA_21C 0x1E0 -#define PPG_5GH1_TXA_21C 0x1DC - -#define PPG_THERMAL_OFFSET_22B 0x3EF -#define PPG_2G_TXAB_22B 0x3EE -#define PPG_2G_TXCD_22B 0x3ED -#define PPG_5GL1_TXA_22B 0x3EC -#define PPG_5GL1_TXB_22B 0x3EB -#define PPG_5GL1_TXC_22B 0x3EA -#define PPG_5GL1_TXD_22B 0x3E9 -#define PPG_5GL2_TXA_22B 0x3E8 -#define PPG_5GL2_TXB_22B 0x3E7 -#define PPG_5GL2_TXC_22B 0x3E6 -#define PPG_5GL2_TXD_22B 0x3E5 -#define PPG_5GM1_TXA_22B 0x3E4 -#define PPG_5GM1_TXB_22B 0x3E3 -#define PPG_5GM1_TXC_22B 0x3E2 -#define PPG_5GM1_TXD_22B 0x3E1 -#define PPG_5GM2_TXA_22B 0x3E0 -#define PPG_5GM2_TXB_22B 0x3DF -#define PPG_5GM2_TXC_22B 0x3DE -#define PPG_5GM2_TXD_22B 0x3DD -#define PPG_5GH1_TXA_22B 0x3DC -#define PPG_5GH1_TXB_22B 0x3DB -#define PPG_5GH1_TXC_22B 0x3DA -#define PPG_5GH1_TXD_22B 0x3D9 - -#define PPG_PABIAS_2GA_22B 0x3D5 -#define PPG_PABIAS_2GB_22B 0x3D6 - -struct odm_power_trim_data { - u8 flag; - u8 pa_bias_flag; - s8 bb_gain[KFREE_BAND_NUM][MAX_RF_PATH]; - s8 thermal; -}; - -enum phydm_kfree_channeltosw { - PHYDM_2G = 0, - PHYDM_5GLB1 = 1, - PHYDM_5GLB2 = 2, - PHYDM_5GMB1 = 3, - PHYDM_5GMB2 = 4, - PHYDM_5GHB = 5, -}; - -void phydm_get_thermal_trim_offset(void *dm_void); - -void phydm_get_power_trim_offset(void *dm_void); - -void phydm_get_pa_bias_offset(void *dm_void); - -s8 phydm_get_thermal_offset(void *dm_void); - -void phydm_clear_kfree_to_rf(void *dm_void, u8 e_rf_path, u8 data); - -void phydm_config_kfree(void *dm_void, u8 channel_to_sw); - -#endif /*__HALRF_KFREE_H__*/ diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ap.c b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ap.c deleted file mode 100644 index 5cdd0b1c47b2d0..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ap.c +++ /dev/null @@ -1,1225 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -#if !defined(__ECOS) && !defined(CONFIG_COMPAT_WIRELESS) -#include "mp_precomp.h" -#else -#include "../mp_precomp.h" -#endif -#include "../phydm_precomp.h" - - - -/*---------------------------Define Local Constant---------------------------*/ -// 2010/04/25 MH Define the max tx power tracking tx agc power. -#define ODM_TXPWRTRACK_MAX_IDX8814A 6 - -/*---------------------------Define Local Constant---------------------------*/ - - -//3============================================================ -//3 Tx Power Tracking -//3============================================================ - -u1Byte -CheckRFGainOffset( - PDM_ODM_T pDM_Odm, - PWRTRACK_METHOD Method, - u1Byte RFPath - ) -{ - s1Byte UpperBound = 10, LowerBound = -5; // 4'b1010 = 10 - s1Byte Final_RF_Index = 0; - BOOLEAN bPositive = FALSE; - u4Byte bitMask = 0; - u1Byte Final_OFDM_Swing_Index = 0, TxScalingUpperBound = 28, TxScalingLowerBound = 4;// upper bound +2dB, lower bound -9dB - PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - - if(Method == MIX_MODE) //normal Tx power tracking - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("is 8814 MP chip\n")); - bitMask = BIT19; - pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] = pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] + pRFCalibrateInfo->KfreeOffset[RFPath]; - - if( pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] >= 0) // check if RF_Index is positive or not - bPositive = TRUE; - else - bPositive = FALSE; - - ODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, bPositive); - - bitMask = BIT18|BIT17|BIT16|BIT15; - Final_RF_Index = pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] / 2; /*TxBB 1 step equal 1dB, BB swing 1step equal 0.5dB*/ - - } - - if(Final_RF_Index > UpperBound) //Upper bound = 10dB, if more htan upper bound, then move to bb swing max = +2dB - { - ODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, UpperBound); //set RF Reg0x55 per path - - Final_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex + (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] - (UpperBound << 1)); - - if(Final_OFDM_Swing_Index > TxScalingUpperBound) // bb swing upper bound = +2dB - Final_OFDM_Swing_Index = TxScalingUpperBound; - - return Final_OFDM_Swing_Index; - } - else if(Final_RF_Index < LowerBound) // lower bound = -5dB - { - ODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, (-1)*(LowerBound)); //set RF Reg0x55 per path - - Final_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex - ((LowerBound<<1) - pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath]); - - if(Final_OFDM_Swing_Index < TxScalingLowerBound) // bb swing lower bound = -10dB - Final_OFDM_Swing_Index = TxScalingLowerBound; - return Final_OFDM_Swing_Index; - } - else // normal case - { - - if(bPositive == TRUE) - ODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, Final_RF_Index); //set RF Reg0x55 per path - else - ODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, (-1)*Final_RF_Index); //set RF Reg0x55 per path - - Final_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex + (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath])%2; - return Final_OFDM_Swing_Index; - } - - return FALSE; -} - - -VOID -ODM_TxPwrTrackSetPwr8814A( - PDM_ODM_T pDM_Odm, - PWRTRACK_METHOD Method, - u1Byte RFPath, - u1Byte ChannelMappedIndex - ) -{ -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - PADAPTER Adapter = pDM_Odm->Adapter; - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); -#endif - u1Byte Final_OFDM_Swing_Index = 0; - PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - - if (Method == MIX_MODE) - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("pDM_Odm->DefaultOfdmIndex=%d, pDM_Odm->Absolute_OFDMSwingIdx[RFPath]=%d, RF_Path = %d\n", - pRFCalibrateInfo->DefaultOfdmIndex, pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath], RFPath)); - - Final_OFDM_Swing_Index = CheckRFGainOffset(pDM_Odm, MIX_MODE, RFPath); - } - else if(Method == TSSI_MODE) - { - ODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, BIT18|BIT17|BIT16|BIT15, 0); - } - else if(Method == BBSWING) // use for mp driver clean power tracking status - { - pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] = pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] + pRFCalibrateInfo->KfreeOffset[RFPath]; - - Final_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex + (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath]); - - ODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, BIT18|BIT17|BIT16|BIT15, 0); - } - - if((Method == MIX_MODE) || (Method == BBSWING)) - { - switch(RFPath) - { - case ODM_RF_PATH_A: - - ODM_SetBBReg(pDM_Odm, rA_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); //set BBswing - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("******Path_A Compensate with BBSwing , Final_OFDM_Swing_Index = %d \n", Final_OFDM_Swing_Index)); - break; - - case ODM_RF_PATH_B: - - ODM_SetBBReg(pDM_Odm, rB_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); //set BBswing - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("******Path_B Compensate with BBSwing , Final_OFDM_Swing_Index = %d \n", Final_OFDM_Swing_Index)); - break; - - case ODM_RF_PATH_C: - - ODM_SetBBReg(pDM_Odm, rC_TxScale_Jaguar2, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); //set BBswing - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("******Path_C Compensate with BBSwing , Final_OFDM_Swing_Index = %d \n", Final_OFDM_Swing_Index)); - break; - - case ODM_RF_PATH_D: - - ODM_SetBBReg(pDM_Odm, rD_TxScale_Jaguar2, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); //set BBswing - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("******Path_D Compensate with BBSwing , Final_OFDM_Swing_Index = %d \n", Final_OFDM_Swing_Index)); - break; - - default: - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("Wrong Path name!!!! \n")); - - break; - } - } - return; -} // ODM_TxPwrTrackSetPwr8814A - -VOID -GetDeltaSwingTable_8814A( - IN PDM_ODM_T pDM_Odm, - OUT pu1Byte *TemperatureUP_A, - OUT pu1Byte *TemperatureDOWN_A, - OUT pu1Byte *TemperatureUP_B, - OUT pu1Byte *TemperatureDOWN_B - ) -{ - PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - u2Byte rate = *(pDM_Odm->pForcedDataRate); - u1Byte channel = *(pDM_Odm->pChannel); - - if ( 1 <= channel && channel <= 14) { - if (IS_CCK_RATE(rate)) { - *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P; - *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N; - *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P; - *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N; - } else { - *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P; - *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N; - *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P; - *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N; - } - } else if ( 36 <= channel && channel <= 64) { - *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[0]; - *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[0]; - *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[0]; - *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[0]; - } else if ( 100 <= channel && channel <= 140) { - *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[1]; - *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[1]; - *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[1]; - *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[1]; - } else if ( 149 <= channel && channel <= 173) { - *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[2]; - *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[2]; - *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[2]; - *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[2]; - } else { - *TemperatureUP_A = (pu1Byte)DeltaSwingTableIdx_2GA_P_DEFAULT; - *TemperatureDOWN_A = (pu1Byte)DeltaSwingTableIdx_2GA_N_DEFAULT; - *TemperatureUP_B = (pu1Byte)DeltaSwingTableIdx_2GA_P_DEFAULT; - *TemperatureDOWN_B = (pu1Byte)DeltaSwingTableIdx_2GA_N_DEFAULT; - } - - return; -} - - -VOID -GetDeltaSwingTable_8814A_PathCD( - IN PDM_ODM_T pDM_Odm, - OUT pu1Byte *TemperatureUP_C, - OUT pu1Byte *TemperatureDOWN_C, - OUT pu1Byte *TemperatureUP_D, - OUT pu1Byte *TemperatureDOWN_D - ) -{ - PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - u2Byte rate = *(pDM_Odm->pForcedDataRate); - u1Byte channel = *(pDM_Odm->pChannel); - - if ( 1 <= channel && channel <= 14) { - if (IS_CCK_RATE(rate)) { - *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKC_P; - *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKC_N; - *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKD_P; - *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKD_N; - } else { - *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GC_P; - *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GC_N; - *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GD_P; - *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GD_N; - } - } else if ( 36 <= channel && channel <= 64) { - *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P[0]; - *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N[0]; - *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P[0]; - *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N[0]; - } else if ( 100 <= channel && channel <= 140) { - *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P[1]; - *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N[1]; - *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P[1]; - *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N[1]; - } else if ( 149 <= channel && channel <= 173) { - *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P[2]; - *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N[2]; - *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P[2]; - *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N[2]; - } else { - *TemperatureUP_C = (pu1Byte)DeltaSwingTableIdx_2GA_P_DEFAULT; - *TemperatureDOWN_C = (pu1Byte)DeltaSwingTableIdx_2GA_N_DEFAULT; - *TemperatureUP_D = (pu1Byte)DeltaSwingTableIdx_2GA_P_DEFAULT; - *TemperatureDOWN_D = (pu1Byte)DeltaSwingTableIdx_2GA_N_DEFAULT; - } - - return; -} - - -void ConfigureTxpowerTrack_8814A( - IN PTXPWRTRACK_CFG pConfig - ) -{ - pConfig->SwingTableSize_CCK = ODM_CCK_TABLE_SIZE; - pConfig->SwingTableSize_OFDM = ODM_OFDM_TABLE_SIZE; - pConfig->Threshold_IQK = 8; - pConfig->AverageThermalNum = AVG_THERMAL_NUM_8814A; - pConfig->RfPathCount = MAX_PATH_NUM_8814A; - pConfig->ThermalRegAddr = RF_T_METER_8814A; - - pConfig->ODM_TxPwrTrackSetPwr = ODM_TxPwrTrackSetPwr8814A; - pConfig->PHY_LCCalibrate = PHY_LCCalibrate_8814A; - pConfig->DoIQK = DoIQK_8814A; - pConfig->GetDeltaSwingTable = GetDeltaSwingTable_8814A; - pConfig->GetDeltaSwingTable8814only = GetDeltaSwingTable_8814A_PathCD; -} - -//1 7. IQK -// -// 2011/07/26 MH Add an API for testing IQK fail case. -// -// MP Already declare in odm.c -#if 0 //!(DM_ODM_SUPPORT_TYPE & ODM_WIN) -BOOLEAN -ODM_CheckPowerStatus( - IN PADAPTER Adapter) -{ - /* - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; - RT_RF_POWER_STATE rtState; - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - - // 2011/07/27 MH We are not testing ready~~!! We may fail to get correct value when init sequence. - if (pMgntInfo->init_adpt_in_progress == TRUE) - { - ODM_RT_TRACE(pDM_Odm,COMP_INIT, DBG_LOUD, ("ODM_CheckPowerStatus Return TRUE, due to initadapter")); - return TRUE; - } - - // - // 2011/07/19 MH We can not execute tx pwoer tracking/ LLC calibrate or IQK. - // - Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_RF_STATE, (pu1Byte)(&rtState)); - if(Adapter->bDriverStopped || Adapter->bDriverIsGoingToPnpSetPowerSleep || rtState == eRfOff) - { - ODM_RT_TRACE(pDM_Odm,COMP_INIT, DBG_LOUD, ("ODM_CheckPowerStatus Return FALSE, due to %d/%d/%d\n", - Adapter->bDriverStopped, Adapter->bDriverIsGoingToPnpSetPowerSleep, rtState)); - return FALSE; - } - */ - return TRUE; -} -#endif - -VOID - _PHY_SaveADDARegisters_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN pu4Byte ADDAReg, - IN pu4Byte ADDABackup, - IN u4Byte RegisterNum - ) -{ - u4Byte i; -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - - if (ODM_CheckPowerStatus(pAdapter) == FALSE) - return; -#endif - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Save ADDA parameters.\n")); - for( i = 0 ; i < RegisterNum ; i++){ - ADDABackup[i] = ODM_GetBBReg(pDM_Odm, ADDAReg[i], bMaskDWord); - } -} - -VOID - _PHY_SaveMACRegisters_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN pu4Byte MACReg, - IN pu4Byte MACBackup - ) -{ - u4Byte i; -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); -#endif - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Save MAC parameters.\n")); - for( i = 0 ; i < (IQK_MAC_REG_NUM - 1); i++){ - MACBackup[i] = ODM_Read1Byte(pDM_Odm, MACReg[i]); - } - MACBackup[i] = ODM_Read4Byte(pDM_Odm, MACReg[i]); -} - - -VOID - _PHY_ReloadADDARegisters_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN pu4Byte ADDAReg, - IN pu4Byte ADDABackup, - IN u4Byte RegiesterNum - ) -{ - u4Byte i; -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); -#endif - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Reload ADDA power saving parameters !\n")); - for(i = 0 ; i < RegiesterNum; i++) - { - ODM_SetBBReg(pDM_Odm, ADDAReg[i], bMaskDWord, ADDABackup[i]); - } -} - -VOID - _PHY_ReloadMACRegisters_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN pu4Byte MACReg, - IN pu4Byte MACBackup - ) -{ - u4Byte i; -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); -#endif - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Reload MAC parameters !\n")); - for(i = 0 ; i < (IQK_MAC_REG_NUM - 1); i++){ - ODM_Write1Byte(pDM_Odm, MACReg[i], (u1Byte)MACBackup[i]); - } - ODM_Write4Byte(pDM_Odm, MACReg[i], MACBackup[i]); -} - -VOID - _PHY_MACSettingCalibration_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN pu4Byte MACReg, - IN pu4Byte MACBackup - ) -{ - u4Byte i = 0; -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); -#endif - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("MAC settings for Calibration.\n")); - - ODM_Write1Byte(pDM_Odm, MACReg[i], 0x3F); - - for(i = 1 ; i < (IQK_MAC_REG_NUM - 1); i++){ - ODM_Write1Byte(pDM_Odm, MACReg[i], (u1Byte)(MACBackup[i]&(~BIT3))); - } - ODM_Write1Byte(pDM_Odm, MACReg[i], (u1Byte)(MACBackup[i]&(~BIT5))); - -} - -#if 0 -#define BW_20M 0 -#define BW_40M 1 -#define BW_80M 2 -#endif - -VOID - phy_LCCalibrate_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN BOOLEAN is2T - ) -{ - u4Byte /*RF_Amode=0, RF_Bmode=0,*/ LC_Cal = 0, tmp = 0; - u4Byte cnt; - - //Check continuous TX and Packet TX - u4Byte reg0x914 = ODM_Read4Byte(pDM_Odm, rSingleTone_ContTx_Jaguar);; - - // Backup RF reg18. - - if((reg0x914 & 0x70000) == 0) - ODM_Write1Byte(pDM_Odm, REG_TXPAUSE_8812, 0xFF); - - //3 3. Read RF reg18 - LC_Cal = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask); - - //3 4. Set LC calibration begin bit15 - ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x8000, 0x1); - - ODM_delay_ms(100); - - for (cnt = 0; cnt < 100; cnt++) { - if (ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x8000) != 0x1) - break; - ODM_delay_ms(10); - } - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("retry cnt = %d\n", cnt)); - - - //3 Restore original situation - if((reg0x914 & 70000) == 0) - ODM_Write1Byte(pDM_Odm, REG_TXPAUSE_8812, 0x00); - - // Recover channel number - ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, LC_Cal); -} - -//Analog Pre-distortion calibration -#define APK_BB_REG_NUM 8 -#define APK_CURVE_REG_NUM 4 -#define PATH_NUM 2 - -VOID - phy_APCalibrate_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN s1Byte delta, - IN BOOLEAN is2T - ) -{ -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); -#endif - u4Byte regD[PATH_NUM]; - u4Byte tmpReg, index, offset, apkbound; - u1Byte path, i, pathbound = PATH_NUM; - u4Byte BB_backup[APK_BB_REG_NUM]; - u4Byte BB_REG[APK_BB_REG_NUM] = { - rFPGA1_TxBlock, rOFDM0_TRxPathEnable, - rFPGA0_RFMOD, rOFDM0_TRMuxPar, - rFPGA0_XCD_RFInterfaceSW, rFPGA0_XAB_RFInterfaceSW, - rFPGA0_XA_RFInterfaceOE, rFPGA0_XB_RFInterfaceOE }; - u4Byte BB_AP_MODE[APK_BB_REG_NUM] = { - 0x00000020, 0x00a05430, 0x02040000, - 0x000800e4, 0x00204000 }; - u4Byte BB_normal_AP_MODE[APK_BB_REG_NUM] = { - 0x00000020, 0x00a05430, 0x02040000, - 0x000800e4, 0x22204000 }; - - u4Byte AFE_backup[IQK_ADDA_REG_NUM]; - u4Byte AFE_REG[IQK_ADDA_REG_NUM] = { - rFPGA0_XCD_SwitchControl, rBlue_Tooth, - rRx_Wait_CCA, rTx_CCK_RFON, - rTx_CCK_BBON, rTx_OFDM_RFON, - rTx_OFDM_BBON, rTx_To_Rx, - rTx_To_Tx, rRx_CCK, - rRx_OFDM, rRx_Wait_RIFS, - rRx_TO_Rx, rStandby, - rSleep, rPMPD_ANAEN }; - - u4Byte MAC_backup[IQK_MAC_REG_NUM]; - u4Byte MAC_REG[IQK_MAC_REG_NUM] = { - REG_TXPAUSE, REG_BCN_CTRL, - REG_BCN_CTRL_1, REG_GPIO_MUXCFG}; - - u4Byte APK_RF_init_value[PATH_NUM][APK_BB_REG_NUM] = { - {0x0852c, 0x1852c, 0x5852c, 0x1852c, 0x5852c}, - {0x2852e, 0x0852e, 0x3852e, 0x0852e, 0x0852e} - }; - - u4Byte APK_normal_RF_init_value[PATH_NUM][APK_BB_REG_NUM] = { - {0x0852c, 0x0a52c, 0x3a52c, 0x5a52c, 0x5a52c}, //path settings equal to path b settings - {0x0852c, 0x0a52c, 0x5a52c, 0x5a52c, 0x5a52c} - }; - - u4Byte APK_RF_value_0[PATH_NUM][APK_BB_REG_NUM] = { - {0x52019, 0x52014, 0x52013, 0x5200f, 0x5208d}, - {0x5201a, 0x52019, 0x52016, 0x52033, 0x52050} - }; - - u4Byte APK_normal_RF_value_0[PATH_NUM][APK_BB_REG_NUM] = { - {0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a}, //path settings equal to path b settings - {0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a} - }; - - u4Byte AFE_on_off[PATH_NUM] = { - 0x04db25a4, 0x0b1b25a4}; //path A on path B off / path A off path B on - - u4Byte APK_offset[PATH_NUM] = { - rConfig_AntA, rConfig_AntB}; - - u4Byte APK_normal_offset[PATH_NUM] = { - rConfig_Pmpd_AntA, rConfig_Pmpd_AntB}; - - u4Byte APK_value[PATH_NUM] = { - 0x92fc0000, 0x12fc0000}; - - u4Byte APK_normal_value[PATH_NUM] = { - 0x92680000, 0x12680000}; - - s1Byte APK_delta_mapping[APK_BB_REG_NUM][13] = { - {-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6}, - {-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6}, - {-6, -4, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6}, - {-1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6}, - {-11, -9, -7, -5, -3, -1, 0, 0, 0, 0, 0, 0, 0} - }; - - u4Byte APK_normal_setting_value_1[13] = { - 0x01017018, 0xf7ed8f84, 0x1b1a1816, 0x2522201e, 0x322e2b28, - 0x433f3a36, 0x5b544e49, 0x7b726a62, 0xa69a8f84, 0xdfcfc0b3, - 0x12680000, 0x00880000, 0x00880000 - }; - - u4Byte APK_normal_setting_value_2[16] = { - 0x01c7021d, 0x01670183, 0x01000123, 0x00bf00e2, 0x008d00a3, - 0x0068007b, 0x004d0059, 0x003a0042, 0x002b0031, 0x001f0025, - 0x0017001b, 0x00110014, 0x000c000f, 0x0009000b, 0x00070008, - 0x00050006 - }; - - u4Byte APK_result[PATH_NUM][APK_BB_REG_NUM]; //val_1_1a, val_1_2a, val_2a, val_3a, val_4a - // u4Byte AP_curve[PATH_NUM][APK_CURVE_REG_NUM]; - - s4Byte BB_offset, delta_V, delta_offset; - -#if defined(MP_DRIVER) && (MP_DRIVER == 1) - PMPT_CONTEXT pMptCtx = &(pAdapter->MptCtx); - pMptCtx->APK_bound[0] = 45; - pMptCtx->APK_bound[1] = 52; -#endif - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("==>phy_APCalibrate_8814A() delta %d\n", delta)); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("AP Calibration for %s\n", (is2T ? "2T2R" : "1T1R"))); - if (!is2T) - pathbound = 1; - - //2 FOR NORMAL CHIP SETTINGS - - // Temporarily do not allow normal driver to do the following settings because these offset - // and value will cause RF internal PA to be unpredictably disabled by HW, such that RF Tx signal - // will disappear after disable/enable card many times on 88CU. RF SD and DD have not find the - // root cause, so we remove these actions temporarily. Added by tynli and SD3 Allen. 2010.05.31. -#if !defined(MP_DRIVER) || (MP_DRIVER != 1) - return; -#endif - //settings adjust for normal chip - for(index = 0; index < PATH_NUM; index ++) - { - APK_offset[index] = APK_normal_offset[index]; - APK_value[index] = APK_normal_value[index]; - AFE_on_off[index] = 0x6fdb25a4; - } - - for(index = 0; index < APK_BB_REG_NUM; index ++) - { - for(path = 0; path < pathbound; path++) - { - APK_RF_init_value[path][index] = APK_normal_RF_init_value[path][index]; - APK_RF_value_0[path][index] = APK_normal_RF_value_0[path][index]; - } - BB_AP_MODE[index] = BB_normal_AP_MODE[index]; - } - - apkbound = 6; - - //save BB default value - for(index = 0; index < APK_BB_REG_NUM ; index++) - { - if(index == 0) //skip - continue; - BB_backup[index] = ODM_GetBBReg(pDM_Odm, BB_REG[index], bMaskDWord); - } - - //save MAC default value -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - _PHY_SaveMACRegisters_8814A(pAdapter, MAC_REG, MAC_backup); - - //save AFE default value - _PHY_SaveADDARegisters_8814A(pAdapter, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM); -#else - _PHY_SaveMACRegisters_8814A(pDM_Odm, MAC_REG, MAC_backup); - - //save AFE default value - _PHY_SaveADDARegisters_8814A(pDM_Odm, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM); -#endif - - for(path = 0; path < pathbound; path++) - { - - if(path == RF_PATH_A) - { - //path A APK - //load APK setting - //path-A - offset = rPdp_AntA; - for(index = 0; index < 11; index ++) - { - ODM_SetBBReg(pDM_Odm, offset, bMaskDWord, APK_normal_setting_value_1[index]); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x%x value 0x%x\n", offset, ODM_GetBBReg(pDM_Odm, offset, bMaskDWord))); - - offset += 0x04; - } - - ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x12680000); - - offset = rConfig_AntA; - for(; index < 13; index ++) - { - ODM_SetBBReg(pDM_Odm, offset, bMaskDWord, APK_normal_setting_value_1[index]); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x%x value 0x%x\n", offset, ODM_GetBBReg(pDM_Odm, offset, bMaskDWord))); - - offset += 0x04; - } - - //page-B1 - ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000); - - //path A - offset = rPdp_AntA; - for(index = 0; index < 16; index++) - { - ODM_SetBBReg(pDM_Odm, offset, bMaskDWord, APK_normal_setting_value_2[index]); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x%x value 0x%x\n", offset, ODM_GetBBReg(pDM_Odm, offset, bMaskDWord))); - - offset += 0x04; - } - ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000); - } - else if(path == RF_PATH_B) - { - //path B APK - //load APK setting - //path-B - offset = rPdp_AntB; - for(index = 0; index < 10; index ++) - { - ODM_SetBBReg(pDM_Odm, offset, bMaskDWord, APK_normal_setting_value_1[index]); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x%x value 0x%x\n", offset, ODM_GetBBReg(pDM_Odm, offset, bMaskDWord))); - - offset += 0x04; - } - ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntA, bMaskDWord, 0x12680000); - ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x12680000); - - offset = rConfig_AntA; - index = 11; - for(; index < 13; index ++) //offset 0xb68, 0xb6c - { - ODM_SetBBReg(pDM_Odm, offset, bMaskDWord, APK_normal_setting_value_1[index]); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x%x value 0x%x\n", offset, ODM_GetBBReg(pDM_Odm, offset, bMaskDWord))); - - offset += 0x04; - } - - //page-B1 - ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000); - - //path B - offset = 0xb60; - for(index = 0; index < 16; index++) - { - ODM_SetBBReg(pDM_Odm, offset, bMaskDWord, APK_normal_setting_value_2[index]); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x%x value 0x%x\n", offset, ODM_GetBBReg(pDM_Odm, offset, bMaskDWord))); - - offset += 0x04; - } - ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0); - } - - //save RF default value -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - regD[path] = PHY_QueryRFReg(pAdapter, path, RF_TXBIAS_A, bMaskDWord); -#else - regD[path] = ODM_GetRFReg(pDM_Odm, path, RF_TXBIAS_A, bMaskDWord); -#endif - - //Path A AFE all on, path B AFE All off or vise versa - for(index = 0; index < IQK_ADDA_REG_NUM ; index++) - ODM_SetBBReg(pDM_Odm, AFE_REG[index], bMaskDWord, AFE_on_off[path]); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0xe70 %x\n", ODM_GetBBReg(pDM_Odm, rRx_Wait_CCA, bMaskDWord))); - - //BB to AP mode - if(path == 0) - { - for(index = 0; index < APK_BB_REG_NUM ; index++) - { - - if(index == 0) //skip - continue; - else if (index < 5) - ODM_SetBBReg(pDM_Odm, BB_REG[index], bMaskDWord, BB_AP_MODE[index]); - else if (BB_REG[index] == 0x870) - ODM_SetBBReg(pDM_Odm, BB_REG[index], bMaskDWord, BB_backup[index]|BIT10|BIT26); - else - ODM_SetBBReg(pDM_Odm, BB_REG[index], BIT10, 0x0); - } - - ODM_SetBBReg(pDM_Odm, rTx_IQK_Tone_A, bMaskDWord, 0x01008c00); - ODM_SetBBReg(pDM_Odm, rRx_IQK_Tone_A, bMaskDWord, 0x01008c00); - } - else //path B - { - ODM_SetBBReg(pDM_Odm, rTx_IQK_Tone_B, bMaskDWord, 0x01008c00); - ODM_SetBBReg(pDM_Odm, rRx_IQK_Tone_B, bMaskDWord, 0x01008c00); - - } - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x800 %x\n", ODM_GetBBReg(pDM_Odm, 0x800, bMaskDWord))); - - //MAC settings -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - _PHY_MACSettingCalibration_8814A(pAdapter, MAC_REG, MAC_backup); -#else - _PHY_MACSettingCalibration_8814A(pDM_Odm, MAC_REG, MAC_backup); -#endif - - if(path == RF_PATH_A) //Path B to standby mode - { - ODM_SetRFReg(pDM_Odm, RF_PATH_B, RF_AC, bMaskDWord, 0x10000); - } - else //Path A to standby mode - { - ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_AC, bMaskDWord, 0x10000); - ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_MODE1, bMaskDWord, 0x1000f); - ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_MODE2, bMaskDWord, 0x20103); - } - - delta_offset = ((delta+14)/2); - if(delta_offset < 0) - delta_offset = 0; - else if (delta_offset > 12) - delta_offset = 12; - - //AP calibration - for(index = 0; index < APK_BB_REG_NUM; index++) - { - if(index != 1) //only DO PA11+PAD01001, AP RF setting - continue; - - tmpReg = APK_RF_init_value[path][index]; -#if 1 - if(!pDM_Odm->RFCalibrateInfo.bAPKThermalMeterIgnore) - { - BB_offset = (tmpReg & 0xF0000) >> 16; - - if(!(tmpReg & BIT15)) //sign bit 0 - { - BB_offset = -BB_offset; - } - - delta_V = APK_delta_mapping[index][delta_offset]; - - BB_offset += delta_V; - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() APK index %d tmpReg 0x%x delta_V %d delta_offset %d\n", index, tmpReg, (int)delta_V, (int)delta_offset)); - - if(BB_offset < 0) - { - tmpReg = tmpReg & (~BIT15); - BB_offset = -BB_offset; - } - else - { - tmpReg = tmpReg | BIT15; - } - tmpReg = (tmpReg & 0xFFF0FFFF) | (BB_offset << 16); - } -#endif - - ODM_SetRFReg(pDM_Odm, path, RF_IPA_A, bMaskDWord, 0x8992e); -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0xc %x\n", PHY_QueryRFReg(pAdapter, path, RF_IPA_A, bMaskDWord))); - ODM_SetRFReg(pDM_Odm, path, RF_AC, bMaskDWord, APK_RF_value_0[path][index]); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x0 %x\n", PHY_QueryRFReg(pAdapter, path, RF_AC, bMaskDWord))); - ODM_SetRFReg(pDM_Odm, path, RF_TXBIAS_A, bMaskDWord, tmpReg); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0xd %x\n", PHY_QueryRFReg(pAdapter, path, RF_TXBIAS_A, bMaskDWord))); -#else - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0xc %x\n", ODM_GetRFReg(pDM_Odm, path, RF_IPA_A, bMaskDWord))); - ODM_SetRFReg(pDM_Odm, path, RF_AC, bMaskDWord, APK_RF_value_0[path][index]); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x0 %x\n", ODM_GetRFReg(pDM_Odm, path, RF_AC, bMaskDWord))); - ODM_SetRFReg(pDM_Odm, path, RF_TXBIAS_A, bMaskDWord, tmpReg); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0xd %x\n", ODM_GetRFReg(pDM_Odm, path, RF_TXBIAS_A, bMaskDWord))); -#endif - - // PA11+PAD01111, one shot - i = 0; - do - { - ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80000000); - { - ODM_SetBBReg(pDM_Odm, APK_offset[path], bMaskDWord, APK_value[0]); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x%x value 0x%x\n", APK_offset[path], ODM_GetBBReg(pDM_Odm, APK_offset[path], bMaskDWord))); - ODM_delay_ms(3); - ODM_SetBBReg(pDM_Odm, APK_offset[path], bMaskDWord, APK_value[1]); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x%x value 0x%x\n", APK_offset[path], ODM_GetBBReg(pDM_Odm, APK_offset[path], bMaskDWord))); - - ODM_delay_ms(20); - } - ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000); - - if(path == RF_PATH_A) - tmpReg = ODM_GetBBReg(pDM_Odm, rAPK, 0x03E00000); - else - tmpReg = ODM_GetBBReg(pDM_Odm, rAPK, 0xF8000000); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0xbd8[25:21] %x\n", tmpReg)); - - - i++; - } - while(tmpReg > apkbound && i < 4); - - APK_result[path][index] = tmpReg; - } - } - - //reload MAC default value -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - _PHY_ReloadMACRegisters_8814A(pAdapter, MAC_REG, MAC_backup); -#else - _PHY_ReloadMACRegisters_8814A(pDM_Odm, MAC_REG, MAC_backup); -#endif - - //reload BB default value - for(index = 0; index < APK_BB_REG_NUM ; index++) - { - - if(index == 0) //skip - continue; - ODM_SetBBReg(pDM_Odm, BB_REG[index], bMaskDWord, BB_backup[index]); - } - - //reload AFE default value -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - _PHY_ReloadADDARegisters_8814A(pAdapter, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM); -#else - _PHY_ReloadADDARegisters_8814A(pDM_Odm, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM); -#endif - - //reload RF path default value - for(path = 0; path < pathbound; path++) - { - ODM_SetRFReg(pDM_Odm, path, 0xd, bMaskDWord, regD[path]); - if(path == RF_PATH_B) - { - ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_MODE1, bMaskDWord, 0x1000f); - ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_MODE2, bMaskDWord, 0x20101); - } - - //note no index == 0 - if (APK_result[path][1] > 6) - APK_result[path][1] = 6; - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("apk path %d result %d 0x%x \t", path, 1, APK_result[path][1])); - } - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("\n")); - - - for(path = 0; path < pathbound; path++) - { - ODM_SetRFReg(pDM_Odm, path, 0x3, bMaskDWord, - ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (APK_result[path][1] << 5) | APK_result[path][1])); - if(path == RF_PATH_A) - ODM_SetRFReg(pDM_Odm, path, 0x4, bMaskDWord, - ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (0x00 << 5) | 0x05)); - else - ODM_SetRFReg(pDM_Odm, path, 0x4, bMaskDWord, - ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (0x02 << 5) | 0x05)); -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - ODM_SetRFReg(pDM_Odm, path, RF_BS_PA_APSET_G9_G11, bMaskDWord, - ((0x08 << 15) | (0x08 << 10) | (0x08 << 5) | 0x08)); -#endif - } - - pDM_Odm->RFCalibrateInfo.bAPKdone = TRUE; - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("<==phy_APCalibrate_8814A()\n")); -} - -VOID -PHY_LCCalibrate_8814A( - IN PDM_ODM_T pDM_Odm - ) -{ - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("===> PHY_LCCalibrate_8814A\n")); - phy_LCCalibrate_8814A(pDM_Odm, TRUE); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("<=== PHY_LCCalibrate_8814A\n")); -} - -VOID - PHY_APCalibrate_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN s1Byte delta - ) -{ -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); -#endif -#ifdef DISABLE_BB_RF - return; -#endif - - return; -#if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_AP)) - if(!(pDM_Odm->SupportAbility & ODM_RF_CALIBRATION)) - { - return; - } -#endif - -#if defined(FOR_BRAZIL_PRETEST) && (FOR_BRAZIL_PRETEST != 1) - if(pDM_Odm->RFCalibrateInfo.bAPKdone) -#endif - return; - -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - if(IS_92C_SERIAL( pHalData->VersionID)){ - phy_APCalibrate_8814A(pAdapter, delta, TRUE); - } - else -#endif - { - // For 88C 1T1R -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - phy_APCalibrate_8814A(pAdapter, delta, FALSE); -#else - phy_APCalibrate_8814A(pDM_Odm, delta, FALSE); -#endif - } -} - VOID phy_SetRFPathSwitch_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN BOOLEAN bMain, - IN BOOLEAN is2T - ) -{ -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - { - u1Byte u1bTmp; - u1bTmp = ODM_Read1Byte(pDM_Odm, REG_LEDCFG2) | BIT7; - ODM_Write1Byte(pDM_Odm, REG_LEDCFG2, u1bTmp); - //ODM_SetBBReg(pDM_Odm, REG_LEDCFG0, BIT23, 0x01); - ODM_SetBBReg(pDM_Odm, rFPGA0_XAB_RFParameter, BIT13, 0x01); - } - -#endif - - if(is2T) //92C - { - if(bMain) - ODM_SetBBReg(pDM_Odm, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6, 0x1); //92C_Path_A - else - ODM_SetBBReg(pDM_Odm, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6, 0x2); //BT - } - else //88C - { - - if(bMain) - ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, BIT8|BIT9, 0x2); //Main - else - ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, BIT8|BIT9, 0x1); //Aux - } -} - VOID PHY_SetRFPathSwitch_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN BOOLEAN bMain - ) -{ - //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - -#ifdef DISABLE_BB_RF - return; -#endif - -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - if (IS_92C_SERIAL(pHalData->VersionID)) - { - phy_SetRFPathSwitch_8814A(pAdapter, bMain, TRUE); - } - else -#endif - { - // For 88C 1T1R -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - phy_SetRFPathSwitch_8814A(pAdapter, bMain, FALSE); -#else - phy_SetRFPathSwitch_8814A(pDM_Odm, bMain, FALSE); -#endif - } -} - - -#define DP_BB_REG_NUM 7 -#define DP_RF_REG_NUM 1 -#define DP_RETRY_LIMIT 10 -#define DP_PATH_NUM 2 -#define DP_DPK_NUM 3 -#define DP_DPK_VALUE_NUM 2 - - -VOID - phy_DigitalPredistortion_8814A_8814A( -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PADAPTER pAdapter -#else - IN PDM_ODM_T pDM_Odm -#endif - ) -{ -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); -#endif -#if DISABLE_BB_RF - return; -#endif - - return; - - if(pDM_Odm->RFCalibrateInfo.bDPdone) - return; -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - - if(IS_92C_SERIAL( pHalData->VersionID)){ - phy_DigitalPredistortion_8814A(pAdapter, TRUE); - } - else -#endif - { - // For 88C 1T1R - phy_DigitalPredistortion_8814A(pAdapter, FALSE); - } -} - -//return value TRUE => Main; FALSE => Aux - - BOOLEAN phy_QueryRFPathSwitch_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN BOOLEAN is2T - ) -{ -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); -#endif - if(!pAdapter->bHWInitReady) - { - u1Byte u1bTmp; - u1bTmp = ODM_Read1Byte(pDM_Odm, REG_LEDCFG2) | BIT7; - ODM_Write1Byte(pDM_Odm, REG_LEDCFG2, u1bTmp); - //ODM_SetBBReg(pDM_Odm, REG_LEDCFG0, BIT23, 0x01); - ODM_SetBBReg(pDM_Odm, rFPGA0_XAB_RFParameter, BIT13, 0x01); - } - - if(is2T) // - { - if(ODM_GetBBReg(pDM_Odm, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6) == 0x01) - return TRUE; - else - return FALSE; - } - else - { - if((ODM_GetBBReg(pDM_Odm, rFPGA0_XB_RFInterfaceOE, BIT5|BIT4|BIT3) == 0x0) || - (ODM_GetBBReg(pDM_Odm, rConfig_ram64x16, BIT31) == 0x0)) - return TRUE; - else - return FALSE; - } -} - -//return value TRUE => Main; FALSE => Aux - BOOLEAN PHY_QueryRFPathSwitch_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm -#else - IN PADAPTER pAdapter -#endif - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - -#if DISABLE_BB_RF - return TRUE; -#endif -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - - //if(IS_92C_SERIAL( pHalData->VersionID)){ - if(IS_2T2R( pHalData->VersionID)){ - return phy_QueryRFPathSwitch_8814A(pAdapter, TRUE); - } - else -#endif - { - // For 88C 1T1R -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - return phy_QueryRFPathSwitch_8814A(pAdapter, FALSE); -#else - return phy_QueryRFPathSwitch_8814A(pDM_Odm, FALSE); -#endif - } -} -#endif - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ap.h b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ap.h deleted file mode 100644 index 46eaa801e149de..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ap.h +++ /dev/null @@ -1,164 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -#ifndef __HAL_PHY_RF_8814A_H__ -#define __HAL_PHY_RF_8814A_H__ - -/*--------------------------Define Parameters-------------------------------*/ -#define IQK_DELAY_TIME_8814A 10 //ms -#define index_mapping_NUM_8814A 15 -#define AVG_THERMAL_NUM_8814A 4 -#define RF_T_METER_8814A 0x42 -#define MAX_PATH_NUM_8814A 4 - -#include "../halphyrf_ap.h" - - -void ConfigureTxpowerTrack_8814A( - PTXPWRTRACK_CFG pConfig - ); - -VOID -GetDeltaSwingTable_8814A( - IN PDM_ODM_T pDM_Odm, - OUT pu1Byte *TemperatureUP_A, - OUT pu1Byte *TemperatureDOWN_A, - OUT pu1Byte *TemperatureUP_B, - OUT pu1Byte *TemperatureDOWN_B - ); - -VOID -GetDeltaSwingTable_8814A_PathCD( - IN PDM_ODM_T pDM_Odm, - OUT pu1Byte *TemperatureUP_C, - OUT pu1Byte *TemperatureDOWN_C, - OUT pu1Byte *TemperatureUP_D, - OUT pu1Byte *TemperatureDOWN_D - ); - -VOID -ConfigureTxpowerTrack_8814A( - IN PTXPWRTRACK_CFG pConfig - ); - - -VOID -ODM_TxPwrTrackSetPwr8814A( - IN PDM_ODM_T pDM_Odm, - IN PWRTRACK_METHOD Method, - IN u1Byte RFPath, - IN u1Byte ChannelMappedIndex - ); - - -u1Byte -CheckRFGainOffset( - PDM_ODM_T pDM_Odm, - PWRTRACK_METHOD Method, - u1Byte RFPath - ); - - -// -// LC calibrate -// -void -PHY_LCCalibrate_8814A( - IN PDM_ODM_T pDM_Odm -); - -void -phy_LCCalibrate_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN BOOLEAN is2T -); - - -// -// AP calibrate -// -void -PHY_APCalibrate_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN s1Byte delta); -void -PHY_DigitalPredistortion_8814A( IN PADAPTER pAdapter); - - -#if 0 //FOR_8814_IQK -VOID -_PHY_SaveADDARegisters( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN pu4Byte ADDAReg, - IN pu4Byte ADDABackup, - IN u4Byte RegisterNum - ); - -VOID -_PHY_PathADDAOn( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN pu4Byte ADDAReg, - IN BOOLEAN isPathAOn, - IN BOOLEAN is2T - ); - -VOID -_PHY_MACSettingCalibration( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN pu4Byte MACReg, - IN pu4Byte MACBackup - ); - - - -VOID -_PHY_PathAStandBy( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm -#else - IN PADAPTER pAdapter -#endif - ); - -#endif - - -#endif // #ifndef __HAL_PHY_RF_8814A_H__ - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.c b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.c deleted file mode 100644 index 09c65ed3ff6bbd..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.c +++ /dev/null @@ -1,564 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -#include "mp_precomp.h" -#include "../../phydm_precomp.h" - - - -/*---------------------------Define Local Constant---------------------------*/ -// 2010/04/25 MH Define the max tx power tracking tx agc power. -#define ODM_TXPWRTRACK_MAX_IDX_8814A 6 - -/*---------------------------Define Local Constant---------------------------*/ - -//3============================================================ -//3 Tx Power Tracking -//3============================================================ - - -// Add CheckRFGainOffset By YuChen to make sure that RF gain offset will not over upperbound 4'b1010 - -u8 -CheckRFGainOffset( - struct dm_struct *pDM_Odm, - enum pwrtrack_method Method, - u8 RFPath - ) -{ - s1Byte UpperBound = 10, LowerBound = -5; // 4'b1010 = 10 - s1Byte Final_RF_Index = 0; - BOOLEAN bPositive = FALSE; - u32 bitMask = 0; - u8 Final_OFDM_Swing_Index = 0, TxScalingUpperBound = 28, TxScalingLowerBound = 4;// upper bound +2dB, lower bound -10dB - struct dm_rf_calibration_struct * prf_calibrate_info = &(pDM_Odm->rf_calibrate_info); - if(Method == MIX_MODE) //normal Tx power tracking - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("is 8814 MP chip\n")); - bitMask = BIT19; - prf_calibrate_info->absolute_ofdm_swing_idx[RFPath] = prf_calibrate_info->absolute_ofdm_swing_idx[RFPath] + prf_calibrate_info->kfree_offset[RFPath]; - - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("=========================== [Path-%d] TXBB Offset============================\n", RFPath)); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("absolute_ofdm_swing_idx[RFPath](%d) = absolute_ofdm_swing_idx[RFPath](%d) + kfree_offset[RFPath](%d), RFPath=%d\n", prf_calibrate_info->absolute_ofdm_swing_idx[RFPath], prf_calibrate_info->absolute_ofdm_swing_idx[RFPath], prf_calibrate_info->kfree_offset[RFPath], RFPath)); - - if (prf_calibrate_info->absolute_ofdm_swing_idx[RFPath] >= 0) /* check if RF_Index is positive or not*/ - bPositive = TRUE; - else - bPositive = FALSE; - - odm_set_rf_reg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, bPositive); - - bitMask = BIT18|BIT17|BIT16|BIT15; - Final_RF_Index = prf_calibrate_info->absolute_ofdm_swing_idx[RFPath] / 2; /*TxBB 1 step equal 1dB, BB swing 1step equal 0.5dB*/ - - } - - if(Final_RF_Index > UpperBound) //Upper bound = 10dB, if more htan upper bound, then move to bb swing max = +2dB - { - odm_set_rf_reg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, UpperBound); //set RF Reg0x55 per path - - Final_OFDM_Swing_Index = prf_calibrate_info->default_ofdm_index + (prf_calibrate_info->absolute_ofdm_swing_idx[RFPath] - (UpperBound << 1)); - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("Final_OFDM_Swing_Index(%d) = default_ofdm_index(%d) + (absolute_ofdm_swing_idx[RFPath](%d) - (UpperBound(%d) << 1)), RFPath=%d\n", Final_OFDM_Swing_Index, prf_calibrate_info->default_ofdm_index, prf_calibrate_info->absolute_ofdm_swing_idx[RFPath], UpperBound, RFPath)); - - if (Final_OFDM_Swing_Index > TxScalingUpperBound) { /* bb swing upper bound = +2dB */ - Final_OFDM_Swing_Index = TxScalingUpperBound; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("Final_OFDM_Swing_Index(%d) > TxScalingUpperBound(%d) Final_OFDM_Swing_Index = TxScalingUpperBound\n", Final_OFDM_Swing_Index, TxScalingUpperBound)); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("===========================================================================\n")); - } - - return Final_OFDM_Swing_Index; - } - else if(Final_RF_Index < LowerBound) // lower bound = -5dB - { - odm_set_rf_reg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, (-1)*(LowerBound)); //set RF Reg0x55 per path - - Final_OFDM_Swing_Index = prf_calibrate_info->default_ofdm_index - ((LowerBound<<1) - prf_calibrate_info->absolute_ofdm_swing_idx[RFPath]); - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("Final_OFDM_Swing_Index(%d) = default_ofdm_index(%d) - ((LowerBound(%d)<<1) - absolute_ofdm_swing_idx[RFPath](%d)), RFPath=%d\n", Final_OFDM_Swing_Index, prf_calibrate_info->default_ofdm_index, LowerBound, prf_calibrate_info->absolute_ofdm_swing_idx[RFPath], RFPath)); - - if (Final_OFDM_Swing_Index < TxScalingLowerBound) { /* BB swing lower bound = -10dB */ - Final_OFDM_Swing_Index = TxScalingLowerBound; - ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("Final_OFDM_Swing_Index(%d) > TxScalingLowerBound(%d) Final_OFDM_Swing_Index = TxScalingLowerBound\n", Final_OFDM_Swing_Index, TxScalingLowerBound)); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("===========================================================================\n")); - } - return Final_OFDM_Swing_Index; - } - else // normal case - { - - if(bPositive == TRUE) - odm_set_rf_reg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, Final_RF_Index); //set RF Reg0x55 per path - else - odm_set_rf_reg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, (-1)*Final_RF_Index); //set RF Reg0x55 per path - - Final_OFDM_Swing_Index = prf_calibrate_info->default_ofdm_index + (prf_calibrate_info->absolute_ofdm_swing_idx[RFPath])%2; - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("Final_OFDM_Swing_Index(%d) = default_ofdm_index(%d) + (absolute_ofdm_swing_idx[RFPath])//2(%d), RFPath=%d\n", Final_OFDM_Swing_Index, prf_calibrate_info->default_ofdm_index, (prf_calibrate_info->absolute_ofdm_swing_idx[RFPath])%2, RFPath)); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("===========================================================================\n")); - - return Final_OFDM_Swing_Index; - } - - return FALSE; -} - - -VOID -ODM_TxPwrTrackSetPwr8814A( - IN PVOID pDM_VOID, - enum pwrtrack_method Method, - u8 RFPath, - u8 ChannelMappedIndex - ) -{ - struct dm_struct * pDM_Odm = (struct dm_struct *)pDM_VOID; - PADAPTER Adapter = pDM_Odm->adapter; - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - struct dm_rf_calibration_struct * prf_calibrate_info = &(pDM_Odm->rf_calibrate_info); - u8 Final_OFDM_Swing_Index = 0; - - if (Method == MIX_MODE) - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("prf_calibrate_info->default_ofdm_index=%d, prf_calibrate_info->absolute_ofdm_swing_idx[RFPath]=%d, RF_Path = %d\n", - prf_calibrate_info->default_ofdm_index, prf_calibrate_info->absolute_ofdm_swing_idx[RFPath], RFPath)); - - Final_OFDM_Swing_Index = CheckRFGainOffset(pDM_Odm, MIX_MODE, RFPath); - } - else if(Method == TSSI_MODE) - { - odm_set_rf_reg(pDM_Odm, RFPath, rRF_TxGainOffset, BIT18|BIT17|BIT16|BIT15, 0); - } - else if(Method == BBSWING) // use for mp driver clean power tracking status - { - prf_calibrate_info->absolute_ofdm_swing_idx[RFPath] = prf_calibrate_info->absolute_ofdm_swing_idx[RFPath] + prf_calibrate_info->kfree_offset[RFPath]; - - Final_OFDM_Swing_Index = prf_calibrate_info->default_ofdm_index + (prf_calibrate_info->absolute_ofdm_swing_idx[RFPath]); - - odm_set_rf_reg(pDM_Odm, RFPath, rRF_TxGainOffset, BIT18|BIT17|BIT16|BIT15, 0); - } - - if((Method == MIX_MODE) || (Method == BBSWING)) - { - ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("=========================== [Path-%d] BBSWING Offset============================\n", RFPath)); - - switch(RFPath) - { - case RF_PATH_A: - - odm_set_bb_reg(pDM_Odm, rA_TxScale_Jaguar, 0xFFE00000, tx_scaling_table_jaguar[Final_OFDM_Swing_Index]); //set BBswing - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("******Path_A Compensate with BBSwing , Final_OFDM_Swing_Index = %d \n", Final_OFDM_Swing_Index)); - break; - - case RF_PATH_B: - - odm_set_bb_reg(pDM_Odm, rB_TxScale_Jaguar, 0xFFE00000, tx_scaling_table_jaguar[Final_OFDM_Swing_Index]); //set BBswing - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("******Path_B Compensate with BBSwing , Final_OFDM_Swing_Index = %d \n", Final_OFDM_Swing_Index)); - break; - - case RF_PATH_C: - - odm_set_bb_reg(pDM_Odm, rC_TxScale_Jaguar2, 0xFFE00000, tx_scaling_table_jaguar[Final_OFDM_Swing_Index]); //set BBswing - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("******Path_C Compensate with BBSwing , Final_OFDM_Swing_Index = %d \n", Final_OFDM_Swing_Index)); - break; - - case RF_PATH_D: - - odm_set_bb_reg(pDM_Odm, rD_TxScale_Jaguar2, 0xFFE00000, tx_scaling_table_jaguar[Final_OFDM_Swing_Index]); //set BBswing - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("******Path_D Compensate with BBSwing , Final_OFDM_Swing_Index = %d \n", Final_OFDM_Swing_Index)); - break; - - default: - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("Wrong Path name!!!! \n")); - - break; - } - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("===========================================================================\n")); - } - return; -} // ODM_TxPwrTrackSetPwr8814A - - -VOID -GetDeltaSwingTable_8814A( - IN PVOID pDM_VOID, - u8* *TemperatureUP_A, - u8* *TemperatureDOWN_A, - u8* *TemperatureUP_B, - u8* *TemperatureDOWN_B - ) -{ - struct dm_struct * pDM_Odm = (struct dm_struct *)pDM_VOID; - PADAPTER Adapter = pDM_Odm->adapter; - struct dm_rf_calibration_struct * prf_calibrate_info = &(pDM_Odm->rf_calibrate_info); - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 TxRate = 0xFF; - u8 channel = pHalData->current_channel; - - - if (*(pDM_Odm->mp_mode) == TRUE) { - #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE)) - #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) - #if (MP_DRIVER == 1) - PMPT_CONTEXT pMptCtx = &(Adapter->mpt_ctx); - - TxRate = mpt_to_mgnt_rate(pMptCtx->mpt_rate_index); - #endif - #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) - PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.mpt_ctx); - - TxRate = mpt_to_mgnt_rate(pMptCtx->mpt_rate_index); - #endif - #endif - } else { - u2Byte rate = *(pDM_Odm->forced_data_rate); - - if (!rate) { /*auto rate*/ - if (pDM_Odm->tx_rate != 0xFF) { - #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) - TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->tx_rate); - #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) - TxRate = hw_rate_to_m_rate(pDM_Odm->tx_rate); - #endif - } - } else { /*force rate*/ - TxRate = (u8)rate; - } - } - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("Power Tracking TxRate=0x%X\n", TxRate)); - - if (1 <= channel && channel <= 14) { - if (IS_CCK_RATE(TxRate)) { - *TemperatureUP_A = prf_calibrate_info->delta_swing_table_idx_2g_cck_a_p; - *TemperatureDOWN_A = prf_calibrate_info->delta_swing_table_idx_2g_cck_a_n; - *TemperatureUP_B = prf_calibrate_info->delta_swing_table_idx_2g_cck_b_p; - *TemperatureDOWN_B = prf_calibrate_info->delta_swing_table_idx_2g_cck_b_n; - } else { - *TemperatureUP_A = prf_calibrate_info->delta_swing_table_idx_2ga_p; - *TemperatureDOWN_A = prf_calibrate_info->delta_swing_table_idx_2ga_n; - *TemperatureUP_B = prf_calibrate_info->delta_swing_table_idx_2gb_p; - *TemperatureDOWN_B = prf_calibrate_info->delta_swing_table_idx_2gb_n; - } - } else if (36 <= channel && channel <= 64) { - *TemperatureUP_A = prf_calibrate_info->delta_swing_table_idx_5ga_p[0]; - *TemperatureDOWN_A = prf_calibrate_info->delta_swing_table_idx_5ga_n[0]; - *TemperatureUP_B = prf_calibrate_info->delta_swing_table_idx_5gb_p[0]; - *TemperatureDOWN_B = prf_calibrate_info->delta_swing_table_idx_5gb_n[0]; - } else if (100 <= channel && channel <= 144) { - *TemperatureUP_A = prf_calibrate_info->delta_swing_table_idx_5ga_p[1]; - *TemperatureDOWN_A = prf_calibrate_info->delta_swing_table_idx_5ga_n[1]; - *TemperatureUP_B = prf_calibrate_info->delta_swing_table_idx_5gb_p[1]; - *TemperatureDOWN_B = prf_calibrate_info->delta_swing_table_idx_5gb_n[1]; - } else if (149 <= channel && channel <= 173) { - *TemperatureUP_A = prf_calibrate_info->delta_swing_table_idx_5ga_p[2]; - *TemperatureDOWN_A = prf_calibrate_info->delta_swing_table_idx_5ga_n[2]; - *TemperatureUP_B = prf_calibrate_info->delta_swing_table_idx_5gb_p[2]; - *TemperatureDOWN_B = prf_calibrate_info->delta_swing_table_idx_5gb_n[2]; - } else { - *TemperatureUP_A = (u8*)delta_swing_table_idx_2ga_p_8188e; - *TemperatureDOWN_A = (u8*)delta_swing_table_idx_2ga_n_8188e; - *TemperatureUP_B = (u8*)delta_swing_table_idx_2ga_p_8188e; - *TemperatureDOWN_B = (u8*)delta_swing_table_idx_2ga_n_8188e; - } - - - - return; -} - - -VOID -GetDeltaSwingTable_8814A_PathCD( - IN PVOID pDM_VOID, - u8* *TemperatureUP_C, - u8* *TemperatureDOWN_C, - u8* *TemperatureUP_D, - u8* *TemperatureDOWN_D - ) -{ - struct dm_struct * pDM_Odm = (struct dm_struct *)pDM_VOID; - PADAPTER Adapter = pDM_Odm->adapter; - struct dm_rf_calibration_struct * prf_calibrate_info = &(pDM_Odm->rf_calibrate_info); - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 TxRate = 0xFF; - u8 channel = pHalData->current_channel; - - - if (*(pDM_Odm->mp_mode) == TRUE) { - #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE)) - #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) - #if (MP_DRIVER == 1) - PMPT_CONTEXT pMptCtx = &(Adapter->mpt_ctx); - - TxRate = mpt_to_mgnt_rate(pMptCtx->mpt_rate_index); - #endif - #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) - PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.mpt_ctx); - - TxRate = mpt_to_mgnt_rate(pMptCtx->mpt_rate_index); - #endif - #endif - } else { - u2Byte rate = *(pDM_Odm->forced_data_rate); - - if (!rate) { /*auto rate*/ - if (pDM_Odm->tx_rate != 0xFF) { - #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) - TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->tx_rate); - #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) - TxRate = hw_rate_to_m_rate(pDM_Odm->tx_rate); - #endif - } - } else { /*force rate*/ - TxRate = (u8)rate; - } - } - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("Power Tracking TxRate=0x%X\n", TxRate)); - - if ( 1 <= channel && channel <= 14) { - if (IS_CCK_RATE(TxRate)) { - *TemperatureUP_C = prf_calibrate_info->delta_swing_table_idx_2g_cck_c_p; - *TemperatureDOWN_C = prf_calibrate_info->delta_swing_table_idx_2g_cck_c_n; - *TemperatureUP_D = prf_calibrate_info->delta_swing_table_idx_2g_cck_d_p; - *TemperatureDOWN_D = prf_calibrate_info->delta_swing_table_idx_2g_cck_d_n; - } else { - *TemperatureUP_C = prf_calibrate_info->delta_swing_table_idx_2gc_p; - *TemperatureDOWN_C = prf_calibrate_info->delta_swing_table_idx_2gc_n; - *TemperatureUP_D = prf_calibrate_info->delta_swing_table_idx_2gd_p; - *TemperatureDOWN_D = prf_calibrate_info->delta_swing_table_idx_2gd_n; - } - } else if (36 <= channel && channel <= 64) { - *TemperatureUP_C = prf_calibrate_info->delta_swing_table_idx_5gc_p[0]; - *TemperatureDOWN_C = prf_calibrate_info->delta_swing_table_idx_5gc_n[0]; - *TemperatureUP_D = prf_calibrate_info->delta_swing_table_idx_5gd_p[0]; - *TemperatureDOWN_D = prf_calibrate_info->delta_swing_table_idx_5gd_n[0]; - } else if (100 <= channel && channel <= 144) { - *TemperatureUP_C = prf_calibrate_info->delta_swing_table_idx_5gc_p[1]; - *TemperatureDOWN_C = prf_calibrate_info->delta_swing_table_idx_5gc_n[1]; - *TemperatureUP_D = prf_calibrate_info->delta_swing_table_idx_5gd_p[1]; - *TemperatureDOWN_D = prf_calibrate_info->delta_swing_table_idx_5gd_n[1]; - } else if (149 <= channel && channel <= 173) { - *TemperatureUP_C = prf_calibrate_info->delta_swing_table_idx_5gc_p[2]; - *TemperatureDOWN_C = prf_calibrate_info->delta_swing_table_idx_5gc_n[2]; - *TemperatureUP_D = prf_calibrate_info->delta_swing_table_idx_5gd_p[2]; - *TemperatureDOWN_D = prf_calibrate_info->delta_swing_table_idx_5gd_n[2]; - } else { - *TemperatureUP_C = (u8*)delta_swing_table_idx_2ga_p_8188e; - *TemperatureDOWN_C = (u8*)delta_swing_table_idx_2ga_n_8188e; - *TemperatureUP_D = (u8*)delta_swing_table_idx_2ga_p_8188e; - *TemperatureDOWN_D = (u8*)delta_swing_table_idx_2ga_n_8188e; - } - - return; -} - -void configure_txpower_track_8814a( - struct txpwrtrack_cfg *pConfig - ) -{ - pConfig->swing_table_size_cck = CCK_TABLE_SIZE; - pConfig->swing_table_size_ofdm = OFDM_TABLE_SIZE; - pConfig->threshold_iqk = 8; - pConfig->average_thermal_num = AVG_THERMAL_NUM_8814A; - pConfig->rf_path_count = MAX_PATH_NUM_8814A; - pConfig->thermal_reg_addr = RF_T_METER_88E; - - pConfig->odm_tx_pwr_track_set_pwr = ODM_TxPwrTrackSetPwr8814A; - pConfig->do_iqk = DoIQK_8814A; - pConfig->phy_lc_calibrate = phy_lc_calibrate_8814a; - pConfig->get_delta_swing_table = GetDeltaSwingTable_8814A; - pConfig->get_delta_swing_table8814only = GetDeltaSwingTable_8814A_PathCD; -} - -VOID -_phy_lc_calibrate_8814a( - IN struct dm_struct * pDM_Odm, - IN BOOLEAN is2T - ) -{ - u32 /*RF_Amode=0, RF_Bmode=0,*/ LC_Cal = 0, tmp = 0, cnt; - - //Check continuous TX and Packet TX - u32 reg0x914 = odm_read_4byte(pDM_Odm, rSingleTone_ContTx_Jaguar);; - - // Backup RF reg18. - - if((reg0x914 & 0x70000) == 0) - odm_write_1byte(pDM_Odm, REG_TXPAUSE, 0xFF); - - //3 3. Read RF reg18 - LC_Cal = odm_get_rf_reg(pDM_Odm, RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask); - - //3 4. Set LC calibration begin bit15 - odm_set_rf_reg(pDM_Odm, RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, 0x1b126); - - ODM_delay_ms(100); - - for (cnt = 0; cnt < 100; cnt++) { - if (odm_get_rf_reg(pDM_Odm, RF_PATH_A, RF_CHNLBW, 0x8000) != 0x1) - break; - ODM_delay_ms(10); - } - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("retry cnt = %d\n", cnt)); - - odm_set_rf_reg( pDM_Odm, RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, 0x13126); - odm_set_rf_reg( pDM_Odm, RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, 0x13124); - //3 Restore original situation - if((reg0x914 & 70000) == 0) - odm_write_1byte(pDM_Odm, REG_TXPAUSE, 0x00); - - // Recover channel number - odm_set_rf_reg(pDM_Odm, RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, LC_Cal); - - //DbgPrint("Call %s\n", __FUNCTION__); -} - - -VOID -phy_APCalibrate_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN struct dm_struct * pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN s1Byte delta, - IN BOOLEAN is2T - ) -{ -} - - -VOID -phy_lc_calibrate_8814a( - IN PVOID pDM_VOID - ) -{ - BOOLEAN bStartContTx = FALSE, bSingleTone = FALSE, bCarrierSuppression = FALSE; - struct dm_struct * pDM_Odm = (struct dm_struct *)pDM_VOID; -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - PADAPTER pAdapter = pDM_Odm->adapter; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - -#if (MP_DRIVER == 1) -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - PMPT_CONTEXT pMptCtx = &(pAdapter->mpt_ctx); - bStartContTx = pMptCtx->bStartContTx; - bSingleTone = pMptCtx->bSingleTone; - bCarrierSuppression = pMptCtx->bCarrierSuppression; -#else - PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.mpt_ctx); -#endif -#endif -#endif - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("===> PHY_LCCalibrate_8814A\n")); - -//#if (MP_DRIVER == 1) - _phy_lc_calibrate_8814a(pDM_Odm, TRUE); -//#endif - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("<=== PHY_LCCalibrate_8814A\n")); - -} - -VOID -PHY_APCalibrate_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN struct dm_struct * pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN s1Byte delta - ) -{ - -} - - -VOID -PHY_DPCalibrate_8814A( - IN struct dm_struct * pDM_Odm - ) -{ -} - - -BOOLEAN -phy_QueryRFPathSwitch_8814A( - IN PADAPTER pAdapter - ) -{ - return TRUE; -} - - -BOOLEAN PHY_QueryRFPathSwitch_8814A( - IN PADAPTER pAdapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - -#if DISABLE_BB_RF - return TRUE; -#endif - - return phy_QueryRFPathSwitch_8814A(pAdapter); -} - - -VOID _phy_SetRFPathSwitch_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN struct dm_struct * pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN BOOLEAN bMain, - IN BOOLEAN is2T - ) -{ -} -VOID phy_set_rf_path_switch_8814a( -#if ((DM_ODM_SUPPORT_TYPE & ODM_AP) || (DM_ODM_SUPPORT_TYPE == ODM_CE)) - IN struct dm_struct * pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN boolean bMain - ) -{ -} - - - - - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.h b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.h deleted file mode 100644 index 1f885b32e4c752..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_ce.h +++ /dev/null @@ -1,112 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -#ifndef __HAL_PHY_RF_8814A_H__ -#define __HAL_PHY_RF_8814A_H__ - -/*--------------------------Define Parameters-------------------------------*/ -#define AVG_THERMAL_NUM_8814A 4 -#define RF_T_METER_8814A 0x42 - -#include "../halphyrf_ce.h" - -void configure_txpower_track_8814a( - struct txpwrtrack_cfg *pConfig - ); - -VOID -GetDeltaSwingTable_8814A( - IN PVOID pDM_VOID, - u8* *TemperatureUP_A, - u8* *TemperatureDOWN_A, - u8* *TemperatureUP_B, - u8* *TemperatureDOWN_B - ); - -VOID -GetDeltaSwingTable_8814A_PathCD( - IN PVOID pDM_VOID, - u8* *TemperatureUP_C, - u8* *TemperatureDOWN_C, - u8* *TemperatureUP_D, - u8* *TemperatureDOWN_D - ); - -VOID -ODM_TxPwrTrackSetPwr8814A( - IN PVOID pDM_VOID, - enum pwrtrack_method Method, - u8 RFPath, - u8 ChannelMappedIndex - ); - -u8 -CheckRFGainOffset( - struct dm_struct *pDM_Odm, - enum pwrtrack_method Method, - u8 RFPath - ); - -VOID -phy_iq_calibrate_8814a( - IN PVOID pDM_VOID, - boolean bReCovery - ); - -// -// LC calibrate -// -void -phy_lc_calibrate_8814a( - IN PVOID pDM_VOID - ); - -// -// AP calibrate -// -void -PHY_APCalibrate_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - struct dm_struct * pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN s1Byte delta - ); - - -VOID -PHY_DPCalibrate_8814A( - struct dm_struct * pDM_Odm - ); - - -VOID phy_set_rf_path_switch_8814a( -#if ((DM_ODM_SUPPORT_TYPE & ODM_AP) || (DM_ODM_SUPPORT_TYPE == ODM_CE)) - struct dm_struct * pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - boolean bMain - ); - - -#endif // #ifndef __HAL_PHY_RF_8188E_H__ - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_win.c b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_win.c deleted file mode 100644 index eb91c4d8af7aad..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_win.c +++ /dev/null @@ -1,528 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -#include "mp_precomp.h" -#include "../phydm_precomp.h" - -#if (RTL8814A_SUPPORT == 1) - - -/*---------------------------Define Local Constant---------------------------*/ -// 2010/04/25 MH Define the max tx power tracking tx agc power. -#define ODM_TXPWRTRACK_MAX_IDX_8814A 6 - -/*---------------------------Define Local Constant---------------------------*/ - -//3============================================================ -//3 Tx Power Tracking -//3============================================================ - -// Add CheckRFGainOffset By YuChen to make sure that RF gain offset will not over upperbound 4'b1010 - -u1Byte -CheckRFGainOffset( - PDM_ODM_T pDM_Odm, - u1Byte RFPath - ) -{ - u1Byte UpperBound = 10; // 4'b1010 = 10 - u1Byte Final_RF_Index = 0; - BOOLEAN bPositive = FALSE; - PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - - if( pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] >= 0) // check if RF_Index is positive or not - { - Final_RF_Index = pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] >> 1; - bPositive = TRUE; - ODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)RFPath, rRF_TxGainOffset, BIT15, bPositive); - } - else - { - Final_RF_Index = (-1)*pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] >> 1; - bPositive = FALSE; - ODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)RFPath, rRF_TxGainOffset, BIT15, bPositive); - } - - if(bPositive == TRUE) - { - if(Final_RF_Index >= UpperBound) - { - ODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)RFPath, rRF_TxGainOffset, 0xF0000, UpperBound); //set RF Reg0x55 per path - return UpperBound; - } - else - { - ODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)RFPath, rRF_TxGainOffset, 0xF0000, Final_RF_Index); //set RF Reg0x55 per path - return Final_RF_Index; - } - } - else - { - ODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)RFPath, rRF_TxGainOffset, 0xF0000, Final_RF_Index); //set RF Reg0x55 per path - return Final_RF_Index; - - } - - return FALSE; - -} - - - - -VOID -ODM_TxPwrTrackSetPwr8814A( - PDM_ODM_T pDM_Odm, - PWRTRACK_METHOD Method, - u1Byte RFPath, - u1Byte ChannelMappedIndex - ) -{ - u1Byte Final_OFDM_Swing_Index = 0; - u1Byte Final_CCK_Swing_Index = 0; - u1Byte Final_RF_Index = 0; - u1Byte UpperBound = 10, TxScalingUpperBound = 28; // Upperbound = 4'b1010, TxScalingUpperBound = +2 dB - PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - - - if (Method == MIX_MODE) - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("pRFCalibrateInfo->DefaultOfdmIndex=%d, pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath]=%d, RF_Path = %d\n", - pRFCalibrateInfo->DefaultOfdmIndex, pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath], RFPath)); - - Final_CCK_Swing_Index = pRFCalibrateInfo->DefaultCckIndex + pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath]; - Final_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex + (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath])%2; - - Final_RF_Index = CheckRFGainOffset(pDM_Odm, RFPath); // check if Final_RF_Index >= 10 - - if((Final_RF_Index == UpperBound) && (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] >= 0)) // check BBSW is not over +2dB - { - Final_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex + (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] - (UpperBound << 1)); - if(Final_OFDM_Swing_Index > TxScalingUpperBound) - Final_OFDM_Swing_Index = TxScalingUpperBound; - } - - switch(RFPath) - { - case ODM_RF_PATH_A: - - ODM_SetBBReg(pDM_Odm, rA_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); //set BBswing - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("******Path_A Compensate with BBSwing , Final_OFDM_Swing_Index = %d, Final_RF_Index = %d \n", Final_OFDM_Swing_Index, Final_RF_Index)); - break; - - case ODM_RF_PATH_B: - - ODM_SetBBReg(pDM_Odm, rB_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); //set BBswing - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("******Path_B Compensate with BBSwing , Final_OFDM_Swing_Index = %d, Final_RF_Index = %d \n", Final_OFDM_Swing_Index, Final_RF_Index)); - break; - - case ODM_RF_PATH_C: - - ODM_SetBBReg(pDM_Odm, rC_TxScale_Jaguar2, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); //set BBswing - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("******Path_C Compensate with BBSwing , Final_OFDM_Swing_Index = %d, Final_RF_Index = %d \n", Final_OFDM_Swing_Index, Final_RF_Index)); - break; - - case ODM_RF_PATH_D: - - ODM_SetBBReg(pDM_Odm, rD_TxScale_Jaguar2, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); //set BBswing - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("******Path_D Compensate with BBSwing , Final_OFDM_Swing_Index = %d, Final_RF_Index = %d \n", Final_OFDM_Swing_Index, Final_RF_Index)); - break; - - default: - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("Wrong Path name!!!! \n")); - - break; - } - - - } - - return; -} // ODM_TxPwrTrackSetPwr8814A - - -VOID -GetDeltaSwingTable_8814A( - IN PDM_ODM_T pDM_Odm, - OUT pu1Byte *TemperatureUP_A, - OUT pu1Byte *TemperatureDOWN_A, - OUT pu1Byte *TemperatureUP_B, - OUT pu1Byte *TemperatureDOWN_B - ) -{ - PADAPTER Adapter = pDM_Odm->Adapter; - PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u1Byte TxRate = 0xFF; - u1Byte channel = pHalData->CurrentChannel; - - - if (pDM_Odm->mp_mode == TRUE) { - #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE)) - #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) - #if (MP_DRIVER == 1) - PMPT_CONTEXT pMptCtx = &(Adapter->MptCtx); - - TxRate = MptToMgntRate(pMptCtx->MptRateIndex); - #endif - #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) - PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.MptCtx); - - TxRate = MptToMgntRate(pMptCtx->MptRateIndex); - #endif - #endif - } else { - u2Byte rate = *(pDM_Odm->pForcedDataRate); - - if (!rate) { /*auto rate*/ - if (rate != 0xFF) { - #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) - TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate); - #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) - TxRate = HwRateToMRate(pDM_Odm->TxRate); - #endif - } - } else { /*force rate*/ - TxRate = (u1Byte)rate; - } - } - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("Power Tracking TxRate=0x%X\n", TxRate)); - - if (1 <= channel && channel <= 14) { - if (IS_CCK_RATE(TxRate)) { - *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P; - *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N; - *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P; - *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N; - } else { - *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P; - *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N; - *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P; - *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N; - } - } else if (36 <= channel && channel <= 64) { - *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[0]; - *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[0]; - *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[0]; - *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[0]; - } else if (100 <= channel && channel <= 144) { - *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[1]; - *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[1]; - *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[1]; - *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[1]; - } else if (149 <= channel && channel <= 173) { - *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[2]; - *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[2]; - *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[2]; - *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[2]; - } else { - *TemperatureUP_A = (pu1Byte)DeltaSwingTableIdx_2GA_P_8188E; - *TemperatureDOWN_A = (pu1Byte)DeltaSwingTableIdx_2GA_N_8188E; - *TemperatureUP_B = (pu1Byte)DeltaSwingTableIdx_2GA_P_8188E; - *TemperatureDOWN_B = (pu1Byte)DeltaSwingTableIdx_2GA_N_8188E; - } - - - return; -} - - -VOID -GetDeltaSwingTable_8814A_PathCD( - IN PDM_ODM_T pDM_Odm, - OUT pu1Byte *TemperatureUP_C, - OUT pu1Byte *TemperatureDOWN_C, - OUT pu1Byte *TemperatureUP_D, - OUT pu1Byte *TemperatureDOWN_D - ) -{ - PADAPTER Adapter = pDM_Odm->Adapter; - PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u1Byte TxRate = 0xFF; - u1Byte channel = pHalData->CurrentChannel; - - if (pDM_Odm->mp_mode == TRUE) { - #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE)) - #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) - #if (MP_DRIVER == 1) - PMPT_CONTEXT pMptCtx = &(Adapter->MptCtx); - - TxRate = MptToMgntRate(pMptCtx->MptRateIndex); - #endif - #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) - PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.MptCtx); - - TxRate = MptToMgntRate(pMptCtx->MptRateIndex); - #endif - #endif - } else { - u2Byte rate = *(pDM_Odm->pForcedDataRate); - - if (!rate) { /*auto rate*/ - if (rate != 0xFF) { - #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) - TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate); - #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) - TxRate = HwRateToMRate(pDM_Odm->TxRate); - #endif - } - } else { /*force rate*/ - TxRate = (u1Byte)rate; - } - } - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("Power Tracking TxRate=0x%X\n", TxRate)); - - - if ( 1 <= channel && channel <= 14) { - if (IS_CCK_RATE(TxRate)) { - *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKC_P; - *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKC_N; - *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKD_P; - *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKD_N; - } else { - *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GC_P; - *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GC_N; - *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GD_P; - *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GD_N; - } - } else if (36 <= channel && channel <= 64) { - *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P[0]; - *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N[0]; - *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P[0]; - *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N[0]; - } else if (100 <= channel && channel <= 144) { - *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P[1]; - *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N[1]; - *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P[1]; - *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N[1]; - } else if (149 <= channel && channel <= 173) { - *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P[2]; - *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N[2]; - *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P[2]; - *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N[2]; - } else { - *TemperatureUP_C = (pu1Byte)DeltaSwingTableIdx_2GA_P_8188E; - *TemperatureDOWN_C = (pu1Byte)DeltaSwingTableIdx_2GA_N_8188E; - *TemperatureUP_D = (pu1Byte)DeltaSwingTableIdx_2GA_P_8188E; - *TemperatureDOWN_D = (pu1Byte)DeltaSwingTableIdx_2GA_N_8188E; - } - - - return; -} - -void ConfigureTxpowerTrack_8814A( - PTXPWRTRACK_CFG pConfig - ) -{ - pConfig->SwingTableSize_CCK = CCK_TABLE_SIZE; - pConfig->SwingTableSize_OFDM = OFDM_TABLE_SIZE; - pConfig->Threshold_IQK = 8; - pConfig->AverageThermalNum = AVG_THERMAL_NUM_8814A; - pConfig->RfPathCount = MAX_PATH_NUM_8814A; - pConfig->ThermalRegAddr = RF_T_METER_88E; - - pConfig->ODM_TxPwrTrackSetPwr = ODM_TxPwrTrackSetPwr8814A; - pConfig->DoIQK = DoIQK_8814A; - pConfig->PHY_LCCalibrate = PHY_LCCalibrate_8814A; - pConfig->GetDeltaSwingTable = GetDeltaSwingTable_8814A; - pConfig->GetDeltaSwingTable8814only = GetDeltaSwingTable_8814A_PathCD; -} - -VOID -phy_LCCalibrate_8814A( - IN PDM_ODM_T pDM_Odm, - IN BOOLEAN is2T - ) -{ - u4Byte LC_Cal = 0, cnt; - - //Check continuous TX and Packet TX - u4Byte reg0x914 = ODM_Read4Byte(pDM_Odm, rSingleTone_ContTx_Jaguar);; - - // Backup RF reg18. - LC_Cal = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask); - - if((reg0x914 & 0x70000) == 0) - ODM_Write1Byte(pDM_Odm, REG_TXPAUSE_8812A, 0xFF); - - //3 3. Read RF reg18 - LC_Cal = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask); - - //3 4. Set LC calibration begin bit15 - ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, LC_Cal|0x08000); - - ODM_delay_ms(100); - - for (cnt = 0; cnt < 100; cnt++) { - if (ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x8000) != 0x1) - break; - ODM_delay_ms(10); - } - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("retry cnt = %d\n", cnt)); - - - - //3 Restore original situation - if((reg0x914 & 70000) == 0) - ODM_Write1Byte(pDM_Odm, REG_TXPAUSE_8812A, 0x00); - - // Recover channel number - ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, LC_Cal); - - DbgPrint("Call %s\n", __FUNCTION__); -} - - -VOID -phy_APCalibrate_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN s1Byte delta, - IN BOOLEAN is2T - ) -{ -} - - -VOID -PHY_LCCalibrate_8814A( - IN PDM_ODM_T pDM_Odm - ) -{ - -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - PADAPTER pAdapter = pDM_Odm->Adapter; - -#if (MP_DRIVER == 1) -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - PMPT_CONTEXT pMptCtx = &(pAdapter->MptCtx); -#else - PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx); -#endif -#endif -#endif - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("===> PHY_LCCalibrate_8814A\n")); - -//#if (MP_DRIVER == 1) - phy_LCCalibrate_8814A(pDM_Odm, TRUE); -//#endif - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("<=== PHY_LCCalibrate_8814A\n")); - -} - -VOID -PHY_APCalibrate_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN s1Byte delta - ) -{ - -} - - -VOID -PHY_DPCalibrate_8814A( - IN PDM_ODM_T pDM_Odm - ) -{ -} - - -BOOLEAN -phy_QueryRFPathSwitch_8814A( - IN PADAPTER pAdapter - ) -{ - return TRUE; -} - - -BOOLEAN PHY_QueryRFPathSwitch_8814A( - IN PADAPTER pAdapter - ) -{ - -#if DISABLE_BB_RF - return TRUE; -#endif - - return phy_QueryRFPathSwitch_8814A(pAdapter); -} - - -VOID phy_SetRFPathSwitch_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN BOOLEAN bMain, - IN BOOLEAN is2T - ) -{ -} -VOID PHY_SetRFPathSwitch_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN BOOLEAN bMain - ) -{ -} - - - - -#else /* (RTL8814A_SUPPORT == 0)*/ -VOID -PHY_LCCalibrate_8814A( - IN PDM_ODM_T pDM_Odm - ){} - -VOID -PHY_IQCalibrate_8814A( - IN PDM_ODM_T pDM_Odm, - IN BOOLEAN bReCovery - ){} -#endif /* (RTL8814A_SUPPORT == 0)*/ diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_win.h b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_win.h deleted file mode 100644 index 658d6f063c0fec..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_8814a_win.h +++ /dev/null @@ -1,106 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -#ifndef __HAL_PHY_RF_8814A_H__ -#define __HAL_PHY_RF_8814A_H__ - -/*--------------------------Define Parameters-------------------------------*/ -#define AVG_THERMAL_NUM_8814A 4 - -#include "halphyrf_win.h" - -void ConfigureTxpowerTrack_8814A( - PTXPWRTRACK_CFG pConfig - ); - -VOID -GetDeltaSwingTable_8814A( - IN PDM_ODM_T pDM_Odm, - OUT pu1Byte *TemperatureUP_A, - OUT pu1Byte *TemperatureDOWN_A, - OUT pu1Byte *TemperatureUP_B, - OUT pu1Byte *TemperatureDOWN_B - ); - -VOID -GetDeltaSwingTable_8814A_PathCD( - IN PDM_ODM_T pDM_Odm, - OUT pu1Byte *TemperatureUP_C, - OUT pu1Byte *TemperatureDOWN_C, - OUT pu1Byte *TemperatureUP_D, - OUT pu1Byte *TemperatureDOWN_D - ); - - -VOID -ODM_TxPwrTrackSetPwr8814A( - PDM_ODM_T pDM_Odm, - PWRTRACK_METHOD Method, - u1Byte RFPath, - u1Byte ChannelMappedIndex - ); - -u1Byte -CheckRFGainOffset( - PDM_ODM_T pDM_Odm, - u1Byte RFPath - ); - - -// -// LC calibrate -// -void -PHY_LCCalibrate_8814A( - IN PDM_ODM_T pDM_Odm - ); - -// -// AP calibrate -// -void -PHY_APCalibrate_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN s1Byte delta - ); - - -VOID -PHY_DPCalibrate_8814A( - IN PDM_ODM_T pDM_Odm - ); - - -VOID PHY_SetRFPathSwitch_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN BOOLEAN bMain - ); - - -#endif // #ifndef __HAL_PHY_RF_8188E_H__ - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.c b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.c deleted file mode 100644 index e019df35a9bba6..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.c +++ /dev/null @@ -1,557 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -#include "mp_precomp.h" -#include "../../phydm_precomp.h" - - - -/*---------------------------Define Local Constant---------------------------*/ - - -/*---------------------------Define Local Constant---------------------------*/ - - -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) -void DoIQK_8814A( - void* pDM_VOID, - u8 DeltaThermalIndex, - u8 ThermalValue, - u8 Threshold - ) -{ - struct dm_struct * pDM_Odm = (struct dm_struct *)pDM_VOID; - - odm_reset_iqk_result(pDM_Odm); - - pDM_Odm->rf_calibrate_info.thermal_value_iqk= ThermalValue; - - phy_iq_calibrate_8814a(pDM_Odm, FALSE); - -} -#else -/*Originally pConfig->DoIQK is hooked PHY_IQCalibrate_8814A, but DoIQK_8814A and PHY_IQCalibrate_8814A have different arguments*/ -void DoIQK_8814A( - void* pDM_VOID, - u8 DeltaThermalIndex, - u8 ThermalValue, - u8 Threshold - ) -{ - struct dm_struct * pDM_Odm = (struct dm_struct *)pDM_VOID; - boolean bReCovery = (boolean) DeltaThermalIndex; - - phy_iq_calibrate_8814a(pDM_Odm, bReCovery); -} -#endif -//1 7. IQK - -VOID -_IQK_BackupMacBB_8814A( - IN struct dm_struct * pDM_Odm, - u32* MAC_backup, - u32* BB_backup, - u32* Backup_MAC_REG, - u32* Backup_BB_REG - ) -{ - u32 i; - //save MACBB default value - for (i = 0; i < MAC_REG_NUM_8814; i++){ - MAC_backup[i] = odm_read_4byte(pDM_Odm, Backup_MAC_REG[i]); - } - for (i = 0; i < BB_REG_NUM_8814; i++){ - BB_backup[i] = odm_read_4byte(pDM_Odm, Backup_BB_REG[i]); - } - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("BackupMacBB Success!!!!\n")); -} - - -VOID -_IQK_BackupRF_8814A( - IN struct dm_struct * pDM_Odm, - u32 RF_backup[][4], - u32* Backup_RF_REG - ) -{ - u32 i; - //Save RF Parameters - for (i = 0; i < RF_REG_NUM_8814; i++){ - RF_backup[i][RF_PATH_A] = odm_get_rf_reg(pDM_Odm, RF_PATH_A, Backup_RF_REG[i], bRFRegOffsetMask); - RF_backup[i][RF_PATH_B] = odm_get_rf_reg(pDM_Odm, RF_PATH_B, Backup_RF_REG[i], bRFRegOffsetMask); - RF_backup[i][RF_PATH_C] = odm_get_rf_reg(pDM_Odm, RF_PATH_C, Backup_RF_REG[i], bRFRegOffsetMask); - RF_backup[i][RF_PATH_D] = odm_get_rf_reg(pDM_Odm, RF_PATH_D, Backup_RF_REG[i], bRFRegOffsetMask); - } - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("BackupRF Success!!!!\n")); -} - - -VOID -_IQK_AFESetting_8814A( - IN struct dm_struct * pDM_Odm, - IN boolean Do_IQK - ) -{ - if(Do_IQK) - { - // IQK AFE Setting RX_WAIT_CCA mode - odm_write_4byte(pDM_Odm, 0xc60, 0x0e808003); - odm_write_4byte(pDM_Odm, 0xe60, 0x0e808003); - odm_write_4byte(pDM_Odm, 0x1860, 0x0e808003); - odm_write_4byte(pDM_Odm, 0x1a60, 0x0e808003); - odm_set_bb_reg(pDM_Odm, 0x90c, BIT(13), 0x1); - - odm_set_bb_reg(pDM_Odm, 0x764, BIT(10)|BIT(9), 0x3); - odm_set_bb_reg(pDM_Odm, 0x764, BIT(10)|BIT(9), 0x0); - - odm_set_bb_reg(pDM_Odm, 0x804, BIT(2), 0x1); - odm_set_bb_reg(pDM_Odm, 0x804, BIT(2), 0x0); - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("AFE IQK mode Success!!!!\n")); - } - else - { - odm_write_4byte(pDM_Odm, 0xc60, 0x07808003); - odm_write_4byte(pDM_Odm, 0xe60, 0x07808003); - odm_write_4byte(pDM_Odm, 0x1860, 0x07808003); - odm_write_4byte(pDM_Odm, 0x1a60, 0x07808003); - odm_set_bb_reg(pDM_Odm, 0x90c, BIT(13), 0x1); - - odm_set_bb_reg(pDM_Odm, 0x764, BIT(10)|BIT(9), 0x3); - odm_set_bb_reg(pDM_Odm, 0x764, BIT(10)|BIT(9), 0x0); - - odm_set_bb_reg(pDM_Odm, 0x804, BIT(2), 0x1); - odm_set_bb_reg(pDM_Odm, 0x804, BIT(2), 0x0); - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("AFE Normal mode Success!!!!\n")); - } - -} - - -VOID -_IQK_RestoreMacBB_8814A( - IN struct dm_struct * pDM_Odm, - u32* MAC_backup, - u32* BB_backup, - u32* Backup_MAC_REG, - u32* Backup_BB_REG - ) -{ - u32 i; - //Reload MacBB Parameters - for (i = 0; i < MAC_REG_NUM_8814; i++){ - odm_write_4byte(pDM_Odm, Backup_MAC_REG[i], MAC_backup[i]); - } - for (i = 0; i < BB_REG_NUM_8814; i++){ - odm_write_4byte(pDM_Odm, Backup_BB_REG[i], BB_backup[i]); - } - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RestoreMacBB Success!!!!\n")); -} - -VOID -_IQK_RestoreRF_8814A( - IN struct dm_struct * pDM_Odm, - u32* Backup_RF_REG, - u32 RF_backup[][4] - ) -{ - u32 i; - - odm_set_rf_reg(pDM_Odm, RF_PATH_A, 0xef, bRFRegOffsetMask, 0x0); - odm_set_rf_reg(pDM_Odm, RF_PATH_B, 0xef, bRFRegOffsetMask, 0x0); - odm_set_rf_reg(pDM_Odm, RF_PATH_C, 0xef, bRFRegOffsetMask, 0x0); - odm_set_rf_reg(pDM_Odm, RF_PATH_D, 0xef, bRFRegOffsetMask, 0x0); - - for (i = 0; i < RF_REG_NUM_8814; i++){ - odm_set_rf_reg(pDM_Odm, RF_PATH_A, Backup_RF_REG[i], bRFRegOffsetMask, RF_backup[i][RF_PATH_A]); - odm_set_rf_reg(pDM_Odm, RF_PATH_B, Backup_RF_REG[i], bRFRegOffsetMask, RF_backup[i][RF_PATH_B]); - odm_set_rf_reg(pDM_Odm, RF_PATH_C, Backup_RF_REG[i], bRFRegOffsetMask, RF_backup[i][RF_PATH_C]); - odm_set_rf_reg(pDM_Odm, RF_PATH_D, Backup_RF_REG[i], bRFRegOffsetMask, RF_backup[i][RF_PATH_D]); - } - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("RestoreRF Success!!!!\n")); - -} - -VOID -PHY_ResetIQKResult_8814A( - IN struct dm_struct * pDM_Odm -) -{ - odm_write_4byte(pDM_Odm, 0x1b00, 0xf8000000); - odm_write_4byte(pDM_Odm, 0x1b38, 0x20000000); - odm_write_4byte(pDM_Odm, 0x1b00, 0xf8000002); - odm_write_4byte(pDM_Odm, 0x1b38, 0x20000000); - odm_write_4byte(pDM_Odm, 0x1b00, 0xf8000004); - odm_write_4byte(pDM_Odm, 0x1b38, 0x20000000); - odm_write_4byte(pDM_Odm, 0x1b00, 0xf8000006); - odm_write_4byte(pDM_Odm, 0x1b38, 0x20000000); - odm_write_4byte(pDM_Odm, 0xc10, 0x100); - odm_write_4byte(pDM_Odm, 0xe10, 0x100); - odm_write_4byte(pDM_Odm, 0x1810, 0x100); - odm_write_4byte(pDM_Odm, 0x1a10, 0x100); -} - -VOID -_IQK_ResetNCTL_8814A( - IN struct dm_struct * pDM_Odm -) -{ - odm_write_4byte(pDM_Odm, 0x1b00, 0xf8000000); - odm_write_4byte(pDM_Odm, 0x1b80, 0x00000006); - odm_write_4byte(pDM_Odm, 0x1b00, 0xf8000000); - odm_write_4byte(pDM_Odm, 0x1b80, 0x00000002); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("ResetNCTL Success!!!!\n")); -} - -VOID -_IQK_ConfigureMAC_8814A( - IN struct dm_struct * pDM_Odm - ) -{ - // ========MAC register setting======== - odm_write_1byte(pDM_Odm, 0x522, 0x3f); - odm_set_bb_reg(pDM_Odm, 0x550, BIT(11)|BIT(3), 0x0); - odm_write_1byte(pDM_Odm, 0x808, 0x00); // RX ante off - odm_set_bb_reg(pDM_Odm, 0x838, 0xf, 0xe); // CCA off - odm_set_bb_reg(pDM_Odm, 0xa14, BIT(9)|BIT(8), 0x3); // CCK RX Path off - odm_write_4byte(pDM_Odm, 0xcb0, 0x77777777); - odm_write_4byte(pDM_Odm, 0xeb0, 0x77777777); - odm_write_4byte(pDM_Odm, 0x18b4, 0x77777777); - odm_write_4byte(pDM_Odm, 0x1ab4, 0x77777777); - odm_set_bb_reg(pDM_Odm, 0x1abc, 0x0ff00000, 0x77); - /*by YN*/ - odm_set_bb_reg(pDM_Odm, 0xcbc, 0xf, 0x0); -} - -VOID -_LOK_One_Shot( - IN void* pDM_VOID -) -{ - struct dm_struct * pDM_Odm = (struct dm_struct *)pDM_VOID; - struct dm_iqk_info * pIQK_info = &pDM_Odm->IQK_info; - u8 Path = 0, delay_count = 0, ii; - boolean LOK_notready = FALSE; - u32 LOK_temp1 = 0, LOK_temp2 = 0; - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("============ LOK ============\n")); - for(Path =0; Path <=3; Path++){ - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, - ("==========S%d LOK ==========\n", Path)); - - odm_set_bb_reg(pDM_Odm, 0x9a4, BIT(21)|BIT(20), Path); // ADC Clock source - odm_write_4byte(pDM_Odm, 0x1b00, (0xf8000001|(1<<(4+Path)))); // LOK: CMD ID = 0 {0xf8000011, 0xf8000021, 0xf8000041, 0xf8000081} - ODM_delay_ms(LOK_delay); - delay_count = 0; - LOK_notready = TRUE; - - while(LOK_notready){ - LOK_notready = (boolean) odm_get_bb_reg(pDM_Odm, 0x1b00, BIT(0)); - ODM_delay_ms(1); - delay_count++; - if(delay_count >= 10){ - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, - ("S%d LOK timeout!!!\n", Path)); - - _IQK_ResetNCTL_8814A(pDM_Odm); - break; - } - } - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, - ("S%d ==> delay_count = 0x%d\n", Path, delay_count)); - - if(!LOK_notready){ - odm_write_4byte(pDM_Odm, 0x1b00, 0xf8000000|(Path<<1)); - odm_write_4byte(pDM_Odm, 0x1bd4, 0x003f0001); - LOK_temp2 = (odm_get_bb_reg(pDM_Odm, 0x1bfc, 0x003e0000)+0x10)&0x1f; - LOK_temp1 = (odm_get_bb_reg(pDM_Odm, 0x1bfc, 0x0000003e)+0x10)&0x1f; - - for(ii = 1; ii<5; ii++){ - LOK_temp1 = LOK_temp1 + ((LOK_temp1 & BIT(4-ii))<<(ii*2)); - LOK_temp2 = LOK_temp2 + ((LOK_temp2 & BIT(4-ii))<<(ii*2)); - } - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, - ("LOK_temp1 = 0x%x, LOK_temp2 = 0x%x\n", LOK_temp1>>4, LOK_temp2>>4)); - - odm_set_rf_reg(pDM_Odm, Path, 0x8, 0x07c00, LOK_temp1>>4); - odm_set_rf_reg(pDM_Odm, Path, 0x8, 0xf8000, LOK_temp2>>4); - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, - ("==>S%d fill LOK\n", Path)); - - } - else{ - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, - ("==>S%d LOK Fail!!!\n", Path)); - odm_set_rf_reg(pDM_Odm, Path, 0x8, bRFRegOffsetMask, 0x08400); - } - pIQK_info->lok_fail[Path] = LOK_notready; - - } - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, - ("LOK0_notready = %d, LOK1_notready = %d, LOK2_notready = %d, LOK3_notready = %d\n", - pIQK_info->lok_fail[0], pIQK_info->lok_fail[1], pIQK_info->lok_fail[2], pIQK_info->lok_fail[3])); -} - -VOID -_IQK_One_Shot( - IN void* pDM_VOID -) -{ - struct dm_struct * pDM_Odm = (struct dm_struct *)pDM_VOID; - struct dm_iqk_info * pIQK_info = &pDM_Odm->IQK_info; - u8 Path = 0, delay_count = 0, cal_retry = 0, idx; - boolean notready = TRUE, fail = TRUE; - u32 IQK_CMD; - u16 IQK_Apply[4] = {0xc94, 0xe94, 0x1894, 0x1a94}; - - for(idx = 0; idx <= 1; idx++){ // ii = 0:TXK , 1: RXK - - if(idx == TX_IQK){ - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, - ("============ WBTXIQK ============\n")); - } - else if(idx == RX_IQK){ - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, - ("============ WBRXIQK ============\n")); - } - - for(Path =0; Path <=3; Path++){ - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, - ("==========S%d IQK ==========\n", Path)); - cal_retry = 0; - fail = TRUE; - while(fail){ - odm_set_bb_reg(pDM_Odm, 0x9a4, BIT(21)|BIT(20), Path); - if(idx == TX_IQK){ - IQK_CMD = (0xf8000001|(*pDM_Odm->band_width+3)<<8|(1<<(4+Path))); - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, - ("TXK_Trigger = 0x%x\n", IQK_CMD)); - /* - {0xf8000311, 0xf8000321, 0xf8000341, 0xf8000381} ==> 20 WBTXK (CMD = 3) - {0xf8000411, 0xf8000421, 0xf8000441, 0xf8000481} ==> 40 WBTXK (CMD = 4) - {0xf8000511, 0xf8000521, 0xf8000541, 0xf8000581} ==> 80 WBTXK (CMD = 5) - */ - odm_write_4byte(pDM_Odm, 0x1b00, IQK_CMD); - } - else if(idx == RX_IQK){ - IQK_CMD = (0xf8000001|(9-*pDM_Odm->band_width)<<8|(1<<(4+Path))); - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, - ("TXK_Trigger = 0x%x\n", IQK_CMD)); - /* - {0xf8000911, 0xf8000921, 0xf8000941, 0xf8000981} ==> 20 WBRXK (CMD = 9) - {0xf8000811, 0xf8000821, 0xf8000841, 0xf8000881} ==> 40 WBRXK (CMD = 8) - {0xf8000711, 0xf8000721, 0xf8000741, 0xf8000781} ==> 80 WBRXK (CMD = 7) - */ - odm_write_4byte(pDM_Odm, 0x1b00, IQK_CMD); - } - - ODM_delay_ms(WBIQK_delay); - - delay_count = 0; - notready = TRUE; - while(notready){ - notready = (boolean) odm_get_bb_reg(pDM_Odm, 0x1b00, BIT(0)); - if(!notready){ - fail = (boolean) odm_get_bb_reg(pDM_Odm, 0x1b08, BIT(26)); - break; - } - ODM_delay_ms(1); - delay_count++; - if(delay_count >= 20){ - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, - ("S%d IQK timeout!!!\n", Path)); - _IQK_ResetNCTL_8814A(pDM_Odm); - break; - } - } - if(fail) - cal_retry++; - if(cal_retry >3 ) - break; - - } - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, - ("S%d ==> 0x1b00 = 0x%x\n", Path, odm_read_4byte(pDM_Odm, 0x1b00))); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, - ("S%d ==> 0x1b08 = 0x%x\n", Path, odm_read_4byte(pDM_Odm, 0x1b08))); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, - ("S%d ==> delay_count = 0x%d, cal_retry = %x\n", Path, delay_count, cal_retry)); - - odm_write_4byte(pDM_Odm, 0x1b00, 0xf8000000|(Path<<1)); - if(!fail){ - if(idx == TX_IQK){ - pIQK_info->iqc_matrix[idx][Path] = odm_read_4byte(pDM_Odm, 0x1b38); - } - else if(idx == RX_IQK){ - odm_write_4byte(pDM_Odm, 0x1b3c, 0x20000000); - pIQK_info->iqc_matrix[idx][Path] = odm_read_4byte(pDM_Odm, 0x1b3c); - } - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, - ("S%d_IQC = 0x%x\n", Path, pIQK_info->iqc_matrix[idx][Path])); - - } - - if(idx == RX_IQK){ - if(pIQK_info->iqk_fail[TX_IQK][Path] == FALSE) // TXIQK success in RXIQK - odm_write_4byte( pDM_Odm, 0x1b38, pIQK_info->iqc_matrix[TX_IQK][Path]); - else - odm_set_bb_reg(pDM_Odm, IQK_Apply[Path], BIT0, 0x0); - - if(fail) // RXIQK Fail - odm_set_bb_reg(pDM_Odm, IQK_Apply[Path], (BIT11|BIT10), 0x0); - } - - pIQK_info->iqk_fail[idx][Path] = fail; - - } - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, - ("IQK0_fail = %d, IQK1_fail = %d, IQK2_fail = %d, IQK3_fail = %d\n", - pIQK_info->iqk_fail[idx][0], pIQK_info->iqk_fail[idx][1], pIQK_info->iqk_fail[idx][2], pIQK_info->iqk_fail[idx][3])); - } -} - -VOID -_IQK_Tx_8814A( - IN struct dm_struct * pDM_Odm, - IN u8 chnlIdx - ) -{ - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("BandWidth = %d, ExtPA2G = %d\n", *pDM_Odm->p_band_width, pDM_Odm->ext_pa)); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Interface = %d, pBandType = %d\n", pDM_Odm->support_interface, *pDM_Odm->p_band_type)); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("CutVersion = %x\n", pDM_Odm->cut_version)); - - odm_set_rf_reg(pDM_Odm, RF_PATH_A, 0x58, BIT(19), 0x1); - odm_set_rf_reg(pDM_Odm, RF_PATH_B, 0x58, BIT(19), 0x1); - odm_set_rf_reg(pDM_Odm, RF_PATH_C, 0x58, BIT(19), 0x1); - odm_set_rf_reg(pDM_Odm, RF_PATH_D, 0x58, BIT(19), 0x1); - - odm_set_bb_reg(pDM_Odm, 0xc94, (BIT11|BIT10|BIT0), 0x401); - odm_set_bb_reg(pDM_Odm, 0xe94, (BIT11|BIT10|BIT0), 0x401); - odm_set_bb_reg(pDM_Odm, 0x1894, (BIT11|BIT10|BIT0), 0x401); - odm_set_bb_reg(pDM_Odm, 0x1a94, (BIT11|BIT10|BIT0), 0x401); - - if(*pDM_Odm->band_type == ODM_BAND_5G) - odm_write_4byte(pDM_Odm, 0x1b00, 0xf8000ff1); - else - odm_write_4byte(pDM_Odm, 0x1b00, 0xf8000ef1); - - ODM_delay_ms(1); - - odm_write_4byte(pDM_Odm, 0x810, 0x20101063); - odm_write_4byte(pDM_Odm, 0x90c, 0x0B00C000); - - _LOK_One_Shot(pDM_Odm); - _IQK_One_Shot(pDM_Odm); - -} - -VOID -_phy_iq_calibrate_8814a( - IN struct dm_struct * pDM_Odm, - IN u8 Channel - ) -{ - - u32 MAC_backup[MAC_REG_NUM_8814], BB_backup[BB_REG_NUM_8814], RF_backup[RF_REG_NUM_8814][4]; - u32 Backup_MAC_REG[MAC_REG_NUM_8814] = {0x520, 0x550}; - u32 Backup_BB_REG[BB_REG_NUM_8814] = {0xa14, 0x808, 0x838, 0x90c, 0x810, 0xcb0, 0xeb0, - 0x18b4, 0x1ab4, 0x1abc, 0x9a4, 0x764, 0xcbc}; - u32 Backup_RF_REG[RF_REG_NUM_8814] = {0x0, 0x8f}; - u8 chnlIdx = odm_get_right_chnl_place_for_iqk(Channel); - - _IQK_BackupMacBB_8814A(pDM_Odm, MAC_backup, BB_backup, Backup_MAC_REG, Backup_BB_REG); - _IQK_AFESetting_8814A(pDM_Odm,TRUE); - _IQK_BackupRF_8814A(pDM_Odm, RF_backup, Backup_RF_REG); - _IQK_ConfigureMAC_8814A(pDM_Odm); - _IQK_Tx_8814A(pDM_Odm, chnlIdx); - _IQK_ResetNCTL_8814A(pDM_Odm); //for 3-wire to BB use - _IQK_AFESetting_8814A(pDM_Odm,FALSE); - _IQK_RestoreMacBB_8814A(pDM_Odm, MAC_backup, BB_backup, Backup_MAC_REG, Backup_BB_REG); - _IQK_RestoreRF_8814A(pDM_Odm, Backup_RF_REG, RF_backup); -} - -/*IQK version:v1.1*/ -/*update 0xcbc setting*/ - - -VOID -phy_iq_calibrate_8814a( - IN void* pDM_VOID, - IN boolean bReCovery - ) -{ - struct dm_struct * pDM_Odm = (struct dm_struct *)pDM_VOID; - -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - PADAPTER pAdapter = pDM_Odm->adapter; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - - #if (MP_DRIVER == 1) - #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - PMPT_CONTEXT pMptCtx = &(pAdapter->MptCtx); - #else// (DM_ODM_SUPPORT_TYPE == ODM_CE) - PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.mpt_ctx); - #endif - #endif//(MP_DRIVER == 1) - #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN)) - if (odm_check_power_status(pAdapter) == FALSE) - return; - #endif - - #if MP_DRIVER == 1 - if( pMptCtx->is_single_tone || pMptCtx->is_carrier_suppression ) - return; - #endif - -#endif - #if (DM_ODM_SUPPORT_TYPE & (ODM_CE)) - _phy_iq_calibrate_8814a(pDM_Odm, pHalData->current_channel); - /*DBG_871X("%s,%d, do IQK %u ms\n", __func__, __LINE__, rtw_get_passing_time_ms(time_iqk));*/ - #else - _phy_iq_calibrate_8814a(pDM_Odm, *pDM_Odm->pChannel); - #endif -} - -VOID -PHY_IQCalibrate_8814A_Init( - IN void* pDM_VOID - ) -{ - struct dm_struct * pDM_Odm = (struct dm_struct *)pDM_VOID; - struct dm_iqk_info *pIQK_info = &pDM_Odm->IQK_info; - u8 ii, jj; - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("=====>PHY_IQCalibrate_8814A_Init\n")); - for(jj = 0; jj < 2; jj++){ - for(ii = 0; ii < NUM; ii++){ - pIQK_info->lok_fail[ii] = TRUE; - pIQK_info->iqk_fail[jj][ii] = TRUE; - pIQK_info->iqc_matrix[jj][ii] = 0x20000000; - } - } -} - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.h b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.h deleted file mode 100644 index 15d9cf0377a617..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.h +++ /dev/null @@ -1,58 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __PHYDM_IQK_8814A_H__ -#define __PHYDM_IQK_8814A_H__ - -/*--------------------------Define Parameters-------------------------------*/ -#define MAC_REG_NUM_8814 2 -#define BB_REG_NUM_8814 13 -#define RF_REG_NUM_8814 2 -/*---------------------------End Define Parameters-------------------------------*/ - -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) -VOID -DoIQK_8814A( - PVOID pDM_VOID, - u8 DeltaThermalIndex, - u8 ThermalValue, - u8 Threshold - ); -#else -VOID -DoIQK_8814A( - PVOID pDM_VOID, - u8 DeltaThermalIndex, - u8 ThermalValue, - u8 Threshold - ); -#endif - -VOID -phy_iq_calibrate_8814a( - IN PVOID pDM_VOID, - boolean bReCovery - ); - -VOID -PHY_IQCalibrate_8814A_Init( - IN PVOID pDM_VOID - ); - - #endif /* #ifndef __PHYDM_IQK_8814A_H__*/ diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.c b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.c deleted file mode 100644 index b6491baf787874..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/halrf/rtl8821a/halrf_iqk_8821a_ce.c +++ /dev/null @@ -1,773 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2017 Realtek Corporation. - * - * 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 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. - * - *****************************************************************************/ - -#include "mp_precomp.h" -#include "../../phydm_precomp.h" - - - -/*---------------------------Define Local Constant---------------------------*/ -#define cal_num_8821A 3 -#define MACBB_REG_NUM_8821A 8 -#define AFE_REG_NUM_8821A 4 -#define RF_REG_NUM_8821A 3 -/*---------------------------Define Local Constant---------------------------*/ -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) -void do_iqk_8821a( - void *dm_void, - u8 delta_thermal_index, - u8 thermal_value, - u8 threshold -) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - dm->rf_calibrate_info.thermal_value_iqk = thermal_value; - halrf_iqk_trigger(dm, false); -} -#endif -void _iqk_rx_fill_iqc_8821a( - struct dm_struct *dm, - enum rf_path path, - unsigned int RX_X, - unsigned int RX_Y -) -{ - switch (path) { - case RF_PATH_A: - { - odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ - odm_set_bb_reg(dm, 0xc10, 0x000003ff, RX_X >> 1); - odm_set_bb_reg(dm, 0xc10, 0x03ff0000, (RX_Y >> 1) & 0x000003ff); - PHYDM_DBG(dm, DBG_COMP_MCC, "RX_X = %x;;RX_Y = %x ====>fill to IQC\n", RX_X >> 1, RX_Y >> 1); - PHYDM_DBG(dm, DBG_COMP_MCC, "0xc10 = %x ====>fill to IQC\n", odm_read_4byte(dm, 0xc10)); - } - break; - default: - break; - }; -} - -void _iqk_tx_fill_iqc_8821a( - struct dm_struct *dm, - enum rf_path path, - unsigned int TX_X, - unsigned int TX_Y -) -{ - switch (path) { - case RF_PATH_A: - { - odm_set_bb_reg(dm, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ - odm_write_4byte(dm, 0xc90, 0x00000080); - odm_write_4byte(dm, 0xcc4, 0x20040000); - odm_write_4byte(dm, 0xcc8, 0x20000000); - odm_set_bb_reg(dm, 0xccc, 0x000007ff, TX_Y); - odm_set_bb_reg(dm, 0xcd4, 0x000007ff, TX_X); - PHYDM_DBG(dm, DBG_COMP_MCC, "TX_X = %x;;TX_Y = %x =====> fill to IQC\n", TX_X, TX_Y); - PHYDM_DBG(dm, DBG_COMP_MCC, "0xcd4 = %x;;0xccc = %x ====>fill to IQC\n", odm_get_bb_reg(dm, 0xcd4, 0x000007ff), odm_get_bb_reg(dm, 0xccc, 0x000007ff)); - } - break; - default: - break; - }; -} - -void _iqk_backup_mac_bb_8821a( - struct dm_struct *dm, - u32 *MACBB_backup, - u32 *backup_macbb_reg, - u32 MACBB_NUM -) -{ - u32 i; - odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ - /* save MACBB default value */ - for (i = 0; i < MACBB_NUM; i++) - MACBB_backup[i] = odm_read_4byte(dm, backup_macbb_reg[i]); - - PHYDM_DBG(dm, DBG_COMP_MCC, "BackupMacBB Success!!!!\n"); -} - -void _iqk_backup_rf_8821a( - struct dm_struct *dm, - u32 *RFA_backup, - u32 *RFB_backup, - u32 *backup_rf_reg, - u32 RF_NUM -) -{ - - u32 i; - odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ - /* Save RF Parameters */ - for (i = 0; i < RF_NUM; i++) - RFA_backup[i] = odm_get_rf_reg(dm, RF_PATH_A, backup_rf_reg[i], MASKDWORD); - PHYDM_DBG(dm, DBG_COMP_MCC, "BackupRF Success!!!!\n"); -} - -void _iqk_backup_afe_8821a( - struct dm_struct *dm, - u32 *AFE_backup, - u32 *backup_afe_reg, - u32 AFE_NUM -) -{ - u32 i; - odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ - /* Save AFE Parameters */ - for (i = 0; i < AFE_NUM; i++) - AFE_backup[i] = odm_read_4byte(dm, backup_afe_reg[i]); - PHYDM_DBG(dm, DBG_COMP_MCC, "BackupAFE Success!!!!\n"); -} - -void _iqk_restore_mac_bb_8821a( - struct dm_struct *dm, - u32 *MACBB_backup, - u32 *backup_macbb_reg, - u32 MACBB_NUM -) -{ - u32 i; - odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ - /* Reload MacBB Parameters */ - for (i = 0; i < MACBB_NUM; i++) - odm_write_4byte(dm, backup_macbb_reg[i], MACBB_backup[i]); - PHYDM_DBG(dm, DBG_COMP_MCC, "RestoreMacBB Success!!!!\n"); -} - -void _iqk_restore_rf_8821a( - struct dm_struct *dm, - enum rf_path path, - u32 *backup_rf_reg, - u32 *RF_backup, - u32 RF_REG_NUM -) -{ - u32 i; - - odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ - for (i = 0; i < RF_REG_NUM; i++) - odm_set_rf_reg(dm, (enum rf_path)path, backup_rf_reg[i], RFREGOFFSETMASK, RF_backup[i]); - - switch (path) { - case RF_PATH_A: - { - PHYDM_DBG(dm, DBG_COMP_MCC, "RestoreRF path A Success!!!!\n"); - } - break; - default: - break; - } -} - -void _iqk_restore_afe_8821a( - struct dm_struct *dm, - u32 *AFE_backup, - u32 *backup_afe_reg, - u32 AFE_NUM -) -{ - u32 i; - odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ - /* Reload AFE Parameters */ - for (i = 0; i < AFE_NUM; i++) - odm_write_4byte(dm, backup_afe_reg[i], AFE_backup[i]); - odm_set_bb_reg(dm, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ - odm_write_4byte(dm, 0xc80, 0x0); - odm_write_4byte(dm, 0xc84, 0x0); - odm_write_4byte(dm, 0xc88, 0x0); - odm_write_4byte(dm, 0xc8c, 0x3c000000); - odm_write_4byte(dm, 0xc90, 0x00000080); - odm_write_4byte(dm, 0xc94, 0x00000000); - odm_write_4byte(dm, 0xcc4, 0x20040000); - odm_write_4byte(dm, 0xcc8, 0x20000000); - odm_write_4byte(dm, 0xcb8, 0x0); - PHYDM_DBG(dm, DBG_COMP_MCC, "RestoreAFE Success!!!!\n"); -} - -void _iqk_configure_mac_8821a( - struct dm_struct *dm -) -{ - /* ========MAC register setting======== */ - odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ - odm_write_1byte(dm, 0x522, 0x3f); - odm_set_bb_reg(dm, 0x550, BIT(11) | BIT(3), 0x0); - odm_write_1byte(dm, 0x808, 0x00); /* RX ante off */ - odm_set_bb_reg(dm, 0x838, 0xf, 0xc); /* CCA off */ - odm_write_1byte(dm, 0xa07, 0xf); /* CCK RX path off */ -} - -void _iqk_tx_8821a( - struct dm_struct *dm, - enum rf_path path -) -{ - u32 TX_fail, RX_fail, delay_count, IQK_ready, cal_retry, cal = 0; - int TX_X = 0, TX_Y = 0, RX_X = 0, RX_Y = 0, tx_average = 0, rx_average = 0, rx_iqk_loop = 0, RX_X_temp = 0, RX_Y_temp = 0; - int TX_X0[cal_num_8821A], TX_Y0[cal_num_8821A], RX_X0[2][cal_num_8821A], RX_Y0[2][cal_num_8821A]; - boolean TX0IQKOK = false, RX0IQKOK = false; - boolean VDF_enable = false; - int i, k, VDF_Y[3], VDF_X[3], tx_dt[3], ii, dx = 0, dy = 0, TX_finish = 0, RX_finish1 = 0, RX_finish2 = 0; - - PHYDM_DBG(dm, DBG_COMP_MCC, "band_width = %d, support_interface = %d, ext_pa = %d, ext_pa_5g = %d\n", *dm->band_width, dm->support_interface, dm->ext_pa, dm->ext_pa_5g); - if (*dm->band_width == 2) - VDF_enable = true; - - while (cal < cal_num_8821A) { - switch (path) { - case RF_PATH_A: - { - /* path-A LOK */ - odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ - /* ========path-A AFE all on======== */ - /* Port 0 DAC/ADC on */ - odm_write_4byte(dm, 0xc60, 0x77777777); - odm_write_4byte(dm, 0xc64, 0x77777777); - - odm_write_4byte(dm, 0xc68, 0x19791979); - - odm_set_bb_reg(dm, 0xc00, 0xf, 0x4);/* hardware 3-wire off */ - - /* LOK setting */ - /* ====== LOK ====== */ - /* 1. DAC/ADC sampling rate (160 MHz) */ - odm_set_bb_reg(dm, 0xc5c, BIT(26) | BIT(25) | BIT(24), 0x7); - - /* 2. LoK RF setting (at BW = 20M) */ - odm_set_rf_reg(dm, (enum rf_path)path, 0xef, RFREGOFFSETMASK, 0x80002); - odm_set_rf_reg(dm, (enum rf_path)path, 0x18, 0x00c00, 0x3); - odm_set_rf_reg(dm, (enum rf_path)path, 0x30, RFREGOFFSETMASK, 0x20000); - odm_set_rf_reg(dm, (enum rf_path)path, 0x31, RFREGOFFSETMASK, 0x0003f); - - if (dm->rf_calibrate_info.is_iqk_pa_off == 1) - odm_set_rf_reg(dm, (enum rf_path)path, 0x32, RFREGOFFSETMASK, 0xf3ec3); - else - odm_set_rf_reg(dm, (enum rf_path)path, 0x32, RFREGOFFSETMASK, 0xf3fc3); - - odm_set_rf_reg(dm, (enum rf_path)path, 0x65, RFREGOFFSETMASK, 0x931d5); - odm_set_rf_reg(dm, (enum rf_path)path, 0x8f, RFREGOFFSETMASK, 0x8a001); - odm_write_4byte(dm, 0x90c, 0x00008000); - odm_set_bb_reg(dm, 0xc94, BIT(0), 0x1); - odm_write_4byte(dm, 0x978, 0x29002000);/* TX (X,Y) */ - odm_write_4byte(dm, 0x97c, 0xa9002000);/* RX (X,Y) */ - odm_write_4byte(dm, 0x984, 0x00462910);/* [0]:AGC_en, [15]:idac_K_Mask */ - - odm_set_bb_reg(dm, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ - - if (dm->ext_pa_5g) - odm_write_4byte(dm, 0xc88, 0x821403f7); - else - odm_write_4byte(dm, 0xc88, 0x821403f4); - - if (*dm->band_type == ODM_BAND_5G) - odm_write_4byte(dm, 0xc8c, 0x68163e96); - else - odm_write_4byte(dm, 0xc8c, 0x28163e96); - - odm_write_4byte(dm, 0xc80, 0x18008c10);/* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ - odm_write_4byte(dm, 0xc84, 0x38008c10);/* RX_Tone_idx[9:0], RxK_Mask[29] */ - odm_write_4byte(dm, 0xcb8, 0x00100000);/* cb8[20]iqk_dpk module */ - odm_write_4byte(dm, 0x980, 0xfa000000); - odm_write_4byte(dm, 0x980, 0xf8000000); - - ODM_delay_ms(10); /* delay 10ms */ - odm_write_4byte(dm, 0xcb8, 0x00000000); - - odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ - odm_set_rf_reg(dm, (enum rf_path)path, 0x58, 0x7fe00, odm_get_rf_reg(dm, (enum rf_path)path, 0x8, 0xffc00)); - switch (*dm->band_width) { - case 1: - { - odm_set_rf_reg(dm, (enum rf_path)path, 0x18, 0x00c00, 0x1); - } - break; - case 2: - { - odm_set_rf_reg(dm, (enum rf_path)path, 0x18, 0x00c00, 0x0); - } - break; - default: - break; - } - odm_set_bb_reg(dm, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ - - /* 3. TX RF setting */ - odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ - odm_set_rf_reg(dm, (enum rf_path)path, 0xef, RFREGOFFSETMASK, 0x80000); - odm_set_rf_reg(dm, (enum rf_path)path, 0x30, RFREGOFFSETMASK, 0x20000); - odm_set_rf_reg(dm, (enum rf_path)path, 0x31, RFREGOFFSETMASK, 0x0003f); - - if (dm->rf_calibrate_info.is_iqk_pa_off == 1) - odm_set_rf_reg(dm, (enum rf_path)path, 0x32, RFREGOFFSETMASK, 0xf3ec3); - else - odm_set_rf_reg(dm, (enum rf_path)path, 0x32, RFREGOFFSETMASK, 0xf3fc3); - - odm_set_rf_reg(dm, (enum rf_path)path, 0x65, RFREGOFFSETMASK, 0x931d5); - odm_set_rf_reg(dm, (enum rf_path)path, 0x8f, RFREGOFFSETMASK, 0x8a001); - odm_set_rf_reg(dm, (enum rf_path)path, 0xef, RFREGOFFSETMASK, 0x00000); - odm_write_4byte(dm, 0x90c, 0x00008000); - odm_set_bb_reg(dm, 0xc94, BIT(0), 0x1); - odm_write_4byte(dm, 0x978, 0x29002000);/* TX (X,Y) */ - odm_write_4byte(dm, 0x97c, 0xa9002000);/* RX (X,Y) */ - odm_write_4byte(dm, 0x984, 0x0046a910);/* [0]:AGC_en, [15]:idac_K_Mask */ - - odm_set_bb_reg(dm, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ - - if (dm->ext_pa_5g) - odm_write_4byte(dm, 0xc88, 0x821403f7); - else - odm_write_4byte(dm, 0xc88, 0x821403e3); - - if (*dm->band_type == ODM_BAND_5G) - odm_write_4byte(dm, 0xc8c, 0x40163e96); - else - odm_write_4byte(dm, 0xc8c, 0x00163e96); - - if (VDF_enable == 1) { - for (k = 0; k <= 2; k++) { - switch (k) { - case 0: - { - odm_write_4byte(dm, 0xc80, 0x18008c38);/* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ - odm_write_4byte(dm, 0xc84, 0x38008c38);/* RX_Tone_idx[9:0], RxK_Mask[29] */ - odm_set_bb_reg(dm, 0xce8, BIT(31), 0x0); - } - break; - case 1: - { - odm_set_bb_reg(dm, 0xc80, BIT(28), 0x0); - odm_set_bb_reg(dm, 0xc84, BIT(28), 0x0); - odm_set_bb_reg(dm, 0xce8, BIT(31), 0x0); - } - break; - case 2: - { - PHYDM_DBG(dm, DBG_COMP_MCC, "VDF_Y[1] = %x;;;VDF_Y[0] = %x\n", VDF_Y[1] >> 21 & 0x00007ff, VDF_Y[0] >> 21 & 0x00007ff); - PHYDM_DBG(dm, DBG_COMP_MCC, "VDF_X[1] = %x;;;VDF_X[0] = %x\n", VDF_X[1] >> 21 & 0x00007ff, VDF_X[0] >> 21 & 0x00007ff); - tx_dt[cal] = (VDF_Y[1] >> 20) - (VDF_Y[0] >> 20); - tx_dt[cal] = ((16 * tx_dt[cal]) * 10000 / 15708); - tx_dt[cal] = (tx_dt[cal] >> 1) + (tx_dt[cal] & BIT(0)); - odm_write_4byte(dm, 0xc80, 0x18008c20);/* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ - odm_write_4byte(dm, 0xc84, 0x38008c20);/* RX_Tone_idx[9:0], RxK_Mask[29] */ - odm_set_bb_reg(dm, 0xce8, BIT(31), 0x1); - odm_set_bb_reg(dm, 0xce8, 0x3fff0000, tx_dt[cal] & 0x00003fff); - } - break; - } - odm_write_4byte(dm, 0xcb8, 0x00100000);/* cb8[20] iqk_dpk module */ - cal_retry = 0; - while (1) { - /* one shot */ - odm_write_4byte(dm, 0x980, 0xfa000000); - odm_write_4byte(dm, 0x980, 0xf8000000); - - ODM_delay_ms(10); /* delay 10ms */ - odm_write_4byte(dm, 0xcb8, 0x00000000); - delay_count = 0; - while (1) { - IQK_ready = odm_get_bb_reg(dm, 0xd00, BIT(10)); - if ((~IQK_ready) || (delay_count > 20)) - break; - else { - ODM_delay_ms(1); - delay_count++; - } - } - - if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */ - /* ============TXIQK Check============== */ - TX_fail = odm_get_bb_reg(dm, 0xd00, BIT(12)); - - if (~TX_fail) { - odm_write_4byte(dm, 0xcb8, 0x02000000); - VDF_X[k] = odm_get_bb_reg(dm, 0xd00, 0x07ff0000) << 21; - odm_write_4byte(dm, 0xcb8, 0x04000000); - VDF_Y[k] = odm_get_bb_reg(dm, 0xd00, 0x07ff0000) << 21; - TX0IQKOK = true; - break; - } else { - odm_set_bb_reg(dm, 0xccc, 0x000007ff, 0x0); - odm_set_bb_reg(dm, 0xcd4, 0x000007ff, 0x200); - TX0IQKOK = false; - cal_retry++; - if (cal_retry == 10) - break; - } - } else { - TX0IQKOK = false; - cal_retry++; - if (cal_retry == 10) - break; - } - } - } - if (k == 3) { - TX_X0[cal] = VDF_X[k - 1] ; - TX_Y0[cal] = VDF_Y[k - 1]; - } - } else { - odm_write_4byte(dm, 0xc80, 0x18008c10);/* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ - odm_write_4byte(dm, 0xc84, 0x38008c10);/* RX_Tone_idx[9:0], RxK_Mask[29] */ - odm_write_4byte(dm, 0xcb8, 0x00100000);/* cb8[20] iqk_dpk module */ - cal_retry = 0; - while (1) { - /* one shot */ - odm_write_4byte(dm, 0x980, 0xfa000000); - odm_write_4byte(dm, 0x980, 0xf8000000); - - ODM_delay_ms(10); /* delay 10ms */ - odm_write_4byte(dm, 0xcb8, 0x00000000); - delay_count = 0; - while (1) { - IQK_ready = odm_get_bb_reg(dm, 0xd00, BIT(10)); - if ((~IQK_ready) || (delay_count > 20)) - break; - else { - ODM_delay_ms(1); - delay_count++; - } - } - - if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */ - /* ============TXIQK Check============== */ - TX_fail = odm_get_bb_reg(dm, 0xd00, BIT(12)); - - if (~TX_fail) { - odm_write_4byte(dm, 0xcb8, 0x02000000); - TX_X0[cal] = odm_get_bb_reg(dm, 0xd00, 0x07ff0000) << 21; - odm_write_4byte(dm, 0xcb8, 0x04000000); - TX_Y0[cal] = odm_get_bb_reg(dm, 0xd00, 0x07ff0000) << 21; - TX0IQKOK = true; - break; - } else { - odm_set_bb_reg(dm, 0xccc, 0x000007ff, 0x0); - odm_set_bb_reg(dm, 0xcd4, 0x000007ff, 0x200); - TX0IQKOK = false; - cal_retry++; - if (cal_retry == 10) - break; - } - } else { - TX0IQKOK = false; - cal_retry++; - if (cal_retry == 10) - break; - } - } - } - - if (TX0IQKOK == false) - break; /* TXK fail, Don't do RXK */ - - /* ====== RX IQK ====== */ - odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ - /* 1. RX RF setting */ - odm_set_rf_reg(dm, (enum rf_path)path, 0xef, RFREGOFFSETMASK, 0x80000); - odm_set_rf_reg(dm, (enum rf_path)path, 0x30, RFREGOFFSETMASK, 0x30000); - odm_set_rf_reg(dm, (enum rf_path)path, 0x31, RFREGOFFSETMASK, 0x0002f); - odm_set_rf_reg(dm, (enum rf_path)path, 0x32, RFREGOFFSETMASK, 0xfffbb); - odm_set_rf_reg(dm, (enum rf_path)path, 0x8f, RFREGOFFSETMASK, 0x88001); - odm_set_rf_reg(dm, (enum rf_path)path, 0x65, RFREGOFFSETMASK, 0x931d8); - odm_set_rf_reg(dm, (enum rf_path)path, 0xef, RFREGOFFSETMASK, 0x00000); - - odm_set_bb_reg(dm, 0x978, 0x03FF8000, (TX_X0[cal]) >> 21 & 0x000007ff); - odm_set_bb_reg(dm, 0x978, 0x000007FF, (TX_Y0[cal]) >> 21 & 0x000007ff); - odm_set_bb_reg(dm, 0x978, BIT(31), 0x1); - odm_set_bb_reg(dm, 0x97c, BIT(31), 0x0); - odm_write_4byte(dm, 0x90c, 0x00008000); - odm_write_4byte(dm, 0x984, 0x0046a911); - - odm_set_bb_reg(dm, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ - odm_write_4byte(dm, 0xc80, 0x38008c10);/* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ - odm_write_4byte(dm, 0xc84, 0x18008c10);/* RX_Tone_idx[9:0], RxK_Mask[29] */ - odm_write_4byte(dm, 0xc88, 0x02140119); - - if (dm->support_interface == 1) { - rx_iqk_loop = 2; /* for 2% fail; */ - } else - rx_iqk_loop = 1; - for (i = 0; i < rx_iqk_loop; i++) { - if (dm->support_interface == 1) - if (i == 0) - odm_write_4byte(dm, 0xc8c, 0x28161100); /* Good */ - else - odm_write_4byte(dm, 0xc8c, 0x28160d00); - else - odm_write_4byte(dm, 0xc8c, 0x28160d00); - - odm_write_4byte(dm, 0xcb8, 0x00100000);/* cb8[20] iqk_dpk module */ - - cal_retry = 0; - while (1) { - /* one shot */ - odm_write_4byte(dm, 0x980, 0xfa000000); - odm_write_4byte(dm, 0x980, 0xf8000000); - - ODM_delay_ms(10); /* delay 10ms */ - odm_write_4byte(dm, 0xcb8, 0x00000000); - delay_count = 0; - while (1) { - IQK_ready = odm_get_bb_reg(dm, 0xd00, BIT(10)); - if ((~IQK_ready) || (delay_count > 20)) - break; - else { - ODM_delay_ms(1); - delay_count++; - } - } - - if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */ - /* ============RXIQK Check============== */ - RX_fail = odm_get_bb_reg(dm, 0xd00, BIT(11)); - if (RX_fail == 0) { - /* - dbg_print("====== RXIQK (%d) ======", i); - odm_write_4byte(dm, 0xcb8, 0x05000000); - reg1 = odm_get_bb_reg(dm, 0xd00, 0xffffffff); - odm_write_4byte(dm, 0xcb8, 0x06000000); - reg2 = odm_get_bb_reg(dm, 0xd00, 0x0000001f); - dbg_print("reg1 = %d, reg2 = %d", reg1, reg2); - image_power = (reg2<<32)+reg1; - dbg_print("Before PW = %d\n", image_power); - odm_write_4byte(dm, 0xcb8, 0x07000000); - reg1 = odm_get_bb_reg(dm, 0xd00, 0xffffffff); - odm_write_4byte(dm, 0xcb8, 0x08000000); - reg2 = odm_get_bb_reg(dm, 0xd00, 0x0000001f); - image_power = (reg2<<32)+reg1; - dbg_print("After PW = %d\n", image_power); - */ - - odm_write_4byte(dm, 0xcb8, 0x06000000); - RX_X0[i][cal] = odm_get_bb_reg(dm, 0xd00, 0x07ff0000) << 21; - odm_write_4byte(dm, 0xcb8, 0x08000000); - RX_Y0[i][cal] = odm_get_bb_reg(dm, 0xd00, 0x07ff0000) << 21; - RX0IQKOK = true; - break; - } else { - odm_set_bb_reg(dm, 0xc10, 0x000003ff, 0x200 >> 1); - odm_set_bb_reg(dm, 0xc10, 0x03ff0000, 0x0 >> 1); - RX0IQKOK = false; - cal_retry++; - if (cal_retry == 10) - break; - - } - } else { - RX0IQKOK = false; - cal_retry++; - if (cal_retry == 10) - break; - } - } - } - - if (TX0IQKOK) - tx_average++; - if (RX0IQKOK) - rx_average++; - } - break; - default: - break; - } - cal++; - } - /* FillIQK Result */ - switch (path) { - case RF_PATH_A: - { - PHYDM_DBG(dm, DBG_COMP_MCC, "========Path_A =======\n"); - if (tx_average == 0) - break; - - for (i = 0; i < tx_average; i++) - PHYDM_DBG(dm, DBG_COMP_MCC, "TX_X0[%d] = %x ;; TX_Y0[%d] = %x\n", i, (TX_X0[i]) >> 21 & 0x000007ff, i, (TX_Y0[i]) >> 21 & 0x000007ff); - for (i = 0; i < tx_average; i++) { - for (ii = i + 1; ii < tx_average; ii++) { - dx = (TX_X0[i] >> 21) - (TX_X0[ii] >> 21); - if (dx < 3 && dx > -3) { - dy = (TX_Y0[i] >> 21) - (TX_Y0[ii] >> 21); - if (dy < 3 && dy > -3) { - TX_X = ((TX_X0[i] >> 21) + (TX_X0[ii] >> 21)) / 2; - TX_Y = ((TX_Y0[i] >> 21) + (TX_Y0[ii] >> 21)) / 2; - TX_finish = 1; - break; - } - } - } - if (TX_finish == 1) - break; - } - - if (TX_finish == 1) - _iqk_tx_fill_iqc_8821a(dm, path, TX_X, TX_Y); - else - _iqk_tx_fill_iqc_8821a(dm, path, 0x200, 0x0); - - if (rx_average == 0) - break; - - for (i = 0; i < rx_average; i++) { - PHYDM_DBG(dm, DBG_COMP_MCC, "RX_X0[0][%d] = %x ;; RX_Y0[0][%d] = %x\n", i, (RX_X0[0][i]) >> 21 & 0x000007ff, i, (RX_Y0[0][i]) >> 21 & 0x000007ff); - if (rx_iqk_loop == 2) { - PHYDM_DBG(dm, DBG_COMP_MCC, "RX_X0[1][%d] = %x ;; RX_Y0[1][%d] = %x\n", i, (RX_X0[1][i]) >> 21 & 0x000007ff, i, (RX_Y0[1][i]) >> 21 & 0x000007ff); - } - } - for (i = 0; i < rx_average; i++) { - for (ii = i + 1; ii < rx_average; ii++) { - dx = (RX_X0[0][i] >> 21) - (RX_X0[0][ii] >> 21); - if (dx < 4 && dx > -4) { - dy = (RX_Y0[0][i] >> 21) - (RX_Y0[0][ii] >> 21); - if (dy < 4 && dy > -4) { - RX_X_temp = ((RX_X0[0][i] >> 21) + (RX_X0[0][ii] >> 21)) / 2; - RX_Y_temp = ((RX_Y0[0][i] >> 21) + (RX_Y0[0][ii] >> 21)) / 2; - RX_finish1 = 1; - break; - } - } - } - if (RX_finish1 == 1) { - RX_X = RX_X_temp; - RX_Y = RX_Y_temp; - break; - } - } - if (rx_iqk_loop == 2) { - for (i = 0; i < rx_average; i++) { - for (ii = i + 1; ii < rx_average; ii++) { - dx = (RX_X0[1][i] >> 21) - (RX_X0[1][ii] >> 21); - if (dx < 4 && dx > -4) { - dy = (RX_Y0[1][i] >> 21) - (RX_Y0[1][ii] >> 21); - if (dy < 4 && dy > -4) { - RX_X = ((RX_X0[1][i] >> 21) + (RX_X0[1][ii] >> 21)) / 2; - RX_Y = ((RX_Y0[1][i] >> 21) + (RX_Y0[1][ii] >> 21)) / 2; - RX_finish2 = 1; - break; - } - } - } - if (RX_finish2 == 1) - break; - } - if (RX_finish1 && RX_finish2) { - RX_X = (RX_X + RX_X_temp) / 2; - RX_Y = (RX_Y + RX_Y_temp) / 2; - } - } - if (RX_finish1 || RX_finish2) - _iqk_rx_fill_iqc_8821a(dm, path, RX_X, RX_Y); - else - _iqk_rx_fill_iqc_8821a(dm, path, 0x200, 0x0); - } - break; - default: - break; - } -} - -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) -void -_phy_iq_calibrate_by_fw_8821a( - struct dm_struct *dm -) -{ - - u8 iqk_cmd[3] = { *dm->channel, 0x0, 0x0}; - u8 buf1 = 0x0; - u8 buf2 = 0x0; - PHYDM_DBG(dm, DBG_COMP_MCC, "channel: %d\n", *dm->channel); - - - /* Byte 2, Bit 4 ~ Bit 5 : band_type */ - if (*dm->band_type == ODM_BAND_5G) - buf1 = 0x2 << 4; - else - buf1 = 0x1 << 4; - - /* Byte 2, Bit 0 ~ Bit 3 : bandwidth */ - if (*dm->band_width == CHANNEL_WIDTH_20) - buf2 = 0x1; - else if (*dm->band_width == CHANNEL_WIDTH_40) - buf2 = 0x1 << 1; - else if (*dm->band_width == CHANNEL_WIDTH_80) - buf2 = 0x1 << 2; - else - buf2 = 0x1 << 3; - - iqk_cmd[1] = buf1 | buf2; - iqk_cmd[2] = dm->ext_pa_5g | dm->ext_lna_5g << 1; - - odm_fill_h2c_cmd(dm, ODM_H2C_IQ_CALIBRATION, 3, iqk_cmd); -} -#endif - -void -_phy_iq_calibrate_8821a( - struct dm_struct *dm -) -{ - u32 MACBB_backup[MACBB_REG_NUM_8821A], AFE_backup[AFE_REG_NUM_8821A], RFA_backup[RF_REG_NUM_8821A], RFB_backup[RF_REG_NUM_8821A]; - u32 backup_macbb_reg[MACBB_REG_NUM_8821A] = {0x520, 0x550, 0x808, 0xa04, 0x90c, 0xc00, 0x838, 0x82c}; - u32 backup_afe_reg[AFE_REG_NUM_8821A] = {0xc5c, 0xc60, 0xc64, 0xc68}; - u32 backup_rf_reg[RF_REG_NUM_8821A] = {0x65, 0x8f, 0x0}; - - _iqk_backup_mac_bb_8821a(dm, MACBB_backup, backup_macbb_reg, MACBB_REG_NUM_8821A); - _iqk_backup_afe_8821a(dm, AFE_backup, backup_afe_reg, AFE_REG_NUM_8821A); - _iqk_backup_rf_8821a(dm, RFA_backup, RFB_backup, backup_rf_reg, RF_REG_NUM_8821A); - - _iqk_configure_mac_8821a(dm); - _iqk_tx_8821a(dm, RF_PATH_A); - - _iqk_restore_rf_8821a(dm, RF_PATH_A, backup_rf_reg, RFA_backup, RF_REG_NUM_8821A); - _iqk_restore_afe_8821a(dm, AFE_backup, backup_afe_reg, AFE_REG_NUM_8821A); - _iqk_restore_mac_bb_8821a(dm, MACBB_backup, backup_macbb_reg, MACBB_REG_NUM_8821A); -} - -void -phy_reset_iqk_result_8821a( - struct dm_struct *dm -) -{ - odm_set_bb_reg(dm, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ - odm_set_bb_reg(dm, 0xccc, 0x000007ff, 0x0); - odm_set_bb_reg(dm, 0xcd4, 0x000007ff, 0x200); - odm_write_4byte(dm, 0xce8, 0x0); - odm_set_bb_reg(dm, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ - odm_set_bb_reg(dm, 0xc10, 0x000003ff, 0x100); -} - - -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) -/*IQK: 0x1*/ -void -phy_iq_calibrate_8821a( - void *dm_void, - boolean is_recovery -) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - u32 counter = 0; - - if ((dm->fw_offload_ability & PHYDM_RF_IQK_OFFLOAD) && !(*(dm->mp_mode))) { - _phy_iq_calibrate_by_fw_8821a(dm); - phydm_iqk_wait(dm, 500); - if (dm->rf_calibrate_info.is_iqk_in_progress) { - PHYDM_DBG(dm, DBG_COMP_MCC, "== FW IQK TIMEOUT (Still in progress after 500ms) ==\n"); - } - } else - _phy_iq_calibrate_8821a(dm); -} -#endif diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/phydm_adc_sampling.c b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/phydm_adc_sampling.c deleted file mode 100644 index d2278560ebd958..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/phydm_adc_sampling.c +++ /dev/null @@ -1,1291 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2017 Realtek Corporation. - * - * 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 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. - * - * The full GNU General Public License is included in this distribution in the - * file called LICENSE. - * - * Contact Information: - * wlanfae - * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park, - * Hsinchu 300, Taiwan. - * - * Larry Finger - * - *****************************************************************************/ - -#include "mp_precomp.h" -#include "phydm_precomp.h" - -#if (PHYDM_LA_MODE_SUPPORT) - -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) -#if (RTL8197F_SUPPORT || RTL8822B_SUPPORT || RTL8192F_SUPPORT) -#include "rtl8197f/Hal8197FPhyReg.h" -#include "WlanHAL/HalMac88XX/halmac_reg2.h" -#else -#include "WlanHAL/HalHeader/HalComReg.h" -#endif -#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN) -#if WPP_SOFTWARE_TRACE -#include "phydm_adc_sampling.tmh" -#endif -#endif - -#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE | ODM_AP)) -boolean -phydm_la_buffer_allocate(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct rt_adcsmp *smp = &dm->adcsmp; - #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) - void *adapter = dm->adapter; - #endif - struct rt_adcsmp_string *buf = &smp->adc_smp_buf; - boolean ret = true; - - pr_debug("[LA mode BufferAllocate]\n"); - - if (buf->length == 0) { - #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) - if (PlatformAllocateMemoryWithZero(adapter, (void **)& - buf->octet, - buf->buffer_size) != - RT_STATUS_SUCCESS) - ret = false; - #else - odm_allocate_memory(dm, (void **)&buf->octet, buf->buffer_size); - - if (!buf->octet) - ret = false; - #endif - - if (ret) - buf->length = buf->buffer_size; - } - - return ret; -} -#endif - -void phydm_la_get_tx_pkt_buf(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct rt_adcsmp *smp = &dm->adcsmp; - struct rt_adcsmp_string *buf = &smp->adc_smp_buf; - u32 i = 0, value32 = 0, data_l = 0, data_h = 0; - u32 addr = 0, finish_addr = 0; - boolean is_round_up = false; - static u32 page = 0xFF; - u32 smp_cnt = 0, smp_number = 10, addr_8byte = 0; - #if (DM_ODM_SUPPORT_TYPE & ODM_AP) - #if (RTL8197F_SUPPORT || RTL8198F_SUPPORT) - u8 backup_dma = 0; - #endif - #endif - - odm_memory_set(dm, buf->octet, 0, buf->length); - pr_debug("GetTxPktBuf\n"); - - if (dm->support_ic_type & ODM_RTL8192F) { - value32 = odm_read_4byte(dm, R_0x7f0); - is_round_up = (boolean)((value32 & BIT(31)) >> 31); - /*Reg7F0[30:15]: finish addr (unit: 8byte)*/ - finish_addr = (value32 & 0x7FFF8000) >> 15; - } else { - odm_write_1byte(dm, R_0x0106, 0x69); - value32 = odm_read_4byte(dm, R_0x7c0); - is_round_up = (boolean)((value32 & BIT(31)) >> 31); - /*Reg7C0[30:16]: finish addr (unit: 8byte)*/ - if (dm->support_ic_type & (ODM_RTL8822B | ODM_RTL8822C | - ODM_RTL8821C | ODM_RTL8814A | ODM_RTL8814B | ODM_RTL8812F | - ODM_RTL8195B)) - finish_addr = (value32 & 0x7FFF0000) >> 16; - /*Reg7C0[30:15]: finish addr (unit: 8byte)*/ - else if (dm->support_ic_type & (ODM_RTL8198F | ODM_RTL8197F)) - finish_addr = (value32 & 0x7FFF8000) >> 15; - } - - #if (DM_ODM_SUPPORT_TYPE & ODM_AP) - #if (RTL8197F_SUPPORT || RTL8198F_SUPPORT) - if (dm->support_ic_type & (ODM_RTL8197F | ODM_RTL8198F)) { - pr_debug("98F GetTxPktBuf from iMEM\n"); - odm_set_bb_reg(dm, R_0x7c0, BIT(0), 0x0); - - /*Stop DMA*/ - backup_dma = odm_get_mac_reg(dm, R_0x300, MASKLWORD); - odm_set_mac_reg(dm, R_0x300, 0x7fff, 0x7fff); - - /*@move LA mode content from IMEM to TxPktBuffer - Source : OCPBASE_IMEM 0x00000000 - Destination : OCPBASE_TXBUF 0x18780000 - Length : 64K*/ - GET_HAL_INTERFACE(dm->priv)->init_ddma_handler(dm->priv, - OCPBASE_IMEM, - OCPBASE_TXBUF - + buf->start_pos, - 0x10000); - } - #endif - #endif - - pr_debug("start_addr = ((0x%x)), end_addr = ((0x%x)), buffer_size = ((0x%x))\n", - buf->start_pos, buf->end_pos, buf->buffer_size); - if (is_round_up) { - pr_debug("buf_start(0x%x)|----2---->|finish_addr(0x%x)|----1---->|buf_end(0x%x)\n", - buf->start_pos, finish_addr << 3, buf->end_pos); - addr = (finish_addr + 1) << 3; - pr_debug("is_round_up = ((%d)), finish_addr=((0x%x)), 0x7c0/0x7F0=((0x%x))\n", - is_round_up, finish_addr, value32); - /*@Byte to 8Byte (64bit)*/ - smp_number = (buf->buffer_size) >> 3; - } else { - pr_debug("buf_start(0x%x)|------->|finish_addr(0x%x) |buf_end(0x%x)\n", - buf->start_pos, finish_addr << 3, buf->end_pos); - addr = buf->start_pos; - addr_8byte = addr >> 3; - - if (addr_8byte > finish_addr) - smp_number = addr_8byte - finish_addr; - else - smp_number = finish_addr - addr_8byte; - - pr_debug("is_round_up = ((%d)), finish_addr=((0x%x * 8Byte)), Start_Addr = ((0x%x * 8Byte)), smp_number = ((%d))\n", - is_round_up, finish_addr, addr_8byte, smp_number); - } - #if 0 - dbg_print("is_round_up = %d, finish_addr=0x%x, value32=0x%x\n", - is_round_up, finish_addr, value32); - dbg_print( - "end_addr = %x, buf->start_pos = 0x%x, buf->buffer_size = 0x%x\n", - end_addr, buf->start_pos, buf->buffer_size); - #endif - - #if (RTL8197F_SUPPORT || RTL8198F_SUPPORT || RTL8814B_SUPPORT) - if (dm->support_ic_type & - (ODM_RTL8197F | ODM_RTL8198F | ODM_RTL8814B)) { - for (addr = buf->start_pos, i = 0; addr < buf->end_pos; - addr += 8, i += 2) { - if ((addr & 0xfff) == 0) - odm_set_bb_reg(dm, R_0x0140, MASKLWORD, 0x780 + - (addr >> 12)); - data_l = odm_get_bb_reg(dm, 0x8000 + (addr & 0xfff), - MASKDWORD); - data_h = odm_get_bb_reg(dm, 0x8000 + (addr & 0xfff) + - 4, MASKDWORD); - buf->octet[i] = data_h; - buf->octet[i + 1] = data_l; - - if (smp->is_la_print) - pr_debug("%08x%08x\n", data_h, data_l); - } - } else - #endif - { - for (i = 0; smp_cnt < smp_number; smp_cnt++, i += 2) { - if (dm->support_ic_type & ODM_RTL8192F) { - #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) - indirect_access_sdram_8192f(dm->adapter, - TX_PACKET_BUFFER, - TRUE, - (u16)addr >> 3, 0, - &data_h, &data_l); - #else - odm_write_1byte(dm, R_0x0106, 0x69); - odm_set_bb_reg(dm, R_0x0140, MASKDWORD, addr >> 3); - data_l = odm_get_bb_reg(dm, R_0x0144, MASKDWORD); - data_h = odm_get_bb_reg(dm, R_0x0148, MASKDWORD); - odm_write_1byte(dm, R_0x0106, 0x0); - #endif - - } else { - if (page != (addr >> 12)) { - /* Reg140=0x780+(addr>>12), - * addr=0x30~0x3F, total 16 pages - */ - page = addr >> 12; - } - odm_set_bb_reg(dm, R_0x0140, MASKLWORD, 0x780 + - page); - - /*pDataL = 0x8000+(addr&0xfff);*/ - data_l = odm_get_bb_reg(dm, 0x8000 + (addr & - 0xfff), MASKDWORD); - data_h = odm_get_bb_reg(dm, 0x8000 + (addr & - 0xfff) + 4, MASKDWORD); - } - #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE)) - buf->octet[i] = data_h; - buf->octet[i + 1] = data_l; - #endif - if (smp->is_la_print) { - #if DBG /*WIN driver check build*/ - pr_debug("%08x%08x\n", data_h, data_l); - #else /*WIN driver free build*/ - #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) - RT_TRACE_EX(COMP_LA_MODE, DBG_LOUD, - ("%08x%08x\n", buf->octet[i], - buf->octet[i + 1])); - #elif (DM_ODM_SUPPORT_TYPE & ODM_IOT) - pr_debug("%08x%08x\n", data_h, data_l); - #endif - #endif - } - if ((addr + 8) > buf->end_pos) - addr = buf->start_pos; - else - addr = addr + 8; - } - pr_debug("smp_cnt = ((%d))\n", smp_cnt); - - #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) - RT_TRACE_EX(COMP_LA_MODE, DBG_LOUD, - ("smp_cnt = ((%d))\n", smp_cnt)); - #endif - } - #if (DM_ODM_SUPPORT_TYPE & ODM_AP) - #if (RTL8197F_SUPPORT) - if (dm->support_ic_type & ODM_RTL8197F) - odm_set_mac_reg(dm, R_0x300, 0x7fff, backup_dma);/*Resume DMA*/ - #endif - #endif -} - -void phydm_la_mode_set_mac_iq_dump(void *dm_void, boolean en_fake_trig) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct rt_adcsmp *smp = &dm->adcsmp; - u32 reg_value = 0; - u32 reg1 = 0, reg2 = 0, reg3 = 0; - - if (dm->support_ic_type & ODM_RTL8192F) { - reg1 = R_0x7f0; - reg2 = R_0x7f4; - reg3 = R_0x7f8; - } else { - reg1 = R_0x7c0; - reg2 = R_0x7c4; - reg3 = R_0x7c8; - } - - odm_write_1byte(dm, reg1, 0); /*@clear all reg1*/ - /*@Enable LA mode HW block*/ - odm_set_mac_reg(dm, reg1, BIT(0), 1); - - if (smp->la_trig_mode == PHYDM_MAC_TRIG) { - smp->is_bb_trigger = 0; - /*polling bit for MAC mode*/ - odm_set_mac_reg(dm, reg1, BIT(2), 1); - /*trigger mode for MAC*/ - odm_set_mac_reg(dm, reg1, BIT(4) | BIT(3), - smp->la_trigger_edge); - pr_debug("[MAC_trig] ref_mask = ((0x%x)), ref_value = ((0x%x)), dbg_port = ((0x%x))\n", - smp->la_mac_mask_or_hdr_sel, smp->la_trig_sig_sel, - smp->la_dbg_port); - /*@[Set MAC Debug Port]*/ - odm_set_mac_reg(dm, R_0xf4, BIT(16), 1); - odm_set_mac_reg(dm, R_0x38, 0xff0000, smp->la_dbg_port); - odm_set_mac_reg(dm, reg2, MASKDWORD, - smp->la_mac_mask_or_hdr_sel); - odm_set_mac_reg(dm, reg3, MASKDWORD, smp->la_trig_sig_sel); - - } else { - smp->is_bb_trigger = 1; - - if (smp->la_trig_mode == PHYDM_ADC_MAC_TRIG) { - /*polling bit for MAC trigger event*/ - if (!en_fake_trig) - odm_set_mac_reg(dm, reg1, BIT(3), 1); - - odm_set_mac_reg(dm, reg1, BIT(7) | BIT(6), - smp->la_trig_sig_sel); - if (smp->la_trig_sig_sel == ADCSMP_TRIG_REG) - /* @manual trigger reg1[5] = 0->1*/ - odm_set_mac_reg(dm, reg1, BIT(5), 1); - } - /*polling bit for BB ADC mode*/ - odm_set_mac_reg(dm, reg1, BIT(1), 1); - } - - reg_value = odm_get_bb_reg(dm, reg1, 0xff); - pr_debug("4. [Set MAC IQ dump] 0x%x[7:0] = ((0x%x))\n", reg1, - reg_value); - - #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) - RT_TRACE_EX(COMP_LA_MODE, DBG_LOUD, - ("4. [Set MAC IQ dump] 0x%x[7:0] = ((0x%x))\n", reg1, - reg_value)); - #endif -} - -void phydm_adc_smp_start(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct rt_adcsmp *smp = &dm->adcsmp; - u8 tmp_u1b = 0; - u8 while_cnt = 0; - u8 target_polling_bit = 0; - boolean polling_ok = false; - - if (smp->en_fake_trig) - smp->is_fake_trig = true; - else - smp->is_fake_trig = false; - - phydm_la_mode_bb_setting(dm, smp->en_fake_trig); - phydm_la_mode_set_trigger_time(dm, smp->la_trigger_time); - - if (dm->support_ic_type & (ODM_RTL8197F | ODM_RTL8192F)) - odm_set_bb_reg(dm, R_0xd00, BIT(26), 0x1); - else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) - odm_set_bb_reg(dm, R_0x1eb4, BIT(23), 0x1); - else - odm_write_1byte(dm, R_0x8b4, 0x80); -#if 0 - /* odm_set_bb_reg(dm, R_0x8b4, BIT(7), 1); */ -#endif - - phydm_la_mode_set_mac_iq_dump(dm, smp->en_fake_trig); - - #if (DM_ODM_SUPPORT_TYPE & ODM_AP) - watchdog_stop(dm->priv); - #endif - - if (smp->en_fake_trig) { - ODM_delay_ms(100); - smp->is_fake_trig = false; - phydm_la_mode_bb_setting(dm, smp->en_fake_trig); - - if (smp->la_trig_mode == PHYDM_ADC_MAC_TRIG) { - if (dm->support_ic_type & ODM_RTL8192F) - odm_set_mac_reg(dm, R_0x7f0, BIT(3), 1); - else - odm_set_mac_reg(dm, R_0x7c0, BIT(3), 1); - } - } -#if RTL8198F_SUPPORT - phydm_la_pre_run(dm); -#endif - - target_polling_bit = (smp->is_bb_trigger) ? BIT(1) : BIT(2); - do { /*Polling time always use 100ms, when it exceed 2s, break loop*/ - if (dm->support_ic_type & ODM_RTL8192F) { - tmp_u1b = odm_read_1byte(dm, R_0x7f0); - pr_debug("[%d], 0x7F0[7:0] = ((0x%x))\n", while_cnt, - tmp_u1b); - } else { - tmp_u1b = odm_read_1byte(dm, R_0x7c0); - pr_debug("[%d], 0x7C0[7:0] = ((0x%x))\n", while_cnt, - tmp_u1b); - } - - if (smp->adc_smp_state != ADCSMP_STATE_SET) { - pr_debug("[state Error] adc_smp_state != ADCSMP_STATE_SET\n"); - break; - - } else if (tmp_u1b & target_polling_bit) { - ODM_delay_ms(100); - while_cnt = while_cnt + 1; - continue; - } else { - pr_debug("[LA Query OK] polling_bit=((0x%x))\n", - target_polling_bit); - polling_ok = true; - break; - } - } while (while_cnt < 20); - - if (smp->adc_smp_state == ADCSMP_STATE_SET) { - if (polling_ok) - phydm_la_get_tx_pkt_buf(dm); - else - pr_debug("[Polling timeout]\n"); - } - - #if (DM_ODM_SUPPORT_TYPE & ODM_AP) - watchdog_resume(dm->priv); - #endif - - #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE)) - if (smp->adc_smp_state == ADCSMP_STATE_SET) - smp->adc_smp_state = ADCSMP_STATE_QUERY; - #endif - - pr_debug("[LA mode] LA_pattern_count = ((%d))\n", smp->la_count); - #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) - RT_TRACE_EX(COMP_LA_MODE, DBG_LOUD, - ("[LA mode] la_count = ((%d))\n", smp->la_count)); - #endif - - adc_smp_stop(dm); - - if (smp->la_count == 0) { - pr_debug("LA Dump finished ---------->\n\n\n"); - phydm_release_bb_dbg_port(dm); - - if ((dm->support_ic_type & ODM_RTL8821C) && - dm->cut_version >= ODM_CUT_B) - odm_set_bb_reg(dm, R_0x95c, BIT(23), 0); - else if (dm->support_ic_type & ODM_RTL8195B) - odm_set_bb_reg(dm, R_0x95c, BIT(23), 0); - - } else { - smp->la_count--; - pr_debug("LA Dump more ---------->\n\n\n"); - adc_smp_set(dm, smp->la_trig_mode, smp->la_trig_sig_sel, - smp->la_dma_type, smp->la_trigger_time, 0); - } -} - -#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) -void adc_smp_work_item_callback(void *context) -{ - void *adapter = (void *)context; - PHAL_DATA_TYPE hal_data = GET_HAL_DATA(((PADAPTER)adapter)); - struct dm_struct *dm = &hal_data->DM_OutSrc; - struct rt_adcsmp *smp = &dm->adcsmp; - - pr_debug("[WorkItem Call back] LA_State=((%d))\n", smp->adc_smp_state); - phydm_adc_smp_start(dm); -} -#endif - -void adc_smp_set(void *dm_void, u8 trig_mode, u32 trig_sig_sel, - u8 dma_data_sig_sel, u32 trig_time, u16 polling_time) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - boolean is_set_success = true; - struct rt_adcsmp *smp = &dm->adcsmp; - - smp->la_trig_mode = trig_mode; - smp->la_trig_sig_sel = trig_sig_sel; - smp->la_dma_type = dma_data_sig_sel; - smp->la_trigger_time = trig_time; - - #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE | ODM_AP)) - if (smp->adc_smp_state != ADCSMP_STATE_IDLE) - is_set_success = false; - else if (smp->adc_smp_buf.length == 0) - is_set_success = phydm_la_buffer_allocate(dm); - #endif - - if (is_set_success) { - smp->adc_smp_state = ADCSMP_STATE_SET; - - pr_debug("[LA Set Success] LA_State=((%d))\n", - smp->adc_smp_state); - - #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) - - pr_debug("ADCSmp_work_item_index = ((%d))\n", - smp->la_work_item_index); - if (smp->la_work_item_index != 0) { - odm_schedule_work_item(&smp->adc_smp_work_item_1); - smp->la_work_item_index = 0; - } else { - odm_schedule_work_item(&smp->adc_smp_work_item); - smp->la_work_item_index = 1; - } - #else - phydm_adc_smp_start(dm); - #endif - } else { - pr_debug("[LA Set Fail] LA_State=((%d))\n", smp->adc_smp_state); - } -} - -#if (DM_ODM_SUPPORT_TYPE & ODM_WIN) -enum rt_status -adc_smp_query(void *dm_void, ULONG info_buf_length, void *info_buf, - PULONG bytes_written) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct rt_adcsmp *smp = &dm->adcsmp; - enum rt_status ret_status = RT_STATUS_SUCCESS; - struct rt_adcsmp_string *buf = &smp->adc_smp_buf; - - pr_debug("[%s] LA_State=((%d))", __func__, smp->adc_smp_state); - - if (info_buf_length != buf->buffer_size) { - *bytes_written = 0; - ret_status = RT_STATUS_RESOURCE; - } else if (buf->length != buf->buffer_size) { - *bytes_written = 0; - ret_status = RT_STATUS_RESOURCE; - } else if (smp->adc_smp_state != ADCSMP_STATE_QUERY) { - *bytes_written = 0; - ret_status = RT_STATUS_PENDING; - } else { - odm_move_memory(dm, info_buf, buf->octet, buf->buffer_size); - *bytes_written = buf->buffer_size; - - smp->adc_smp_state = ADCSMP_STATE_IDLE; - } - - pr_debug("Return status %d\n", ret_status); - - return ret_status; -} -#elif (DM_ODM_SUPPORT_TYPE & ODM_CE) - -void adc_smp_query(void *dm_void, void *output, u32 out_len, u32 *pused) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct rt_adcsmp *smp = &dm->adcsmp; - struct rt_adcsmp_string *buf = &smp->adc_smp_buf; - u32 used = *pused; - u32 i = 0; -#if 0 - /* struct timespec t; */ - /* rtw_get_current_timespec(&t); */ -#endif - - pr_debug("%s adc_smp_state %d", __func__, smp->adc_smp_state); - - for (i = 0; i < (buf->length >> 2) - 2; i += 2) { - PDM_SNPF(out_len, used, output + used, out_len - used, - "%08x%08x\n", buf->octet[i], buf->octet[i + 1]); - } - - PDM_SNPF(out_len, used, output + used, out_len - used, "\n"); - /* PDM_SNPF(output + used, out_len - used, "\n[%lu.%06lu]\n", */ - /* t.tv_sec, t.tv_nsec); */ - *pused = used; -} - -s32 adc_smp_get_sample_counts(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct rt_adcsmp *smp = &dm->adcsmp; - struct rt_adcsmp_string *buf = &smp->adc_smp_buf; - - return (buf->length >> 2) - 2; -} - -s32 adc_smp_query_single_data(void *dm_void, void *output, u32 out_len, u32 idx) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct rt_adcsmp *smp = &dm->adcsmp; - struct rt_adcsmp_string *buf = &smp->adc_smp_buf; - u32 used = 0; - - /* @dbg_print("%s adc_smp_state %d\n", __func__,*/ - /* smp->adc_smp_state);*/ - if (smp->adc_smp_state != ADCSMP_STATE_QUERY) { - PDM_SNPF(out_len, used, output + used, out_len - used, - "Error: la data is not ready yet ...\n"); - return -1; - } - - if (idx < ((buf->length >> 2) - 2)) { - PDM_SNPF(out_len, used, output + used, out_len - used, - "%08x%08x\n", buf->octet[idx], buf->octet[idx + 1]); - } - return 0; -} - -#endif - -void adc_smp_stop(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct rt_adcsmp *smp = &dm->adcsmp; - - smp->adc_smp_state = ADCSMP_STATE_IDLE; - - PHYDM_DBG(dm, DBG_TMP, "[LA_Stop] LA_state = %d\n", smp->adc_smp_state); -} - -void adc_smp_init(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct rt_adcsmp *smp = &dm->adcsmp; - struct rt_adcsmp_string *buf = &smp->adc_smp_buf; - - smp->adc_smp_state = ADCSMP_STATE_IDLE; - smp->is_la_print = true; - smp->is_fake_trig = false; - smp->en_fake_trig = false; - phydm_la_set_buff_mode(dm, ADCSMP_BUFF_HALF); - - #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT - phydm_la_bb_adv_reset_jgr3(dm); - #endif -} - -#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE)) -void adc_smp_de_init(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct rt_adcsmp *smp = &dm->adcsmp; - struct rt_adcsmp_string *buf = &smp->adc_smp_buf; - - adc_smp_stop(dm); - - if (buf->length != 0x0) { - odm_free_memory(dm, buf->octet, buf->length); - buf->length = 0x0; - } -} - -#endif - -#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT - -void phydm_la_bb_adv_reset_jgr3(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct rt_adcsmp *smp = &dm->adcsmp; - - smp->la_en_new_bbtrigger = false; - - smp->la_ori_bb_dis = false; - smp->la_and1_sel = 0; - smp->la_and1_val = 0; - smp->la_and2_sel = 0; - smp->la_and2_val = 0; - smp->la_and3_sel = 0; - smp->la_and3_val = 0; - smp->la_and4_en = 0; - smp->la_and4_val = 0; -} - -void phydm_la_bb_adv_cmd_jgr3(void *dm_void, char input[][16], u32 *_used, - char *output, u32 *_out_len) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct rt_adcsmp *smp = &dm->adcsmp; - u32 var1[10] = {0}; - u32 used = *_used; - u32 out_len = *_out_len; - u32 enable; - - if (!(dm->support_ic_type & ODM_IC_JGR3_SERIES)) - return; - - PHYDM_SSCANF(input[3], DCMD_DECIMAL, &var1[0]); - - enable = var1[0]; - - if (enable == 1) { - smp->la_en_new_bbtrigger = true; - - PHYDM_SSCANF(input[4], DCMD_DECIMAL, &var1[1]); - PHYDM_SSCANF(input[5], DCMD_DECIMAL, &var1[2]); - PHYDM_SSCANF(input[6], DCMD_HEX, &var1[3]); - PHYDM_SSCANF(input[7], DCMD_DECIMAL, &var1[4]); - PHYDM_SSCANF(input[8], DCMD_HEX, &var1[5]); - PHYDM_SSCANF(input[9], DCMD_DECIMAL, &var1[6]); - PHYDM_SSCANF(input[10], DCMD_HEX, &var1[7]); - PHYDM_SSCANF(input[11], DCMD_HEX, &var1[8]); - PHYDM_SSCANF(input[12], DCMD_HEX, &var1[9]); - - smp->la_ori_bb_dis = (boolean)var1[1]; - smp->la_and1_sel = (u8)var1[2]; - smp->la_and1_val = (u8)var1[3]; - smp->la_and2_sel = (u8)var1[4]; - smp->la_and2_val = (u8)var1[5]; - smp->la_and3_sel = (u8)var1[6]; - smp->la_and3_val = (u8)var1[7]; - smp->la_and4_en = (u32)var1[8]; - smp->la_and4_val = (u32)var1[9]; - } else { - phydm_la_bb_adv_reset_jgr3(dm); - } - - PDM_SNPF(out_len, used, output + used, out_len - used, - "{en %d} {C0_dis %d} {C1_sel %d} {C1_val %d} {C2_sel %d} {C2_val %d}\n{C3_sel %d} {C3_val %d} {C4_en %d}{C4_val %d}\n", - enable, smp->la_ori_bb_dis, smp->la_and1_sel, smp->la_and1_val, - smp->la_and2_sel, smp->la_and2_val, - smp->la_and3_sel, smp->la_and3_val, - smp->la_and4_en, smp->la_and4_val); -} - -#endif - -void phydm_la_mode_bb_setting(void *dm_void, boolean en_fake_trig) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct rt_adcsmp *smp = &dm->adcsmp; - - u8 trig_mode = smp->la_trig_mode; - u32 trig_sel = smp->la_trig_sig_sel; - u32 dbg_port = smp->la_dbg_port; - u8 edge = smp->la_trigger_edge; - u8 smp_rate = smp->la_smp_rate; - u8 dma_type = smp->la_dma_type; - u8 is_fake_trig = smp->is_fake_trig; - u32 dbg_port_hdr_sel = 0; - #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT - boolean en_new_bbtrigger = smp->la_en_new_bbtrigger; - boolean ori_bb_dis = smp->la_ori_bb_dis; - u8 and1_sel = smp->la_and1_sel; - u8 and1_val = smp->la_and1_val; - u8 and2_sel = smp->la_and2_sel; - u8 and2_val = smp->la_and2_val; - u8 and3_sel = smp->la_and3_sel; - u8 and3_val = smp->la_and3_val; - u32 and4_en = smp->la_and4_en; - u32 and4_val = smp->la_and4_val; - #endif - - #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) - RT_TRACE_EX(COMP_LA_MODE, DBG_LOUD, - ("1. [LA mode bb_setting]trig_mode = ((%d)), dbg_port = ((0x%x)), Trig_Edge = ((%d)), smp_rate = ((%d)), Trig_Sel = ((0x%x)), Dma_type = ((%d))\n", - trig_mode, dbg_port, edge, smp_rate, trig_sel, dma_type)); - #endif - - if (trig_mode == PHYDM_MAC_TRIG) - trig_sel = 0; /*@ignore this setting*/ - - /*set BB debug port*/ - if (is_fake_trig) { - if (phydm_set_bb_dbg_port(dm, DBGPORT_PRI_3, 0xf)) - pr_debug("Set fake dbg_port success\n"); - /*@BB debug port bit*/ - if (dm->support_ic_type & ODM_IC_11AC_SERIES) { - odm_set_bb_reg(dm, R_0x95c, 0x1f, 0x0); - #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT - } else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) { - if (!(en_new_bbtrigger)) - odm_set_bb_reg(dm, R_0x1ce4, 0x3e000, 0x0); - else if (!(ori_bb_dis)) - odm_set_bb_reg(dm, R_0x1ce4, 0x3e000, 0x0); - #endif - } else { - odm_set_bb_reg(dm, R_0x9a0, 0x1f, 0x0); - } - - pr_debug("0. [BB Setting] fake-trigger!\n"); - } else { - if (en_fake_trig) - phydm_release_bb_dbg_port(dm); - if (phydm_set_bb_dbg_port(dm, DBGPORT_PRI_3, dbg_port)) - pr_debug("Set dbg_port((0x%x)) success\n", dbg_port); - else - pr_debug("Set dbg_port fail!\n"); - /*@debug port bit*/ - if (dm->support_ic_type & ODM_IC_11AC_SERIES) { - odm_set_bb_reg(dm, R_0x95c, 0x1f, trig_sel); - #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT - } else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) { - if (!(en_new_bbtrigger)) - odm_set_bb_reg(dm, R_0x1ce4, 0x3e000, trig_sel); - else if (!(ori_bb_dis)) - odm_set_bb_reg(dm, R_0x1ce4, 0x3e000, trig_sel); - #endif - } else { - odm_set_bb_reg(dm, R_0x9a0, 0x1f, trig_sel); - } - pr_debug("1. [BB Setting] trig_mode = ((%d)), dbg_port = ((0x%x)), Trig_Edge = ((%d)), smp_rate = ((%d)), Trig_Sel = ((0x%x)), Dma_type = ((%d))\n", - trig_mode, dbg_port, edge, smp_rate, trig_sel, - dma_type); - if (en_fake_trig) - return; - } - - if (dm->support_ic_type & ODM_IC_11AC_SERIES) { - if (trig_mode == PHYDM_ADC_RF0_TRIG) - dbg_port_hdr_sel = 9; /*@DBGOUT_RFC_a[31:0]*/ - else if (trig_mode == PHYDM_ADC_RF1_TRIG) - dbg_port_hdr_sel = 8; /*@DBGOUT_RFC_b[31:0]*/ - else if ((trig_mode == PHYDM_ADC_BB_TRIG) || - (trig_mode == PHYDM_ADC_MAC_TRIG)) { - if (smp->la_mac_mask_or_hdr_sel <= 0xf) - dbg_port_hdr_sel = smp->la_mac_mask_or_hdr_sel; - else - dbg_port_hdr_sel = 0; - } - - phydm_bb_dbg_port_header_sel(dm, dbg_port_hdr_sel); - - /*@0x95C[11:8]*/ - odm_set_bb_reg(dm, R_0x95c, 0xf00, dma_type); - /*@0: posedge, 1: negedge*/ - odm_set_bb_reg(dm, R_0x95c, BIT(31), edge); - odm_set_bb_reg(dm, R_0x95c, 0xe0, smp_rate); - /* @(0:) '80MHz' - * (1:) '40MHz' - * (2:) '20MHz' - * (3:) '10MHz' - * (4:) '5MHz' - * (5:) '2.5MHz' - * (6:) '1.25MHz' - * (7:) '160MHz (for BW160 ic)' - */ - if ((dm->support_ic_type & ODM_RTL8821C) && - (dm->cut_version >= ODM_CUT_B)) - odm_set_bb_reg(dm, R_0x95c, BIT(23), 1); - else if (dm->support_ic_type & ODM_RTL8195B) - odm_set_bb_reg(dm, R_0x95c, BIT(23), 1); - - #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT - } else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) { - /*@MAC-PHY timing*/ - odm_set_bb_reg(dm, R_0x1ce4, BIT(7) | BIT(6), 0); - odm_set_bb_reg(dm, R_0x1cf4, BIT(23), 1); /*@LA mode on*/ - odm_set_bb_reg(dm, R_0x1ce4, 0x3f, dma_type); - /*@0: posedge, 1: negedge ??*/ - odm_set_bb_reg(dm, R_0x1ce4, BIT(26), edge); - odm_set_bb_reg(dm, R_0x1ce4, 0x700, smp_rate); - - if (!en_new_bbtrigger) { /*normal LA mode & back to default*/ - - pr_debug("Set bb default setting\n"); - - /*path 1 default: enable ori. BB trigger*/ - odm_set_bb_reg(dm, R_0x1ce4, BIT(27), 0); - - /*@AND1~AND4 default: off*/ - odm_set_bb_reg(dm, R_0x1ce4, MASKH4BITS, 0); /*@AND 1*/ - odm_set_bb_reg(dm, R_0x1ce8, 0x1f, 0); /*@AND 1 val*/ - odm_set_bb_reg(dm, R_0x1ce8, BIT(5), 0); /*@AND 1 inv*/ - - odm_set_bb_reg(dm, R_0x1ce8, 0x3c0, 0); /*@AND 2*/ - odm_set_bb_reg(dm, R_0x1ce8, 0x7c00, 0); /*@AND 2 val*/ - /*@AND 2 inv*/ - odm_set_bb_reg(dm, R_0x1ce8, BIT(15), 0); - - odm_set_bb_reg(dm, R_0x1ce8, 0xf0000, 0); /*@AND 3*/ - /*@AND 3 val*/ - odm_set_bb_reg(dm, R_0x1ce8, 0x1f00000, 0); - /*@AND 3 inv*/ - odm_set_bb_reg(dm, R_0x1ce8, BIT(25), 0); - - /*@AND 4 en*/ - odm_set_bb_reg(dm, R_0x1cf0, MASKDWORD, 0); - /*@AND 4 val*/ - odm_set_bb_reg(dm, R_0x1cec, MASKDWORD, 0); - /*@AND 4 inv*/ - odm_set_bb_reg(dm, R_0x1ce8, BIT(26), 0); - - pr_debug("Set bb default setting finished\n"); - - } else if (en_new_bbtrigger) { - /*path 1 default: enable ori. BB trigger*/ - if (ori_bb_dis) - odm_set_bb_reg(dm, R_0x1ce4, BIT(27), 1); - else - odm_set_bb_reg(dm, R_0x1ce4, BIT(27), 0); - - /* @AND1 */ - odm_set_bb_reg(dm, R_0x1ce8, BIT(5), 0); /*@invert*/ - - if (and1_sel == 0x4 || and1_sel == 0x5 || - and1_sel == 0x6) { - /* rx_state, rx_state_freq, field */ - odm_set_bb_reg(dm, R_0x1ce4, MASKH4BITS, - and1_sel); - odm_set_bb_reg(dm, R_0x1ce8, 0x1f, and1_val); - - } else if (and1_sel == 0x7) { - /* @mux state */ - odm_set_bb_reg(dm, R_0x1ce4, MASKH4BITS, - and1_sel); - odm_set_bb_reg(dm, R_0x1ce8, 0xf, and1_val); - - } else { - odm_set_bb_reg(dm, R_0x1ce4, MASKH4BITS, - and1_sel); - } - - /* @AND2 */ - odm_set_bb_reg(dm, R_0x1ce8, BIT(15), 0); /*@invert*/ - - if (and2_sel == 0x4 || and2_sel == 0x5 || - and2_sel == 0x6) { - /* rx_state, rx_state_freq, field */ - odm_set_bb_reg(dm, R_0x1ce8, 0x3c0, and2_sel); - odm_set_bb_reg(dm, R_0x1ce8, 0x7c00, and2_val); - - } else if (and2_sel == 0x7) { - /* @mux state */ - odm_set_bb_reg(dm, R_0x1ce8, 0x3c0, and2_sel); - odm_set_bb_reg(dm, R_0x1ce8, 0x3c00, and2_val); - - } else { - odm_set_bb_reg(dm, R_0x1ce8, 0x3c0, and2_sel); - } - - /* @AND3 */ - odm_set_bb_reg(dm, R_0x1ce8, BIT(25), 0); /*@invert*/ - - if (and3_sel == 0x4 || and3_sel == 0x5 || - and3_sel == 0x6) { - /* rx_state, rx_state_freq, field */ - odm_set_bb_reg(dm, R_0x1ce8, 0xf0000, and3_sel); - odm_set_bb_reg(dm, R_0x1ce8, 0x1f00000, - and3_val); - - } else if (and3_sel == 0x7) { - /* @mux state */ - odm_set_bb_reg(dm, R_0x1ce8, 0xf0000, and3_sel); - odm_set_bb_reg(dm, R_0x1ce8, 0xf00000, - and3_val); - } else { - odm_set_bb_reg(dm, R_0x1ce8, 0xf0000, and3_sel); - } - - /* @AND4 */ - odm_set_bb_reg(dm, R_0x1ce8, BIT(26), 0); /*@invert*/ - odm_set_bb_reg(dm, R_0x1cf0, MASKDWORD, and4_en); - odm_set_bb_reg(dm, R_0x1cec, MASKDWORD, and4_val); - } - #endif - } else { - #if (RTL8192F_SUPPORT) - if ((dm->support_ic_type & ODM_RTL8192F)) - /*@LA reset HW block enable for true-mac asic*/ - odm_set_bb_reg(dm, R_0x9a0, BIT(15), 1); - #endif - /*@0x9A0[11:8]*/ - odm_set_bb_reg(dm, R_0x9a0, 0xf00, dma_type); - /*@0: posedge, 1: negedge*/ - odm_set_bb_reg(dm, R_0x9a0, BIT(31), edge); - odm_set_bb_reg(dm, R_0x9a0, 0xe0, smp_rate); - /* @(0:) '80MHz' - * (1:) '40MHz' - * (2:) '20MHz' - * (3:) '10MHz' - * (4:) '5MHz' - * (5:) '2.5MHz' - * (6:) '1.25MHz' - * (7:) '160MHz (for BW160 ic)' - */ - } -} - -void phydm_la_mode_set_trigger_time(void *dm_void, u32 trigger_time_mu_sec) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - u8 time_unit_num = 0; - u32 unit = 0; - - if (trigger_time_mu_sec < 128) - unit = 0; /*unit: 1mu sec*/ - else if (trigger_time_mu_sec < 256) - unit = 1; /*unit: 2mu sec*/ - else if (trigger_time_mu_sec < 512) - unit = 2; /*unit: 4mu sec*/ - else if (trigger_time_mu_sec < 1024) - unit = 3; /*unit: 8mu sec*/ - else if (trigger_time_mu_sec < 2048) - unit = 4; /*unit: 16mu sec*/ - else if (trigger_time_mu_sec < 4096) - unit = 5; /*unit: 32mu sec*/ - else if (trigger_time_mu_sec < 8192) - unit = 6; /*unit: 64mu sec*/ - - time_unit_num = (u8)(trigger_time_mu_sec >> unit); - - pr_debug("2. [Set Trigger Time] Trig_Time = ((%d)) * unit = ((2^%d us))\n", - time_unit_num, unit); - #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) - RT_TRACE_EX(COMP_LA_MODE, DBG_LOUD, ( - "3. [Set Trigger Time] Trig_Time = ((%d)) * unit = ((2^%d us))\n", - time_unit_num, unit)); - #endif - - if (dm->support_ic_type & ODM_RTL8192F) { - odm_set_mac_reg(dm, R_0x7fc, BIT(2) | BIT(1) | BIT(0), unit); - odm_set_mac_reg(dm, R_0x7f0, 0x7f00, (time_unit_num & 0x7f)); - #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT - } else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) { - odm_set_mac_reg(dm, R_0x7cc, BIT(18) | BIT(17) | BIT(16), unit); - odm_set_mac_reg(dm, R_0x7c0, 0x7f00, (time_unit_num & 0x7f)); - #endif - } else { - odm_set_mac_reg(dm, R_0x7cc, BIT(20) | BIT(19) | BIT(18), unit); - odm_set_mac_reg(dm, R_0x7c0, 0x7f00, (time_unit_num & 0x7f)); - } -} - -void phydm_la_set_buff_mode(void *dm_void, enum la_buff_mode mode) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct rt_adcsmp *smp = &dm->adcsmp; - struct rt_adcsmp_string *buf = &smp->adc_smp_buf; -#if (DM_ODM_SUPPORT_TYPE == ODM_AP) - struct rtl8192cd_priv *priv = dm->priv; -#endif - u32 buff_size_base = 0; - u32 end_pos_tmp = 0; -#if (DM_ODM_SUPPORT_TYPE == ODM_AP) - u8 normal_LA_on = priv->pmib->miscEntry.normal_LA_on; -#endif - smp->la_buff_mode = mode; -#if 0 - if (dm->support_ic_type & ODM_RTL8814A) - buf->start_pos = 0x30000; - else if (dm->support_ic_type & - (ODM_RTL8822B | ODM_RTL8822C | ODM_RTL8812F)) - buf->start_pos = 0x20000; - else if (dm->support_ic_type & ODM_RTL8814B) - buf->start_pos = 0x30000; - else if (dm->support_ic_type & (ODM_RTL8197F | ODM_RTL8198F)) - buf->start_pos = 0x00000; - else if (dm->support_ic_type & ODM_RTL8192F) - buf->start_pos = 0x2000; - else if (dm->support_ic_type & ODM_RTL8821C) - buf->start_pos = 0x8000; - else if (dm->support_ic_type & ODM_RTL8195B) - buf->start_pos = 0x4000; -#endif - switch (dm->support_ic_type) { - case ODM_RTL8814A: - buff_size_base = 0x10000; - end_pos_tmp = 0x40000; - break; - case ODM_RTL8822B: - case ODM_RTL8822C: - case ODM_RTL8812F: - buff_size_base = 0x20000; - end_pos_tmp = 0x40000; - break; - case ODM_RTL8814B: - buff_size_base = 0x30000; - end_pos_tmp = 0x60000; - break; - case ODM_RTL8197F: - case ODM_RTL8198F: -#if (DM_ODM_SUPPORT_TYPE == ODM_AP) - buff_size_base = 0x10000; - end_pos_tmp = (normal_LA_on == 1) ? 0x20000 : 0x10000; - break; -#endif - case ODM_RTL8192F: - buff_size_base = 0xE000; - end_pos_tmp = 0x10000; - break; - case ODM_RTL8821C: - buff_size_base = 0x8000; - end_pos_tmp = 0x10000; - break; - case ODM_RTL8195B: - buff_size_base = 0x4000; - end_pos_tmp = 0x8000; - break; - default: - //pr_debug("[%s] Warning!", __func__); - break; - } - - buf->buffer_size = buff_size_base; - - if (dm->support_ic_type & FULL_BUFF_MODE_SUPPORT) { - if (mode == ADCSMP_BUFF_HALF) { - odm_set_mac_reg(dm, R_0x7cc, BIT(30), 0); - } else { - buf->buffer_size = buf->buffer_size << 1; - odm_set_mac_reg(dm, R_0x7cc, BIT(30), 1); - } - } - - buf->end_pos = end_pos_tmp; - buf->start_pos = end_pos_tmp - buf->buffer_size; - - PHYDM_DBG(dm, DBG_TMP, - "start_addr = ((0x%x)), end_addr = ((0x%x)), buffer_size = ((0x%x))\n", - buf->start_pos, buf->end_pos, buf->buffer_size); -} - -void phydm_lamode_trigger_cmd(void *dm_void, char input[][16], u32 *_used, - char *output, u32 *_out_len) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct rt_adcsmp *smp = &dm->adcsmp; - u8 trig_mode = 0, dma_data_sig_sel = 0; - u32 trig_sig_sel = 0; - u8 enable_la_mode = 0; - u32 trigger_time_mu_sec = 0; - char help[] = "-h"; - u32 var1[10] = {0}; - u32 used = *_used; - u32 out_len = *_out_len; - - if (!(dm->support_ic_type & PHYDM_IC_SUPPORT_LA_MODE)) - return; - - PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]); - enable_la_mode = (u8)var1[0]; - - /*@dbg_print("echo cmd input_num = %d\n", input_num);*/ - - if ((strcmp(input[1], help) == 0)) { - PDM_SNPF(out_len, used, output + used, out_len - used, - "{En} {0:BB,1:BB_MAC,2:RF0,3:RF1,4:MAC}\n{BB:dbg_port[bit],BB_MAC:0-ok/1-fail/2-cca,MAC:ref} {DMA type} {TrigTime}\n{DbgPort_head/ref_mask} {dbg_port} {0:P_Edge, 1:N_Edge} {SpRate:0-80M,1-40M,2-20M} {Capture num}\n"); - PDM_SNPF(out_len, used, output + used, out_len - used, - "set {1:tx_buff_size} {0: half, 1:all}\n"); - #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT - PDM_SNPF(out_len, used, output + used, out_len - used, - "set {2:adv_bb_trig(JGR3)} {en} {C0_dis} {C1_sel} {C1_val} {C2_sel} {C2_val}\n{C3_sel} {C3_val} {C4_en} {C4_val}\n"); - #endif - PDM_SNPF(out_len, used, output + used, out_len - used, - "set {3:fake_trigger} {0: dis, 1:en}\n"); - PDM_SNPF(out_len, used, output + used, out_len - used, - "set {4:is_la_print} {0: dis, 1:en}\n"); - } else if ((strcmp(input[1], "set") == 0)) { - PHYDM_SSCANF(input[2], DCMD_DECIMAL, &var1[1]); - - if (var1[1] == 1) { - PHYDM_SSCANF(input[3], DCMD_DECIMAL, &var1[2]); - phydm_la_set_buff_mode(dm, (enum la_buff_mode)var1[2]); - PDM_SNPF(out_len, used, output + used, out_len - used, - "buff_mode = (%d/2)\n", smp->la_buff_mode + 1); - } else if (var1[1] == 2) { - #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT - phydm_la_bb_adv_cmd_jgr3(dm, input, - &used, output, &out_len); - #else - PDM_SNPF(out_len, used, output + used, out_len - used, - "Not Support\n"); - #endif - } else if (var1[1] == 3) { - PHYDM_SSCANF(input[3], DCMD_DECIMAL, &var1[2]); - if (var1[2] == 1) { - smp->en_fake_trig = true; - PDM_SNPF(out_len, used, output + used, - out_len - used, - "Enable fake-trigger\n"); - } else { - smp->en_fake_trig = false; - PDM_SNPF(out_len, used, output + used, - out_len - used, - "Disable fake-trigger\n"); - } - } else if (var1[1] == 4) { - PHYDM_SSCANF(input[3], DCMD_DECIMAL, &var1[2]); - smp->is_la_print = (boolean)var1[2]; - PDM_SNPF(out_len, used, output + used, out_len - used, - "is_la_print = %d\n", smp->is_la_print); - } - } else if (enable_la_mode == 1) { - PHYDM_SSCANF(input[2], DCMD_DECIMAL, &var1[1]); - - trig_mode = (u8)var1[1]; - - if (trig_mode == PHYDM_MAC_TRIG) - PHYDM_SSCANF(input[3], DCMD_HEX, &var1[2]); - else - PHYDM_SSCANF(input[3], DCMD_DECIMAL, &var1[2]); - trig_sig_sel = var1[2]; - - PHYDM_SSCANF(input[4], DCMD_DECIMAL, &var1[3]); - PHYDM_SSCANF(input[5], DCMD_DECIMAL, &var1[4]); - PHYDM_SSCANF(input[6], DCMD_HEX, &var1[5]); - PHYDM_SSCANF(input[7], DCMD_HEX, &var1[6]); - PHYDM_SSCANF(input[8], DCMD_DECIMAL, &var1[7]); - PHYDM_SSCANF(input[9], DCMD_DECIMAL, &var1[8]); - PHYDM_SSCANF(input[10], DCMD_DECIMAL, &var1[9]); - - dma_data_sig_sel = (u8)var1[3]; - trigger_time_mu_sec = var1[4]; /*unit: us*/ - - smp->la_mac_mask_or_hdr_sel = var1[5]; - smp->la_dbg_port = var1[6]; - smp->la_trigger_edge = (u8)var1[7]; - smp->la_smp_rate = (u8)(var1[8] & 0x7); - smp->la_count = var1[9]; - - pr_debug("echo lamode %d %d %d %d %d %d %x %d %d %d\n", - var1[0], var1[1], var1[2], var1[3], var1[4], - var1[5], var1[6], var1[7], var1[8], var1[9]); - #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) - RT_TRACE_EX(COMP_LA_MODE, DBG_LOUD, - ("echo lamode %d %d %d %d %d %d %x %d %d %d\n", - var1[0], var1[1], var1[2], var1[3], - var1[4], var1[5], var1[6], var1[7], - var1[8], var1[9])); - #endif - - PDM_SNPF(out_len, used, output + used, out_len - used, - "a.En= ((1)), b.mode = ((%d)), c.Trig_Sel = ((0x%x)), d.Dma_type = ((%d))\n", - trig_mode, trig_sig_sel, dma_data_sig_sel); - PDM_SNPF(out_len, used, output + used, out_len - used, - "e.Trig_Time = ((%dus)), f.Dbg_head/mac_ref_mask = ((0x%x)), g.dbg_port = ((0x%x))\n", - trigger_time_mu_sec, - smp->la_mac_mask_or_hdr_sel, smp->la_dbg_port); - PDM_SNPF(out_len, used, output + used, out_len - used, - "h.Trig_edge = ((%d)), i.smp rate = ((%d MHz)), j.Cap_num = ((%d))\n", - smp->la_trigger_edge, (80 >> smp->la_smp_rate), - smp->la_count); - - #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT - PDM_SNPF(out_len, used, output + used, out_len - used, - "k.en_new_bbtrigger = ((%d))\n", - smp->la_en_new_bbtrigger); - #endif - - adc_smp_set(dm, trig_mode, trig_sig_sel, - dma_data_sig_sel, trigger_time_mu_sec, 0); - } else { - adc_smp_stop(dm); - PDM_SNPF(out_len, used, output + used, out_len - used, - "Disable LA mode\n"); - } - - *_used = used; - *_out_len = out_len; -} - -void phydm_la_pre_run(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct rt_adcsmp *smp = &dm->adcsmp; - struct rt_adcsmp_string *buf = &smp->adc_smp_buf; - u8 while_cnt = 0; - u8 tmp = 0; - u8 target_polling_bit = BIT(1); - - if (dm->support_ic_type & ODM_RTL8198F) { - /*pre run */ - /*force to bb trigger*/ - odm_set_mac_reg(dm, R_0x7c0, BIT(3), 0); - /*dma_trig_and(AND1) output 1*/ - odm_set_bb_reg(dm, R_0x1ce4, 0xf0000000, 0x0); - /*r_dma_trigger_AND1_inv = 1*/ - odm_set_bb_reg(dm, R_0x1ce8, BIT5, 1); /*@AND 1 val*/ - - target_polling_bit = BIT(1); - /* polling bit for BB ADC mode */ - odm_set_mac_reg(dm, 0x7c0, BIT(1), 1); - - pr_debug("buf_start(0x%x)buf_end(0x%x)\n", - buf->start_pos, buf->end_pos); - - do { - tmp = odm_read_1byte(dm, R_0x7c0); - if ((tmp & target_polling_bit) == false) { - pr_debug("LA pre-run fail.\n"); - adc_smp_stop(dm); - phydm_release_bb_dbg_port(dm); - } else { - ODM_delay_ms(100); - pr_debug("LA pre-run while_cnt = %d.\n", - while_cnt); - while_cnt = while_cnt + 1; - } - } while (while_cnt < 3); - - /*r_dma_trigger_AND1_inv = 0*/ - odm_set_bb_reg(dm, R_0x1ce8, BIT5, 0); /*@AND 1 val*/ - - if (smp->la_trig_mode == PHYDM_ADC_MAC_TRIG) { - if (dm->support_ic_type & ODM_RTL8192F) - odm_set_mac_reg(dm, R_0x7f0, BIT(3), 1); - else - odm_set_mac_reg(dm, R_0x7c0, BIT(3), 1); - } - } -} - -#endif /*@endif PHYDM_LA_MODE_SUPPORT*/ diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/phydm_ccx.c b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/phydm_ccx.c deleted file mode 100644 index f9ea9bb99d6b17..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/phydm_ccx.c +++ /dev/null @@ -1,1802 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2017 Realtek Corporation. - * - * 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 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. - * - * The full GNU General Public License is included in this distribution in the - * file called LICENSE. - * - * Contact Information: - * wlanfae - * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park, - * Hsinchu 300, Taiwan. - * - * Larry Finger - * - *****************************************************************************/ - -#include "mp_precomp.h" -#include "phydm_precomp.h" - -void phydm_ccx_hw_restart(void *dm_void) - /*@Will Restart NHM/CLM/FAHM simultaneously*/ -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - u32 reg1 = 0; - - if (dm->support_ic_type & ODM_IC_11AC_SERIES) - reg1 = R_0x994; - #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT - else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) - reg1 = R_0x1e60; - #endif - else - reg1 = R_0x890; - - PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__); - /*@disable NHM,CLM, FAHM*/ - odm_set_bb_reg(dm, reg1, 0x7, 0x0); - odm_set_bb_reg(dm, reg1, BIT(8), 0x0); - odm_set_bb_reg(dm, reg1, BIT(8), 0x1); -} - -#ifdef FAHM_SUPPORT - -u16 phydm_hw_divider(void *dm_void, u16 numerator, u16 denumerator) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - u16 result = DEVIDER_ERROR; - u32 tmp_u32 = ((numerator << 16) | denumerator); - u32 reg_devider_input; - u32 reg; - u8 i; - - PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__); - - if (dm->support_ic_type & ODM_IC_11AC_SERIES) { - reg_devider_input = 0x1cbc; - reg = 0x1f98; - } else { - reg_devider_input = 0x980; - reg = 0x9f0; - } - - odm_set_bb_reg(dm, reg_devider_input, MASKDWORD, tmp_u32); - - for (i = 0; i < 10; i++) { - ODM_delay_ms(1); - if (odm_get_bb_reg(dm, reg, BIT(24))) { - /*@Chk HW rpt is ready*/ - - result = (u16)odm_get_bb_reg(dm, reg, MASKBYTE2); - break; - } - } - return result; -} - -void phydm_fahm_trigger(void *dm_void, u16 tgr_period) -{ /*@unit (4us)*/ - struct dm_struct *dm = (struct dm_struct *)dm_void; - u32 fahm_reg1; - - if (dm->support_ic_type & ODM_IC_11AC_SERIES) { - odm_set_bb_reg(dm, R_0x1cf8, 0xffff00, tgr_period); - - fahm_reg1 = 0x994; - } else { - odm_set_bb_reg(dm, R_0x978, 0xff000000, (tgr_period & 0xff)); - odm_set_bb_reg(dm, R_0x97c, 0xff, (tgr_period & 0xff00) >> 8); - - fahm_reg1 = 0x890; - } - - odm_set_bb_reg(dm, fahm_reg1, BIT(2), 0); - odm_set_bb_reg(dm, fahm_reg1, BIT(2), 1); -} - -void phydm_fahm_set_valid_cnt(void *dm_void, u8 numerator_sel, - u8 denominator_sel) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct ccx_info *ccx_info = &dm->dm_ccx_info; - u32 fahm_reg1; - - PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__); - - if (ccx_info->fahm_nume_sel == numerator_sel && - ccx_info->fahm_denom_sel == denominator_sel) { - PHYDM_DBG(dm, DBG_ENV_MNTR, "no need to update\n"); - return; - } - - ccx_info->fahm_nume_sel = numerator_sel; - ccx_info->fahm_denom_sel = denominator_sel; - - if (dm->support_ic_type & ODM_IC_11AC_SERIES) - fahm_reg1 = 0x994; - else - fahm_reg1 = 0x890; - - odm_set_bb_reg(dm, fahm_reg1, 0xe0, numerator_sel); - odm_set_bb_reg(dm, fahm_reg1, 0x7000, denominator_sel); -} - -void phydm_fahm_get_result(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - u16 fahm_cnt[12]; /*packet count*/ - u16 fahm_rpt[12]; /*percentage*/ - u16 denominator; /*@fahm_denominator packet count*/ - u32 reg_rpt, reg_rpt_2; - u32 reg_tmp; - boolean is_ready = false; - u8 i; - - PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__); - - if (dm->support_ic_type & ODM_IC_11AC_SERIES) { - reg_rpt = 0x1f80; - reg_rpt_2 = 0x1f98; - } else { - reg_rpt = 0x9d8; - reg_rpt_2 = 0x9f0; - } - - for (i = 0; i < 3; i++) { - if (odm_get_bb_reg(dm, reg_rpt_2, BIT(31))) { - /*@Chk HW rpt is ready*/ - is_ready = true; - break; - } - ODM_delay_ms(1); - } - - if (!is_ready) - return; - - /*@Get FAHM Denominator*/ - denominator = (u16)odm_get_bb_reg(dm, reg_rpt_2, MASKLWORD); - - PHYDM_DBG(dm, DBG_ENV_MNTR, "Reg[0x%x] fahm_denmrtr = %d\n", reg_rpt_2, - denominator); - - /*@Get FAHM nemerator*/ - for (i = 0; i < 6; i++) { - reg_tmp = odm_get_bb_reg(dm, reg_rpt + (i << 2), MASKDWORD); - - PHYDM_DBG(dm, DBG_ENV_MNTR, "Reg[0x%x] fahm_denmrtr = %d\n", - reg_rpt + (i * 4), reg_tmp); - - fahm_cnt[i * 2] = (u16)(reg_tmp & MASKLWORD); - fahm_cnt[i * 2 + 1] = (u16)((reg_tmp & MASKHWORD) >> 16); - } - - for (i = 0; i < 12; i++) - fahm_rpt[i] = phydm_hw_divider(dm, fahm_cnt[i], denominator); - - PHYDM_DBG(dm, DBG_ENV_MNTR, - "FAHM_RPT_cnt[10:0]=[%d, %d, %d, %d, %d(IGI), %d, %d, %d, %d, %d, %d, %d]\n", - fahm_cnt[11], fahm_cnt[10], fahm_cnt[9], - fahm_cnt[8], fahm_cnt[7], fahm_cnt[6], - fahm_cnt[5], fahm_cnt[4], fahm_cnt[3], - fahm_cnt[2], fahm_cnt[1], fahm_cnt[0]); - - PHYDM_DBG(dm, DBG_ENV_MNTR, - "FAHM_RPT[10:0]=[%d, %d, %d, %d, %d(IGI), %d, %d, %d, %d, %d, %d, %d]\n", - fahm_rpt[11], fahm_rpt[10], fahm_rpt[9], fahm_rpt[8], - fahm_rpt[7], fahm_rpt[6], fahm_rpt[5], fahm_rpt[4], - fahm_rpt[3], fahm_rpt[2], fahm_rpt[1], fahm_rpt[0]); -} - -void phydm_fahm_set_th_by_igi(void *dm_void, u8 igi) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct ccx_info *ccx_info = &dm->dm_ccx_info; - u32 val = 0; - u8 f_th[11]; /*@FAHM Threshold*/ - u8 rssi_th[11]; /*@in RSSI scale*/ - u8 th_gap = 2 * IGI_TO_NHM_TH_MULTIPLIER; /*unit is 0.5dB for FAHM*/ - u8 i; - - PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__); - - if (ccx_info->env_mntr_igi == igi) { - PHYDM_DBG(dm, DBG_ENV_MNTR, - "No need to update FAHM_th, IGI=0x%x\n", - ccx_info->env_mntr_igi); - return; - } - - ccx_info->env_mntr_igi = igi; /*@bkp IGI*/ - - if (igi >= CCA_CAP) - f_th[0] = (igi - CCA_CAP) * IGI_TO_NHM_TH_MULTIPLIER; - else - f_th[0] = 0; - - rssi_th[0] = igi - 10 - CCA_CAP; - - for (i = 1; i <= 10; i++) { - f_th[i] = f_th[0] + th_gap * i; - rssi_th[i] = rssi_th[0] + (i << 1); - } - - PHYDM_DBG(dm, DBG_ENV_MNTR, - "FAHM_RSSI_th[10:0]=[%d, %d, %d, (IGI)%d, %d, %d, %d, %d, %d, %d, %d]\n", - rssi_th[10], rssi_th[9], rssi_th[8], rssi_th[7], rssi_th[6], - rssi_th[5], rssi_th[4], rssi_th[3], rssi_th[2], rssi_th[1], - rssi_th[0]); - - if (dm->support_ic_type & ODM_IC_11AC_SERIES) { - val = BYTE_2_DWORD(0, f_th[2], f_th[1], f_th[0]); - odm_set_bb_reg(dm, R_0x1c38, 0xffffff00, val); - val = BYTE_2_DWORD(0, f_th[5], f_th[4], f_th[3]); - odm_set_bb_reg(dm, R_0x1c78, 0xffffff00, val); - val = BYTE_2_DWORD(0, 0, f_th[7], f_th[6]); - odm_set_bb_reg(dm, R_0x1c7c, 0xffff0000, val); - val = BYTE_2_DWORD(0, f_th[10], f_th[9], f_th[8]); - odm_set_bb_reg(dm, R_0x1cb8, 0xffffff00, val); - } else { - val = BYTE_2_DWORD(f_th[3], f_th[2], f_th[1], f_th[0]); - odm_set_bb_reg(dm, R_0x970, MASKDWORD, val); - val = BYTE_2_DWORD(f_th[7], f_th[6], f_th[5], f_th[4]); - odm_set_bb_reg(dm, R_0x974, MASKDWORD, val); - val = BYTE_2_DWORD(0, f_th[10], f_th[9], f_th[8]); - odm_set_bb_reg(dm, R_0x978, 0xffffff, val); - } -} - -void phydm_fahm_init(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct ccx_info *ccx_info = &dm->dm_ccx_info; - u32 fahm_reg1; - u8 denumerator_sel = 0; - - PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__); - PHYDM_DBG(dm, DBG_ENV_MNTR, "IGI=0x%x\n", - dm->dm_dig_table.cur_ig_value); - - if (dm->support_ic_type & ODM_IC_11AC_SERIES) - fahm_reg1 = 0x994; - else - fahm_reg1 = 0x890; - - ccx_info->fahm_period = 65535; - - odm_set_bb_reg(dm, fahm_reg1, 0x6, 3); /*@FAHM HW block enable*/ - - denumerator_sel = FAHM_INCLD_FA | FAHM_INCLD_CRC_OK | FAHM_INCLD_CRC_ER; - phydm_fahm_set_valid_cnt(dm, FAHM_INCLD_FA, denumerator_sel); - phydm_fahm_set_th_by_igi(dm, dm->dm_dig_table.cur_ig_value); -} - -void phydm_fahm_dbg(void *dm_void, char input[][16], u32 *_used, char *output, - u32 *_out_len) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct ccx_info *ccx_info = &dm->dm_ccx_info; - char help[] = "-h"; - u32 var1[10] = {0}; - u32 used = *_used; - u32 out_len = *_out_len; - u32 i; - - for (i = 0; i < 2; i++) { - if (input[i + 1]) - PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &var1[i]); - } - - if ((strcmp(input[1], help) == 0)) { - PDM_SNPF(out_len, used, output + used, out_len - used, - "{1: trigger, 2:get result}\n"); - PDM_SNPF(out_len, used, output + used, out_len - used, - "{3: MNTR mode sel} {1: driver, 2. FW}\n"); - return; - } else if (var1[0] == 1) { /* Set & trigger CLM */ - - phydm_fahm_set_th_by_igi(dm, dm->dm_dig_table.cur_ig_value); - phydm_fahm_trigger(dm, ccx_info->fahm_period); - PDM_SNPF(out_len, used, output + used, out_len - used, - "Monitor FAHM for %d * 4us\n", ccx_info->fahm_period); - - } else if (var1[0] == 2) { /* @Get CLM results */ - - phydm_fahm_get_result(dm); - PDM_SNPF(out_len, used, output + used, out_len - used, - "FAHM_result=%d us\n", (ccx_info->clm_result << 2)); - - } else { - PDM_SNPF(out_len, used, output + used, out_len - used, - "Error\n"); - } - - *_used = used; - *_out_len = out_len; -} - -#endif /*@#ifdef FAHM_SUPPORT*/ - -#ifdef NHM_SUPPORT - -void phydm_nhm_racing_release(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct ccx_info *ccx = &dm->dm_ccx_info; - u32 value32 = 0; - - PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__); - PHYDM_DBG(dm, DBG_ENV_MNTR, "lv:(%d)->(0)\n", ccx->nhm_set_lv); - - ccx->nhm_ongoing = false; - ccx->nhm_set_lv = NHM_RELEASE; - - if (!(ccx->nhm_app == NHM_BACKGROUND || ccx->nhm_app == NHM_ACS)) { - phydm_pause_func(dm, F00_DIG, PHYDM_RESUME, - PHYDM_PAUSE_LEVEL_1, 1, &value32); - } - - ccx->nhm_app = NHM_BACKGROUND; -} - -u8 phydm_nhm_racing_ctrl(void *dm_void, enum phydm_nhm_level nhm_lv) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct ccx_info *ccx = &dm->dm_ccx_info; - u8 set_result = PHYDM_SET_SUCCESS; - /*@acquire to control NHM API*/ - - PHYDM_DBG(dm, DBG_ENV_MNTR, "nhm_ongoing=%d, lv:(%d)->(%d)\n", - ccx->nhm_ongoing, ccx->nhm_set_lv, nhm_lv); - if (ccx->nhm_ongoing) { - if (nhm_lv <= ccx->nhm_set_lv) { - set_result = PHYDM_SET_FAIL; - } else { - phydm_ccx_hw_restart(dm); - ccx->nhm_ongoing = false; - } - } - - if (set_result) - ccx->nhm_set_lv = nhm_lv; - - PHYDM_DBG(dm, DBG_ENV_MNTR, "nhm racing success=%d\n", set_result); - return set_result; -} - -void phydm_nhm_trigger(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct ccx_info *ccx = &dm->dm_ccx_info; - u32 nhm_reg1 = 0; - - if (dm->support_ic_type & ODM_IC_11AC_SERIES) - nhm_reg1 = R_0x994; - #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT - else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) - nhm_reg1 = R_0x1e60; - #endif - else - nhm_reg1 = R_0x890; - PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__); - - /*Trigger NHM*/ - pdm_set_reg(dm, nhm_reg1, BIT(1), 0); - pdm_set_reg(dm, nhm_reg1, BIT(1), 1); - ccx->nhm_trigger_time = dm->phydm_sys_up_time; - ccx->nhm_rpt_stamp++; - ccx->nhm_ongoing = true; -} - -boolean -phydm_nhm_check_rdy(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - boolean is_ready = false; - u32 reg1 = 0, reg1_bit = 0; -#if (ENV_MNTR_DBG || ENV_MNTR_DBG_1) - u16 i = 0; - u64 start_time = 0, progressing_time = 0; - u32 reg_val_start = 0, reg_val = 0; - u8 print_rpt = 0; -#endif - - if (dm->support_ic_type & ODM_IC_11AC_SERIES) { - reg1 = R_0xfb4; - reg1_bit = 16; - #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT - } else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) { - reg1 = R_0x2d4c; - reg1_bit = 16; - #endif - } else { - reg1 = R_0x8b4; - if (dm->support_ic_type == ODM_RTL8710B) { - reg1_bit = 25; - } else { - reg1_bit = 17; - } - } - -#if (ENV_MNTR_DBG_1) - start_time = odm_get_current_time(dm); - - if (dm->support_ic_type & (ODM_RTL8812 | ODM_RTL8821)) { - PHYDM_DBG(dm, DBG_ENV_MNTR, "NHM_period = %d\n", - odm_get_bb_reg(dm, R_0x990, MASKDWORD)); - - /*NHM trigger bit*/ - reg_val_start = odm_get_bb_reg(dm, R_0x994, BIT(1)); - PHYDM_DBG(dm, DBG_ENV_MNTR, "reg_val_start = %d\n", - reg_val_start); - - for (i = 0; i <= 400; i++) { - if (print_rpt == 0) { - reg_val = odm_get_bb_reg(dm, R_0x994, BIT(1)); - if (reg_val != reg_val_start) { - print_rpt = 1; - PHYDM_DBG(dm, DBG_ENV_MNTR, - "Trig[%d] (%d) -> (%d)\n", - i, reg_val_start, reg_val); - } - } - - if (odm_get_bb_reg(dm, reg1, BIT(reg1_bit))) { - is_ready = true; - break; - } - ODM_delay_ms(1); - } - } else { - if (odm_get_bb_reg(dm, reg1, BIT(reg1_bit))) - is_ready = true; - } - - progressing_time = odm_get_progressing_time(dm, start_time); - PHYDM_DBG(dm, DBG_ENV_MNTR, "NHM rdy=%d, i=%d, NHM_polling_time=%lld\n", - is_ready, i, progressing_time); - -#elif (ENV_MNTR_DBG) - start_time = odm_get_current_time(dm); - for (i = 0; i <= 400; i++) { - if (odm_get_bb_reg(dm, reg1, BIT(reg1_bit))) { - is_ready = true; - break; - } - ODM_delay_ms(1); - } - progressing_time = odm_get_progressing_time(dm, start_time); - PHYDM_DBG(dm, DBG_ENV_MNTR, "NHM rdy=%d, i=%d, NHM_polling_time=%lld\n", - is_ready, i, progressing_time); -#else - if (odm_get_bb_reg(dm, reg1, BIT(reg1_bit))) - is_ready = true; - - PHYDM_DBG(dm, DBG_ENV_MNTR, "NHM rdy=%d\n", is_ready); - -#endif - return is_ready; -} - -void phydm_nhm_get_utility(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct ccx_info *ccx = &dm->dm_ccx_info; - u8 nhm_rpt_non_0 = 0; - - if (ccx->nhm_rpt_sum >= ccx->nhm_result[0]) { - nhm_rpt_non_0 = ccx->nhm_rpt_sum - ccx->nhm_result[0]; - ccx->nhm_ratio = (nhm_rpt_non_0 * 100) >> 8; - } else { - PHYDM_DBG(dm, DBG_ENV_MNTR, "[warning] nhm_rpt_sum invalid\n"); - ccx->nhm_ratio = 0; - } - - PHYDM_DBG(dm, DBG_ENV_MNTR, "nhm_ratio=%d\n", ccx->nhm_ratio); -} - -boolean -phydm_nhm_get_result(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct ccx_info *ccx = &dm->dm_ccx_info; - u32 value32 = 0; - u8 i = 0; - u32 nhm_reg1 = 0; - u16 nhm_rpt_sum_tmp = 0; - - if (dm->support_ic_type & ODM_IC_11AC_SERIES) - nhm_reg1 = R_0x994; - #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT - else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) - nhm_reg1 = R_0x1e60; - #endif - else - nhm_reg1 = R_0x890; - PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__); - - if (!(dm->support_ic_type == ODM_RTL8822C)) - pdm_set_reg(dm, nhm_reg1, BIT(1), 0); - -#if (ENV_MNTR_DBG_2) - PHYDM_DBG(dm, DBG_ENV_MNTR, - "[DBG][3] 0xc50=0x%x, 0x994=0x%x, 0x998=0x%x\n", - odm_get_bb_reg(dm, R_0xc50, MASKDWORD), - odm_get_bb_reg(dm, R_0x994, MASKDWORD), - odm_get_bb_reg(dm, R_0x998, MASKDWORD)); -#endif - - if (!(phydm_nhm_check_rdy(dm))) { - PHYDM_DBG(dm, DBG_ENV_MNTR, "Get NHM report Fail\n"); - phydm_nhm_racing_release(dm); - return false; - } - - if (dm->support_ic_type & ODM_IC_11AC_SERIES) { - value32 = odm_read_4byte(dm, R_0xfa8); - odm_move_memory(dm, &ccx->nhm_result[0], &value32, 4); - - value32 = odm_read_4byte(dm, R_0xfac); - odm_move_memory(dm, &ccx->nhm_result[4], &value32, 4); - - value32 = odm_read_4byte(dm, R_0xfb0); - odm_move_memory(dm, &ccx->nhm_result[8], &value32, 4); - - /*@Get NHM duration*/ - value32 = odm_read_4byte(dm, R_0xfb4); - ccx->nhm_duration = (u16)(value32 & MASKLWORD); - #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT - } else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) { - value32 = odm_read_4byte(dm, R_0x2d40); - odm_move_memory(dm, &ccx->nhm_result[0], &value32, 4); - - value32 = odm_read_4byte(dm, R_0x2d44); - odm_move_memory(dm, &ccx->nhm_result[4], &value32, 4); - - value32 = odm_read_4byte(dm, R_0x2d48); - odm_move_memory(dm, &ccx->nhm_result[8], &value32, 4); - - /*@Get NHM duration*/ - value32 = odm_read_4byte(dm, R_0x2d4c); - ccx->nhm_duration = (u16)(value32 & MASKLWORD); - #endif - } else { - value32 = odm_read_4byte(dm, R_0x8d8); - odm_move_memory(dm, &ccx->nhm_result[0], &value32, 4); - - value32 = odm_read_4byte(dm, R_0x8dc); - odm_move_memory(dm, &ccx->nhm_result[4], &value32, 4); - - value32 = odm_get_bb_reg(dm, R_0x8d0, 0xffff0000); - odm_move_memory(dm, &ccx->nhm_result[8], &value32, 2); - - value32 = odm_read_4byte(dm, R_0x8d4); - - ccx->nhm_result[10] = (u8)((value32 & MASKBYTE2) >> 16); - ccx->nhm_result[11] = (u8)((value32 & MASKBYTE3) >> 24); - - /*@Get NHM duration*/ - ccx->nhm_duration = (u16)(value32 & MASKLWORD); - } - - /* sum all nhm_result */ - if (ccx->nhm_period >= 65530) { - value32 = (ccx->nhm_duration * 100) >> 16; - PHYDM_DBG(dm, DBG_ENV_MNTR, - "NHM valid time = %d, valid: %d percent\n", - ccx->nhm_duration, value32); - } - - for (i = 0; i < NHM_RPT_NUM; i++) - nhm_rpt_sum_tmp += (u16)ccx->nhm_result[i]; - - ccx->nhm_rpt_sum = (u8)nhm_rpt_sum_tmp; - - PHYDM_DBG(dm, DBG_ENV_MNTR, - "NHM_Rpt[%d](H->L)[%d %d %d %d %d %d %d %d %d %d %d %d]\n", - ccx->nhm_rpt_stamp, ccx->nhm_result[11], ccx->nhm_result[10], - ccx->nhm_result[9], ccx->nhm_result[8], ccx->nhm_result[7], - ccx->nhm_result[6], ccx->nhm_result[5], ccx->nhm_result[4], - ccx->nhm_result[3], ccx->nhm_result[2], ccx->nhm_result[1], - ccx->nhm_result[0]); - - phydm_nhm_racing_release(dm); - -#if (ENV_MNTR_DBG_2) - PHYDM_DBG(dm, DBG_ENV_MNTR, - "[DBG][4] 0xc50=0x%x, 0x994=0x%x, 0x998=0x%x\n", - odm_get_bb_reg(dm, R_0xc50, MASKDWORD), - odm_get_bb_reg(dm, R_0x994, MASKDWORD), - odm_get_bb_reg(dm, R_0x998, MASKDWORD)); -#endif - - if (nhm_rpt_sum_tmp > 255) { - PHYDM_DBG(dm, DBG_ENV_MNTR, - "[Warning] Invalid NHM RPT, total=%d\n", - nhm_rpt_sum_tmp); - return false; - } - - return true; -} - -void phydm_nhm_set_th_reg(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct ccx_info *ccx = &dm->dm_ccx_info; - u32 reg1 = 0, reg2 = 0, reg3 = 0, reg4 = 0, reg4_bit = 0; - u32 val = 0; - - PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__); - - if (dm->support_ic_type & ODM_IC_11AC_SERIES) { - reg1 = R_0x994; - reg2 = R_0x998; - reg3 = R_0x99c; - reg4 = R_0x9a0; - reg4_bit = MASKBYTE0; - #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT - } else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) { - reg1 = R_0x1e60; - reg2 = R_0x1e44; - reg3 = R_0x1e48; - reg4 = R_0x1e5c; - reg4_bit = MASKBYTE2; - #endif - } else { - reg1 = R_0x890; - reg2 = R_0x898; - reg3 = R_0x89c; - reg4 = R_0xe28; - reg4_bit = MASKBYTE0; - } - - /*Set NHM threshold*/ /*Unit: PWdB U(8,1)*/ - val = BYTE_2_DWORD(ccx->nhm_th[3], ccx->nhm_th[2], - ccx->nhm_th[1], ccx->nhm_th[0]); - pdm_set_reg(dm, reg2, MASKDWORD, val); - val = BYTE_2_DWORD(ccx->nhm_th[7], ccx->nhm_th[6], - ccx->nhm_th[5], ccx->nhm_th[4]); - pdm_set_reg(dm, reg3, MASKDWORD, val); - pdm_set_reg(dm, reg4, reg4_bit, ccx->nhm_th[8]); - val = BYTE_2_DWORD(0, 0, ccx->nhm_th[10], ccx->nhm_th[9]); - pdm_set_reg(dm, reg1, 0xffff0000, val); - - PHYDM_DBG(dm, DBG_ENV_MNTR, - "Update NHM_th[H->L]=[%d %d %d %d %d %d %d %d %d %d %d]\n", - ccx->nhm_th[10], ccx->nhm_th[9], ccx->nhm_th[8], - ccx->nhm_th[7], ccx->nhm_th[6], ccx->nhm_th[5], - ccx->nhm_th[4], ccx->nhm_th[3], ccx->nhm_th[2], - ccx->nhm_th[1], ccx->nhm_th[0]); -} - -boolean -phydm_nhm_th_update_chk(void *dm_void, enum nhm_application nhm_app, u8 *nhm_th, - u32 *igi_new) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct ccx_info *ccx = &dm->dm_ccx_info; - boolean is_update = false; - u8 igi_curr = phydm_get_igi(dm, BB_PATH_A); - u8 nhm_igi_th_11k_low[NHM_TH_NUM] = {0x12, 0x15, 0x18, 0x1b, 0x1e, - 0x23, 0x28, 0x2c, 0x78, - 0x78, 0x78}; - u8 nhm_igi_th_11k_high[NHM_TH_NUM] = {0x1e, 0x23, 0x28, 0x2d, 0x32, - 0x37, 0x78, 0x78, 0x78, 0x78, - 0x78}; - u8 nhm_igi_th_xbox[NHM_TH_NUM] = {0x1a, 0x2c, 0x2e, 0x30, 0x32, 0x34, - 0x36, 0x38, 0x3a, 0x3c, 0x3d}; - u8 i; - - PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__); - PHYDM_DBG(dm, DBG_ENV_MNTR, "App=%d, nhm_igi=0x%x, igi_curr=0x%x\n", - nhm_app, ccx->nhm_igi, igi_curr); - - if (igi_curr < 0x10) /* Protect for invalid IGI*/ - return false; - - switch (nhm_app) { - case NHM_BACKGROUND: /*@Get IGI form driver parameter(cur_ig_value)*/ - case NHM_ACS: - if (ccx->nhm_igi != igi_curr || ccx->nhm_app != nhm_app) { - is_update = true; - *igi_new = (u32)igi_curr; - nhm_th[0] = (u8)IGI_2_NHM_TH(igi_curr - CCA_CAP); - for (i = 1; i <= 10; i++) - nhm_th[i] = nhm_th[0] + IGI_2_NHM_TH(2 * i); - } - break; - - case IEEE_11K_HIGH: - is_update = true; - *igi_new = 0x2c; - for (i = 0; i < NHM_TH_NUM; i++) - nhm_th[i] = IGI_2_NHM_TH(nhm_igi_th_11k_high[i]); - break; - - case IEEE_11K_LOW: - is_update = true; - *igi_new = 0x20; - for (i = 0; i < NHM_TH_NUM; i++) - nhm_th[i] = IGI_2_NHM_TH(nhm_igi_th_11k_low[i]); - break; - - case INTEL_XBOX: - is_update = true; - *igi_new = 0x36; - for (i = 0; i < NHM_TH_NUM; i++) - nhm_th[i] = IGI_2_NHM_TH(nhm_igi_th_xbox[i]); - break; - - case NHM_DBG: /*@Get IGI form register*/ - igi_curr = phydm_get_igi(dm, BB_PATH_A); - if (ccx->nhm_igi != igi_curr || ccx->nhm_app != nhm_app) { - is_update = true; - *igi_new = (u32)igi_curr; - nhm_th[0] = (u8)IGI_2_NHM_TH(igi_curr - CCA_CAP); - for (i = 1; i <= 10; i++) - nhm_th[i] = nhm_th[0] + IGI_2_NHM_TH(2 * i); - } - break; - } - - if (is_update) { - PHYDM_DBG(dm, DBG_ENV_MNTR, "[Update NHM_TH] igi_RSSI=%d\n", - IGI_2_RSSI(*igi_new)); - - for (i = 0; i < NHM_TH_NUM; i++) { - PHYDM_DBG(dm, DBG_ENV_MNTR, "NHM_th[%d](RSSI) = %d\n", - i, NTH_TH_2_RSSI(nhm_th[i])); - } - } else { - PHYDM_DBG(dm, DBG_ENV_MNTR, "No need to update NHM_TH\n"); - } - return is_update; -} - -void phydm_nhm_set(void *dm_void, enum nhm_option_txon_all include_tx, - enum nhm_option_cca_all include_cca, - enum nhm_divider_opt_all divi_opt, - enum nhm_application nhm_app, u16 period) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct ccx_info *ccx = &dm->dm_ccx_info; - u8 nhm_th[NHM_TH_NUM] = {0}; - u32 igi = 0x20; - u32 reg1 = 0, reg2 = 0; - u32 val_tmp = 0; - - PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__); - - PHYDM_DBG(dm, DBG_ENV_MNTR, - "incld{tx, cca}={%d, %d}, divi_opt=%d, period=%d\n", - include_tx, include_cca, divi_opt, period); - - if (dm->support_ic_type & ODM_IC_11AC_SERIES) { - reg1 = R_0x994; - reg2 = R_0x990; - #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT - } else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) { - reg1 = R_0x1e60; - reg2 = R_0x1e40; - #endif - } else { - reg1 = R_0x890; - reg2 = R_0x894; - } - - /*Set disable_ignore_cca, disable_ignore_txon, ccx_en*/ - if (include_tx != ccx->nhm_include_txon || - include_cca != ccx->nhm_include_cca || - divi_opt != ccx->nhm_divider_opt) { - /* some old ic is not supported on NHM divider option */ - if (dm->support_ic_type & (ODM_RTL8188E | ODM_RTL8723B | - ODM_RTL8195A | ODM_RTL8192E)) { - val_tmp = (u32)((include_tx << 2) | - (include_cca << 1) | 1); - pdm_set_reg(dm, reg1, R_0x700, val_tmp); - } else { - val_tmp = (u32)BIT_2_BYTE(divi_opt, include_tx, - include_cca, 1); - pdm_set_reg(dm, reg1, R_0xf00, val_tmp); - } - ccx->nhm_include_txon = include_tx; - ccx->nhm_include_cca = include_cca; - ccx->nhm_divider_opt = divi_opt; - #if 0 - PHYDM_DBG(dm, DBG_ENV_MNTR, - "val_tmp=%d, incld{tx, cca}={%d, %d}, divi_opt=%d, period=%d\n", - val_tmp, include_tx, include_cca, divi_opt, period); - - PHYDM_DBG(dm, DBG_ENV_MNTR, "0x994=0x%x\n", - odm_get_bb_reg(dm, 0x994, 0xf00)); - #endif - } - - /*Set NHM period*/ - if (period != ccx->nhm_period) { - pdm_set_reg(dm, reg2, MASKHWORD, period); - PHYDM_DBG(dm, DBG_ENV_MNTR, - "Update NHM period ((%d)) -> ((%d))\n", - ccx->nhm_period, period); - - ccx->nhm_period = period; - } - - /*Set NHM threshold*/ - if (phydm_nhm_th_update_chk(dm, nhm_app, &(nhm_th[0]), &igi)) { - /*Pause IGI*/ - if (nhm_app == NHM_BACKGROUND || nhm_app == NHM_ACS) { - PHYDM_DBG(dm, DBG_ENV_MNTR, "DIG Free Run\n"); - } else if (phydm_pause_func(dm, F00_DIG, PHYDM_PAUSE, - PHYDM_PAUSE_LEVEL_1, 1, &igi) - == PAUSE_FAIL) { - PHYDM_DBG(dm, DBG_ENV_MNTR, "pause DIG Fail\n"); - return; - } else { - PHYDM_DBG(dm, DBG_ENV_MNTR, "pause DIG=0x%x\n", igi); - } - ccx->nhm_app = nhm_app; - ccx->nhm_igi = (u8)igi; - odm_move_memory(dm, &ccx->nhm_th[0], &nhm_th, NHM_TH_NUM); - - /*Set NHM th*/ - phydm_nhm_set_th_reg(dm); - } -} - -u8 phydm_nhm_mntr_set(void *dm_void, struct nhm_para_info *nhm_para) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - u16 nhm_time = 0; /*unit: 4us*/ - - PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__); - - if (nhm_para->mntr_time == 0) - return PHYDM_SET_FAIL; - - if (nhm_para->nhm_lv >= NHM_MAX_NUM) { - PHYDM_DBG(dm, DBG_ENV_MNTR, "Wrong LV=%d\n", nhm_para->nhm_lv); - return PHYDM_SET_FAIL; - } - - if (phydm_nhm_racing_ctrl(dm, nhm_para->nhm_lv) == PHYDM_SET_FAIL) - return PHYDM_SET_FAIL; - - if (nhm_para->mntr_time >= 262) - nhm_time = NHM_PERIOD_MAX; - else - nhm_time = nhm_para->mntr_time * MS_TO_4US_RATIO; - - phydm_nhm_set(dm, nhm_para->incld_txon, nhm_para->incld_cca, - nhm_para->div_opt, nhm_para->nhm_app, nhm_time); - - return PHYDM_SET_SUCCESS; -} - -/*@Environment Monitor*/ -boolean -phydm_nhm_mntr_chk(void *dm_void, u16 monitor_time /*unit ms*/) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct ccx_info *ccx = &dm->dm_ccx_info; - struct nhm_para_info nhm_para = {0}; - boolean nhm_chk_result = false; - u32 sys_return_time = 0; - - PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__); - - if (ccx->nhm_manual_ctrl) { - PHYDM_DBG(dm, DBG_ENV_MNTR, "NHM in manual ctrl\n"); - return nhm_chk_result; - } - sys_return_time = ccx->nhm_trigger_time + MAX_ENV_MNTR_TIME; - if (ccx->nhm_app != NHM_BACKGROUND && - (sys_return_time > dm->phydm_sys_up_time)) { - PHYDM_DBG(dm, DBG_ENV_MNTR, - "nhm_app=%d, trigger_time %d, sys_time=%d\n", - ccx->nhm_app, ccx->nhm_trigger_time, - dm->phydm_sys_up_time); - - return nhm_chk_result; - } - - /*@[NHM get result & calculate Utility----------------------------*/ - if (phydm_nhm_get_result(dm)) { - PHYDM_DBG(dm, DBG_ENV_MNTR, "Get NHM_rpt success\n"); - phydm_nhm_get_utility(dm); - } - - /*@[NHM trigger]-------------------------------------------------*/ - nhm_para.incld_txon = NHM_EXCLUDE_TXON; - nhm_para.incld_cca = NHM_EXCLUDE_CCA; - nhm_para.div_opt = NHM_CNT_ALL; - nhm_para.nhm_app = NHM_BACKGROUND; - nhm_para.nhm_lv = NHM_LV_1; - nhm_para.mntr_time = monitor_time; - - nhm_chk_result = phydm_nhm_mntr_set(dm, &nhm_para); - - return nhm_chk_result; -} - -void phydm_nhm_init(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct ccx_info *ccx = &dm->dm_ccx_info; - - PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__); - PHYDM_DBG(dm, DBG_ENV_MNTR, "cur_igi=0x%x\n", - dm->dm_dig_table.cur_ig_value); - - ccx->nhm_app = NHM_BACKGROUND; - ccx->nhm_igi = 0xff; - - /*Set NHM threshold*/ - ccx->nhm_ongoing = false; - ccx->nhm_set_lv = NHM_RELEASE; - - if (phydm_nhm_th_update_chk(dm, ccx->nhm_app, &ccx->nhm_th[0], - (u32 *)&ccx->nhm_igi)) - phydm_nhm_set_th_reg(dm); - - ccx->nhm_period = 0; - - ccx->nhm_include_cca = NHM_CCA_INIT; - ccx->nhm_include_txon = NHM_TXON_INIT; - ccx->nhm_divider_opt = NHM_CNT_INIT; - - ccx->nhm_manual_ctrl = 0; - ccx->nhm_rpt_stamp = 0; -} - -void phydm_nhm_dbg(void *dm_void, char input[][16], u32 *_used, char *output, - u32 *_out_len) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct ccx_info *ccx = &dm->dm_ccx_info; - struct nhm_para_info nhm_para; - char help[] = "-h"; - u32 var1[10] = {0}; - u32 used = *_used; - u32 out_len = *_out_len; - boolean nhm_rpt_success = true; - u8 result_tmp = 0; - u8 i; - - PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]); - - if ((strcmp(input[1], help) == 0)) { - PDM_SNPF(out_len, used, output + used, out_len - used, - "NHM Basic-Trigger 262ms: {1}\n"); - - PDM_SNPF(out_len, used, output + used, out_len - used, - "NHM Adv-Trigger: {2} {Include TXON} {Include CCA}\n{0:Cnt_all, 1:Cnt valid} {App} {LV} {0~262ms}\n"); - - PDM_SNPF(out_len, used, output + used, out_len - used, - "NHM Get Result: {100}\n"); - } else if (var1[0] == 100) { /*@Get NHM results*/ - - PDM_SNPF(out_len, used, output + used, out_len - used, - "IGI=0x%x, rpt_stamp=%d\n", ccx->nhm_igi, - ccx->nhm_rpt_stamp); - - nhm_rpt_success = phydm_nhm_get_result(dm); - - if (nhm_rpt_success) { - for (i = 0; i <= 11; i++) { - result_tmp = ccx->nhm_result[i]; - PDM_SNPF(out_len, used, output + used, - out_len - used, - "nhm_rpt[%d] = %d (%d percent)\n", - i, result_tmp, - (((result_tmp * 100) + 128) >> 8)); - } - } else { - PDM_SNPF(out_len, used, output + used, out_len - used, - "Get NHM_rpt Fail\n"); - } - ccx->nhm_manual_ctrl = 0; - - } else { /*NMH trigger*/ - - ccx->nhm_manual_ctrl = 1; - - for (i = 1; i < 7; i++) { - if (input[i + 1]) { - PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, - &var1[i]); - } - } - - if (var1[0] == 1) { - nhm_para.incld_txon = NHM_EXCLUDE_TXON; - nhm_para.incld_cca = NHM_EXCLUDE_CCA; - nhm_para.div_opt = NHM_CNT_ALL; - nhm_para.nhm_app = NHM_DBG; - nhm_para.nhm_lv = NHM_LV_4; - nhm_para.mntr_time = 262; - } else { - nhm_para.incld_txon = (enum nhm_option_txon_all)var1[1]; - nhm_para.incld_cca = (enum nhm_option_cca_all)var1[2]; - nhm_para.div_opt = (enum nhm_divider_opt_all)var1[3]; - nhm_para.nhm_app = (enum nhm_application)var1[4]; - nhm_para.nhm_lv = (enum phydm_nhm_level)var1[5]; - nhm_para.mntr_time = (u16)var1[6]; - - /* some old ic is not supported on NHM divider option */ - if (dm->support_ic_type & (ODM_RTL8188E | ODM_RTL8723B | - ODM_RTL8195A | ODM_RTL8192E)) { - nhm_para.div_opt = NHM_CNT_ALL; - } - } - - PDM_SNPF(out_len, used, output + used, out_len - used, - "txon=%d, cca=%d, dev=%d, app=%d, lv=%d, time=%d ms\n", - nhm_para.incld_txon, nhm_para.incld_cca, - nhm_para.div_opt, nhm_para.nhm_app, - nhm_para.nhm_lv, nhm_para.mntr_time); - - if (phydm_nhm_mntr_set(dm, &nhm_para) == PHYDM_SET_SUCCESS) - phydm_nhm_trigger(dm); - - PDM_SNPF(out_len, used, output + used, out_len - used, - "IGI=0x%x, rpt_stamp=%d\n", ccx->nhm_igi, - ccx->nhm_rpt_stamp); - - for (i = 0; i <= 10; i++) { - PDM_SNPF(out_len, used, output + used, out_len - used, - "NHM_th[%d] RSSI = %d\n", i, - NTH_TH_2_RSSI(ccx->nhm_th[i])); - } - } - - *_used = used; - *_out_len = out_len; -} -#endif /*@#ifdef NHM_SUPPORT*/ - -#ifdef CLM_SUPPORT - -void phydm_clm_racing_release(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct ccx_info *ccx = &dm->dm_ccx_info; - - PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__); - PHYDM_DBG(dm, DBG_ENV_MNTR, "lv:(%d)->(0)\n", ccx->clm_set_lv); - - ccx->clm_ongoing = false; - ccx->clm_set_lv = CLM_RELEASE; - ccx->clm_app = CLM_BACKGROUND; -} - -u8 phydm_clm_racing_ctrl(void *dm_void, enum phydm_nhm_level clm_lv) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct ccx_info *ccx = &dm->dm_ccx_info; - u8 set_result = PHYDM_SET_SUCCESS; - /*@acquire to control CLM API*/ - - PHYDM_DBG(dm, DBG_ENV_MNTR, "clm_ongoing=%d, lv:(%d)->(%d)\n", - ccx->clm_ongoing, ccx->clm_set_lv, clm_lv); - if (ccx->clm_ongoing) { - if (clm_lv <= ccx->clm_set_lv) { - set_result = PHYDM_SET_FAIL; - } else { - phydm_ccx_hw_restart(dm); - ccx->clm_ongoing = false; - } - } - - if (set_result) - ccx->clm_set_lv = clm_lv; - - PHYDM_DBG(dm, DBG_ENV_MNTR, "clm racing success=%d\n", set_result); - return set_result; -} - -void phydm_clm_c2h_report_handler(void *dm_void, u8 *cmd_buf, u8 cmd_len) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct ccx_info *ccx_info = &dm->dm_ccx_info; - u8 clm_report = cmd_buf[0]; - /*@u8 clm_report_idx = cmd_buf[1];*/ - - if (cmd_len >= 12) - return; - - ccx_info->clm_fw_result_acc += clm_report; - ccx_info->clm_fw_result_cnt++; - - PHYDM_DBG(dm, DBG_ENV_MNTR, "[%d] clm_report= %d\n", - ccx_info->clm_fw_result_cnt, clm_report); -} - -void phydm_clm_h2c(void *dm_void, u16 obs_time, u8 fw_clm_en) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - u8 h2c_val[H2C_MAX_LENGTH] = {0}; - u8 i = 0; - u8 obs_time_idx = 0; - - PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s] ======>\n", __func__); - PHYDM_DBG(dm, DBG_ENV_MNTR, "obs_time_index=%d *4 us\n", obs_time); - - for (i = 1; i <= 16; i++) { - if (obs_time & BIT(16 - i)) { - obs_time_idx = 16 - i; - break; - } - } -#if 0 - obs_time = (2 ^ 16 - 1)~(2 ^ 15) => obs_time_idx = 15 (65535 ~32768) - obs_time = (2 ^ 15 - 1)~(2 ^ 14) => obs_time_idx = 14 - ... - ... - ... - obs_time = (2 ^ 1 - 1)~(2 ^ 0) => obs_time_idx = 0 - -#endif - - h2c_val[0] = obs_time_idx | (((fw_clm_en) ? 1 : 0) << 7); - h2c_val[1] = CLM_MAX_REPORT_TIME; - - PHYDM_DBG(dm, DBG_ENV_MNTR, "PHYDM h2c[0x4d]=0x%x %x %x %x %x %x %x\n", - h2c_val[6], h2c_val[5], h2c_val[4], h2c_val[3], h2c_val[2], - h2c_val[1], h2c_val[0]); - - odm_fill_h2c_cmd(dm, PHYDM_H2C_FW_CLM_MNTR, H2C_MAX_LENGTH, h2c_val); -} - -void phydm_clm_setting(void *dm_void, u16 clm_period /*@4us sample 1 time*/) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct ccx_info *ccx = &dm->dm_ccx_info; - - if (ccx->clm_period != clm_period) { - if (dm->support_ic_type & ODM_IC_11AC_SERIES) - odm_set_bb_reg(dm, R_0x990, MASKLWORD, clm_period); - #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT - else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) - odm_set_bb_reg(dm, R_0x1e40, MASKLWORD, clm_period); - #endif - else if (dm->support_ic_type & ODM_IC_11N_SERIES) - odm_set_bb_reg(dm, R_0x894, MASKLWORD, clm_period); - - ccx->clm_period = clm_period; - PHYDM_DBG(dm, DBG_ENV_MNTR, - "Update CLM period ((%d)) -> ((%d))\n", - ccx->clm_period, clm_period); - } - - PHYDM_DBG(dm, DBG_ENV_MNTR, "Set CLM period=%d * 4us\n", - ccx->clm_period); -} - -void phydm_clm_trigger(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct ccx_info *ccx = &dm->dm_ccx_info; - u32 reg1 = 0; - - if (dm->support_ic_type & ODM_IC_11AC_SERIES) - reg1 = R_0x994; - #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT - else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) - reg1 = R_0x1e60; - #endif - else - reg1 = R_0x890; - PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__); - - odm_set_bb_reg(dm, reg1, BIT(0), 0x0); - odm_set_bb_reg(dm, reg1, BIT(0), 0x1); - - ccx->clm_trigger_time = dm->phydm_sys_up_time; - ccx->clm_rpt_stamp++; - ccx->clm_ongoing = true; -} - -boolean -phydm_clm_check_rdy(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - boolean is_ready = false; - u32 reg1 = 0, reg1_bit = 0; -#if (ENV_MNTR_DBG) - u16 i = 0; - u64 start_time = 0, progressing_time = 0; -#endif - - if (dm->support_ic_type & ODM_IC_11AC_SERIES) { - reg1 = R_0xfa4; - reg1_bit = 16; - #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT - } else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) { - reg1 = R_0x2d88; - reg1_bit = 16; - #endif - } else if (dm->support_ic_type & ODM_IC_11N_SERIES) { - if (dm->support_ic_type == ODM_RTL8710B) { - reg1 = R_0x8b4; - reg1_bit = 24; - } else { - reg1 = R_0x8b4; - reg1_bit = 16; - } - } -#if (ENV_MNTR_DBG) - start_time = odm_get_current_time(dm); - for (i = 0; i <= 400; i++) { - if (odm_get_bb_reg(dm, reg1, BIT(reg1_bit))) { - is_ready = true; - break; - } - ODM_delay_ms(1); - } - progressing_time = odm_get_progressing_time(dm, start_time); - - PHYDM_DBG(dm, DBG_ENV_MNTR, "CLM rdy=%d, i=%d, CLM_polling_time=%lld\n", - is_ready, i, progressing_time); -#else - if (odm_get_bb_reg(dm, reg1, BIT(reg1_bit))) - is_ready = true; - - PHYDM_DBG(dm, DBG_ENV_MNTR, "CLM rdy=%d\n", is_ready); -#endif - return is_ready; -} - -void phydm_clm_get_utility(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct ccx_info *ccx = &dm->dm_ccx_info; - u32 clm_result_tmp; - - if (ccx->clm_period == 0) { - PHYDM_DBG(dm, DBG_ENV_MNTR, "[warning] clm_period = 0\n"); - ccx->clm_ratio = 0; - } else if (ccx->clm_period >= 65530) { - clm_result_tmp = (u32)(ccx->clm_result * 100); - ccx->clm_ratio = (u8)((clm_result_tmp + (1 << 15)) >> 16); - } else { - clm_result_tmp = (u32)(ccx->clm_result * 100); - ccx->clm_ratio = (u8)(clm_result_tmp / (u32)ccx->clm_period); - } -} - -boolean -phydm_clm_get_result(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct ccx_info *ccx_info = &dm->dm_ccx_info; - u32 reg1 = 0; - u32 val = 0; - - if (dm->support_ic_type & ODM_IC_11AC_SERIES) - reg1 = R_0x994; - #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT - else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) - reg1 = R_0x1e60; - #endif - else - reg1 = R_0x890; - if (!(dm->support_ic_type == ODM_RTL8822C)) - odm_set_bb_reg(dm, reg1, BIT(0), 0x0); - if (phydm_clm_check_rdy(dm) == false) { - PHYDM_DBG(dm, DBG_ENV_MNTR, "Get CLM report Fail\n"); - phydm_clm_racing_release(dm); - return false; - } - - if (dm->support_ic_type & ODM_IC_11AC_SERIES) { - val = odm_get_bb_reg(dm, R_0xfa4, MASKLWORD); - ccx_info->clm_result = (u16)val; - #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT - } else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) { - val = odm_get_bb_reg(dm, R_0x2d88, MASKLWORD); - ccx_info->clm_result = (u16)val; - #endif - } else if (dm->support_ic_type & ODM_IC_11N_SERIES) { - val = odm_get_bb_reg(dm, R_0x8d0, MASKLWORD); - ccx_info->clm_result = (u16)val; - } - - PHYDM_DBG(dm, DBG_ENV_MNTR, "CLM result = %d *4 us\n", - ccx_info->clm_result); - phydm_clm_racing_release(dm); - return true; -} - -void phydm_clm_mntr_fw(void *dm_void, u16 monitor_time /*unit ms*/) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct ccx_info *ccx = &dm->dm_ccx_info; - u32 val = 0; - - /*@[Get CLM report]*/ - if (ccx->clm_fw_result_cnt != 0) { - val = ccx->clm_fw_result_acc / ccx->clm_fw_result_cnt; - ccx->clm_ratio = (u8)val; - } else { - ccx->clm_ratio = 0; - } - - PHYDM_DBG(dm, DBG_ENV_MNTR, - "clm_fw_result_acc=%d, clm_fw_result_cnt=%d\n", - ccx->clm_fw_result_acc, ccx->clm_fw_result_cnt); - - ccx->clm_fw_result_acc = 0; - ccx->clm_fw_result_cnt = 0; - - /*@[CLM trigger]*/ - if (monitor_time >= 262) - ccx->clm_period = 65535; - else - ccx->clm_period = monitor_time * MS_TO_4US_RATIO; - - phydm_clm_h2c(dm, ccx->clm_period, true); -} - -u8 phydm_clm_mntr_set(void *dm_void, struct clm_para_info *clm_para) -{ - /*@Driver Monitor CLM*/ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct ccx_info *ccx = &dm->dm_ccx_info; - u16 clm_period = 0; - - if (clm_para->mntr_time == 0) - return PHYDM_SET_FAIL; - - if (clm_para->clm_lv >= CLM_MAX_NUM) { - PHYDM_DBG(dm, DBG_ENV_MNTR, "[WARNING] Wrong LV=%d\n", - clm_para->clm_lv); - return PHYDM_SET_FAIL; - } - - if (phydm_clm_racing_ctrl(dm, (enum phydm_nhm_level)clm_para->clm_lv) == PHYDM_SET_FAIL) - return PHYDM_SET_FAIL; - - if (clm_para->mntr_time >= 262) - clm_period = CLM_PERIOD_MAX; - else - clm_period = clm_para->mntr_time * MS_TO_4US_RATIO; - - ccx->clm_app = clm_para->clm_app; - phydm_clm_setting(dm, clm_period); - - return PHYDM_SET_SUCCESS; -} - -boolean -phydm_clm_mntr_chk(void *dm_void, u16 monitor_time /*unit ms*/) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct ccx_info *ccx = &dm->dm_ccx_info; - struct clm_para_info clm_para = {0}; - boolean clm_chk_result = false; - u32 sys_return_time = 0; - - PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s] ======>\n", __func__); - if (ccx->clm_manual_ctrl) { - PHYDM_DBG(dm, DBG_ENV_MNTR, "CLM in manual ctrl\n"); - return clm_chk_result; - } - - sys_return_time = ccx->clm_trigger_time + MAX_ENV_MNTR_TIME; - - if (ccx->clm_app != CLM_BACKGROUND && - sys_return_time > dm->phydm_sys_up_time) { - PHYDM_DBG(dm, DBG_ENV_MNTR, "trigger_time %d, sys_time=%d\n", - ccx->clm_trigger_time, dm->phydm_sys_up_time); - - return clm_chk_result; - } - - clm_para.clm_app = CLM_BACKGROUND; - clm_para.clm_lv = CLM_LV_1; - clm_para.mntr_time = monitor_time; - if (ccx->clm_mntr_mode == CLM_DRIVER_MNTR) { - /*@[Get CLM report]*/ - if (phydm_clm_get_result(dm)) { - PHYDM_DBG(dm, DBG_ENV_MNTR, "Get CLM_rpt success\n"); - phydm_clm_get_utility(dm); - } - - /*@[CLM trigger]----------------------------------------------*/ - if (phydm_clm_mntr_set(dm, &clm_para) == PHYDM_SET_SUCCESS) - clm_chk_result = true; - } else { - phydm_clm_mntr_fw(dm, monitor_time); - } - - PHYDM_DBG(dm, DBG_ENV_MNTR, "clm_ratio=%d\n", ccx->clm_ratio); - - /*@PHYDM_DBG(dm, DBG_ENV_MNTR, "clm_chk_result=%d\n",clm_chk_result);*/ - - return clm_chk_result; -} - -void phydm_set_clm_mntr_mode(void *dm_void, enum clm_monitor_mode mode) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct ccx_info *ccx_info = &dm->dm_ccx_info; - - if (ccx_info->clm_mntr_mode != mode) { - ccx_info->clm_mntr_mode = mode; - phydm_ccx_hw_restart(dm); - - if (mode == CLM_DRIVER_MNTR) - phydm_clm_h2c(dm, 0, 0); - } -} - -void phydm_clm_init(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct ccx_info *ccx = &dm->dm_ccx_info; - - PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__); - ccx->clm_ongoing = false; - ccx->clm_manual_ctrl = 0; - ccx->clm_mntr_mode = CLM_DRIVER_MNTR; - ccx->clm_period = 0; - ccx->clm_rpt_stamp = 0; - phydm_clm_setting(dm, 65535); -} - -void phydm_clm_dbg(void *dm_void, char input[][16], u32 *_used, char *output, - u32 *_out_len) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct ccx_info *ccx = &dm->dm_ccx_info; - char help[] = "-h"; - u32 var1[10] = {0}; - u32 used = *_used; - u32 out_len = *_out_len; - struct clm_para_info clm_para = {0}; - u32 i; - - for (i = 0; i < 4; i++) { - if (input[i + 1]) - PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &var1[i]); - } - - if ((strcmp(input[1], help) == 0)) { - PDM_SNPF(out_len, used, output + used, out_len - used, - "CLM Driver Basic-Trigger 262ms: {1}\n"); - PDM_SNPF(out_len, used, output + used, out_len - used, - "CLM Driver Adv-Trigger: {2} {app} {LV} {0~262ms}\n"); - PDM_SNPF(out_len, used, output + used, out_len - used, - "CLM FW Trigger: {3} {1:drv, 2:fw}\n"); - PDM_SNPF(out_len, used, output + used, out_len - used, - "CLM Get Result: {100}\n"); - } else if (var1[0] == 100) { /* @Get CLM results */ - - if (phydm_clm_get_result(dm)) - phydm_clm_get_utility(dm); - - PDM_SNPF(out_len, used, output + used, out_len - used, - "clm_rpt_stamp=%d\n", ccx->clm_rpt_stamp); - - PDM_SNPF(out_len, used, output + used, out_len - used, - "clm_ratio:((%d percent)) = (%d us/ %d us)\n", - ccx->clm_ratio, ccx->clm_result << 2, - ccx->clm_period << 2); - - ccx->clm_manual_ctrl = 0; - - } else if (var1[0] == 3) { - phydm_set_clm_mntr_mode(dm, (enum clm_monitor_mode)var1[1]); - PDM_SNPF(out_len, used, output + used, out_len - used, - "CLM mode: %s mode\n", - ((ccx->clm_mntr_mode == CLM_FW_MNTR) ? "FW" : "Drv")); - } else { /* Set & trigger CLM */ - ccx->clm_manual_ctrl = 1; - - if (var1[0] == 1) { - clm_para.clm_app = CLM_BACKGROUND; - clm_para.clm_lv = CLM_LV_4; - clm_para.mntr_time = 262; - ccx->clm_mntr_mode = CLM_DRIVER_MNTR; - - } else if (var1[0] == 2) { - clm_para.clm_app = (enum clm_application)var1[1]; - clm_para.clm_lv = (enum phydm_clm_level)var1[2]; - ccx->clm_mntr_mode = CLM_DRIVER_MNTR; - clm_para.mntr_time = (u16)var1[3]; - - } - - PDM_SNPF(out_len, used, output + used, out_len - used, - "app=%d, lv=%d, mode=%s, time=%d ms\n", - clm_para.clm_app, clm_para.clm_lv, - ((ccx->clm_mntr_mode == CLM_FW_MNTR) ? "FW" : - "driver"), clm_para.mntr_time); - - if (phydm_clm_mntr_set(dm, &clm_para) == PHYDM_SET_SUCCESS) - phydm_clm_trigger(dm); - - PDM_SNPF(out_len, used, output + used, out_len - used, - "clm_rpt_stamp=%d\n", ccx->clm_rpt_stamp); - } - - *_used = used; - *_out_len = out_len; -} - -#endif /*@#ifdef CLM_SUPPORT*/ - -u8 phydm_env_mntr_trigger(void *dm_void, struct nhm_para_info *nhm_para, - struct clm_para_info *clm_para, - struct env_trig_rpt *trig_rpt) -{ -#if (defined(NHM_SUPPORT) && defined(CLM_SUPPORT)) - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct ccx_info *ccx = &dm->dm_ccx_info; - boolean nhm_set_ok = false; - boolean clm_set_ok = false; - u8 trigger_result = 0; - - PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s] ======>\n", __func__); - -#if (ENV_MNTR_DBG_2) - if (dm->support_ic_type & ODM_IC_11AC_SERIES) { - PHYDM_DBG(dm, DBG_ENV_MNTR, - "[DBG][2] 0xc50=0x%x, 0x994=0x%x, 0x998=0x%x\n", - odm_get_bb_reg(dm, R_0xc50, MASKDWORD), - odm_get_bb_reg(dm, R_0x994, MASKDWORD), - odm_get_bb_reg(dm, R_0x998, MASKDWORD)); - #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT - } else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) { - PHYDM_DBG(dm, DBG_ENV_MNTR, - "[DBG][2] 0x1d70=0x%x, 0x1e60=0x%x, 0x1e44=0x%x\n", - odm_get_bb_reg(dm, R_0x1d70, MASKDWORD), - odm_get_bb_reg(dm, R_0x1e60, MASKDWORD), - odm_get_bb_reg(dm, R_0x1e44, MASKDWORD)); - #endif - } -#endif - - /*@[NHM]*/ - nhm_set_ok = phydm_nhm_mntr_set(dm, nhm_para); - - /*@[CLM]*/ - if (ccx->clm_mntr_mode == CLM_DRIVER_MNTR) { - clm_set_ok = phydm_clm_mntr_set(dm, clm_para); - } else if (ccx->clm_mntr_mode == CLM_FW_MNTR) { - phydm_clm_h2c(dm, CLM_PERIOD_MAX, true); - trigger_result |= CLM_SUCCESS; - } - - if (nhm_set_ok) { - phydm_nhm_trigger(dm); - trigger_result |= NHM_SUCCESS; - } - - if (clm_set_ok) { - phydm_clm_trigger(dm); - trigger_result |= CLM_SUCCESS; - } - - /*@monitor for the test duration*/ - ccx->start_time = odm_get_current_time(dm); - - trig_rpt->nhm_rpt_stamp = ccx->nhm_rpt_stamp; - trig_rpt->clm_rpt_stamp = ccx->clm_rpt_stamp; - - PHYDM_DBG(dm, DBG_ENV_MNTR, "nhm_rpt_stamp=%d, clm_rpt_stamp=%d,\n\n", - trig_rpt->nhm_rpt_stamp, trig_rpt->clm_rpt_stamp); - - return trigger_result; -#endif -} - -u8 phydm_env_mntr_result(void *dm_void, struct env_mntr_rpt *rpt) -{ -#if (defined(NHM_SUPPORT) && defined(CLM_SUPPORT)) - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct ccx_info *ccx = &dm->dm_ccx_info; - u8 env_mntr_rpt = 0; - u64 progressing_time = 0; - u32 val_tmp = 0; - - /*@monitor for the test duration*/ - progressing_time = odm_get_progressing_time(dm, ccx->start_time); - PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s] ======>\n", __func__); - PHYDM_DBG(dm, DBG_ENV_MNTR, "env_time=%lld\n", progressing_time); - -#if (ENV_MNTR_DBG_2) - if (dm->support_ic_type & ODM_IC_11AC_SERIES) { - PHYDM_DBG(dm, DBG_ENV_MNTR, - "[DBG][2] 0xc50=0x%x, 0x994=0x%x, 0x998=0x%x\n", - odm_get_bb_reg(dm, R_0xc50, MASKDWORD), - odm_get_bb_reg(dm, R_0x994, MASKDWORD), - odm_get_bb_reg(dm, R_0x998, MASKDWORD)); - #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT - } else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) { - PHYDM_DBG(dm, DBG_ENV_MNTR, - "[DBG][2] 0x1d70=0x%x, 0x1e60=0x%x, 0x1e44=0x%x\n", - odm_get_bb_reg(dm, R_0x1d70, MASKDWORD), - odm_get_bb_reg(dm, R_0x1e60, MASKDWORD), - odm_get_bb_reg(dm, R_0x1e44, MASKDWORD)); - #endif - } -#endif - - /*@Get NHM result*/ - if (phydm_nhm_get_result(dm)) { - PHYDM_DBG(dm, DBG_ENV_MNTR, "Get NHM_rpt success\n"); - phydm_nhm_get_utility(dm); - rpt->nhm_ratio = ccx->nhm_ratio; - env_mntr_rpt |= NHM_SUCCESS; - - odm_move_memory(dm, &rpt->nhm_result[0], - &ccx->nhm_result[0], NHM_RPT_NUM); - } else { - rpt->nhm_ratio = ENV_MNTR_FAIL; - } - - /*@Get CLM result*/ - if (ccx->clm_mntr_mode == CLM_DRIVER_MNTR) { - if (phydm_clm_get_result(dm)) { - PHYDM_DBG(dm, DBG_ENV_MNTR, "Get CLM_rpt success\n"); - phydm_clm_get_utility(dm); - env_mntr_rpt |= CLM_SUCCESS; - rpt->clm_ratio = ccx->clm_ratio; - } else { - rpt->clm_ratio = ENV_MNTR_FAIL; - } - - } else { - if (ccx->clm_fw_result_cnt != 0) { - val_tmp = ccx->clm_fw_result_acc - / ccx->clm_fw_result_cnt; - ccx->clm_ratio = (u8)val_tmp; - } else { - ccx->clm_ratio = 0; - } - - rpt->clm_ratio = ccx->clm_ratio; - PHYDM_DBG(dm, DBG_ENV_MNTR, - "clm_fw_result_acc=%d, clm_fw_result_cnt=%d\n", - ccx->clm_fw_result_acc, ccx->clm_fw_result_cnt); - - ccx->clm_fw_result_acc = 0; - ccx->clm_fw_result_cnt = 0; - env_mntr_rpt |= CLM_SUCCESS; - } - - rpt->nhm_rpt_stamp = ccx->nhm_rpt_stamp; - rpt->clm_rpt_stamp = ccx->clm_rpt_stamp; - - PHYDM_DBG(dm, DBG_ENV_MNTR, - "IGI=0x%x, nhm_ratio=%d, clm_ratio=%d, nhm_rpt_stamp=%d, clm_rpt_stamp=%d\n\n", - ccx->nhm_igi, rpt->nhm_ratio, rpt->clm_ratio, - rpt->nhm_rpt_stamp, rpt->clm_rpt_stamp); - - return env_mntr_rpt; -#endif -} - -/*@Environment Monitor*/ -void phydm_env_mntr_watchdog(void *dm_void) -{ -#if (defined(NHM_SUPPORT) && defined(CLM_SUPPORT)) - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct ccx_info *ccx = &dm->dm_ccx_info; - boolean nhm_chk_ok = false; - boolean clm_chk_ok = false; - - if (!(dm->support_ability & ODM_BB_ENV_MONITOR)) - return; - - PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__); - nhm_chk_ok = phydm_nhm_mntr_chk(dm, 262); /*@monitor 262ms*/ - clm_chk_ok = phydm_clm_mntr_chk(dm, 262); /*@monitor 262ms*/ - - /*@PHYDM_DBG(dm, DBG_ENV_MNTR, "nhm_chk_ok %d\n\n",nhm_chk_ok);*/ - /*@PHYDM_DBG(dm, DBG_ENV_MNTR, "clm_chk_ok %d\n\n",clm_chk_ok);*/ - - if (nhm_chk_ok) - phydm_nhm_trigger(dm); - - if (clm_chk_ok) - phydm_clm_trigger(dm); - - PHYDM_DBG(dm, DBG_ENV_MNTR, - "Summary: nhm_ratio=((%d)) clm_ratio=((%d))\n\n", - ccx->nhm_ratio, ccx->clm_ratio); -#endif -} - -void phydm_env_monitor_init(void *dm_void) -{ -#if (defined(NHM_SUPPORT) && defined(CLM_SUPPORT)) - struct dm_struct *dm = (struct dm_struct *)dm_void; - - if (!(dm->support_ability & ODM_BB_ENV_MONITOR)) - return; - - PHYDM_DBG(dm, DBG_ENV_MNTR, "[%s]===>\n", __func__); - phydm_ccx_hw_restart(dm); - phydm_nhm_init(dm); - phydm_clm_init(dm); -#endif -} - -void phydm_env_mntr_dbg(void *dm_void, char input[][16], u32 *_used, - char *output, u32 *_out_len) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - char help[] = "-h"; - u32 var1[10] = {0}; - u32 used = *_used; - u32 out_len = *_out_len; - struct clm_para_info clm_para = {0}; - struct nhm_para_info nhm_para = {0}; - struct env_mntr_rpt rpt = {0}; - struct env_trig_rpt trig_rpt = {0}; - u8 set_result; - u8 i; - - PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]); - - if ((strcmp(input[1], help) == 0)) { - PDM_SNPF(out_len, used, output + used, out_len - used, - "Basic-Trigger 262ms: {1}\n"); - PDM_SNPF(out_len, used, output + used, out_len - used, - "Get Result: {100}\n"); - } else if (var1[0] == 100) { /* @Get CLM results */ - - set_result = phydm_env_mntr_result(dm, &rpt); - - PDM_SNPF(out_len, used, output + used, out_len - used, - "Set Result=%d\n nhm_ratio=%d clm_ratio=%d\n nhm_rpt_stamp=%d, clm_rpt_stamp=%d,\n", - set_result, rpt.nhm_ratio, rpt.clm_ratio, - rpt.nhm_rpt_stamp, rpt.clm_rpt_stamp); - - for (i = 0; i <= 11; i++) { - PDM_SNPF(out_len, used, output + used, out_len - used, - "nhm_rpt[%d] = %d (%d percent)\n", i, - rpt.nhm_result[i], - (((rpt.nhm_result[i] * 100) + 128) >> 8)); - } - - } else { /* Set & trigger CLM */ - /*nhm para*/ - nhm_para.incld_txon = NHM_EXCLUDE_TXON; - nhm_para.incld_cca = NHM_EXCLUDE_CCA; - nhm_para.div_opt = NHM_CNT_ALL; - nhm_para.nhm_app = NHM_ACS; - nhm_para.nhm_lv = NHM_LV_2; - nhm_para.mntr_time = 262; - - /*@clm para*/ - clm_para.clm_app = CLM_ACS; - clm_para.clm_lv = CLM_LV_2; - clm_para.mntr_time = 262; - - set_result = phydm_env_mntr_trigger(dm, &nhm_para, - &clm_para, &trig_rpt); - - PDM_SNPF(out_len, used, output + used, out_len - used, - "Set Result=%d, nhm_rpt_stamp=%d, clm_rpt_stamp=%d\n", - set_result, trig_rpt.nhm_rpt_stamp, - trig_rpt.clm_rpt_stamp); - } - - *_used = used; - *_out_len = out_len; -} - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/phydm_dynamictxpower.c b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/phydm_dynamictxpower.c deleted file mode 100644 index ceed35fe8bedd9..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/phydm_dynamictxpower.c +++ /dev/null @@ -1,517 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2017 Realtek Corporation. - * - * 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 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. - * - * The full GNU General Public License is included in this distribution in the - * file called LICENSE. - * - * Contact Information: - * wlanfae - * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park, - * Hsinchu 300, Taiwan. - * - * Larry Finger - * - *****************************************************************************/ - -/************************************************************* - * include files - ************************************************************/ -#include "mp_precomp.h" -#include "phydm_precomp.h" - -#ifdef CONFIG_DYNAMIC_TX_TWR - -#ifdef BB_RAM_SUPPORT -void -phydm_2ndtype_dtp_init(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - u8 pwr_offset_minus3, pwr_offset_minus7; - /*@ 2's com, for offset 3dB and 7dB, which 1 step will be 0.25dB*/ - pwr_offset_minus3 = BIT(7) | 0x74; - pwr_offset_minus7 = BIT(7) | 0x64; - odm_set_bb_reg(dm, 0x1e70, 0x00ff0000, pwr_offset_minus3); - odm_set_bb_reg(dm, 0x1e70, 0xff000000, pwr_offset_minus7); -}; - -void -phdm_2ndtype_rd_ram_pwr(void *dm_void, u8 macid) -{ -}; - -void -phdm_2ndtype_wt_ram_pwr(void *dm_void, u8 macid, boolean pwr_offset0_en, - boolean pwr_offset1_en, s8 pwr_offset0, s8 pwr_offset1) -{ - u32 reg_io_0x1e84 = 0; - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct phydm_bb_ram_per_sta *dm_ram_per_sta = NULL; - dm_ram_per_sta = &dm->p_bb_ram_ctrl.pram_sta_ctrl[macid]; - dm_ram_per_sta->tx_pwr_offset0_en = pwr_offset0_en; - dm_ram_per_sta->tx_pwr_offset1_en = pwr_offset1_en; - dm_ram_per_sta->tx_pwr_offset0 = pwr_offset0; - dm_ram_per_sta->tx_pwr_offset1 = pwr_offset1; - reg_io_0x1e84 = (dm_ram_per_sta->hw_igi_en<<7) + dm_ram_per_sta->hw_igi; - reg_io_0x1e84 |= (pwr_offset0_en<<15) + ((pwr_offset0&0x7f)<<8); - reg_io_0x1e84 |= (pwr_offset1_en<<23) + ((pwr_offset1&0x7f)<<16); - reg_io_0x1e84 |= (macid&0x3f)<<24; - reg_io_0x1e84 |= BIT(30); - odm_set_bb_reg(dm, 0x1e84, 0xffffffff, reg_io_0x1e84); -}; - -u8 phydm_pwr_lv_mapping_2ndtype(u8 tx_pwr_lv) -{ - if (tx_pwr_lv == tx_high_pwr_level_level3) - /*PHYDM_2ND_OFFSET_MINUS_11DB;*/ - return PHYDM_2ND_OFFSET_MINUS_7DB; - else if (tx_pwr_lv == tx_high_pwr_level_level2) - return PHYDM_2ND_OFFSET_MINUS_7DB; - else if (tx_pwr_lv == tx_high_pwr_level_level1) - return PHYDM_2ND_OFFSET_MINUS_3DB; - else - return PHYDM_2ND_OFFSET_ZERO; -} - -void phydm_dtp_fill_cmninfo_2ndtype(void *dm_void, u8 macid, u8 dtp_lvl) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct dtp_info *dtp = NULL; - dtp = &dm->phydm_sta_info[macid]->dtp_stat; - if (!(dm->support_ability & ODM_BB_DYNAMIC_TXPWR)) - return; - dtp->dyn_tx_power = phydm_pwr_lv_mapping_2ndtype(dtp_lvl); - PHYDM_DBG(dm, DBG_DYN_TXPWR, - "Fill cmninfo TxPwr: macid=(%d), PwrLv (%d)\n", macid, - dtp->dyn_tx_power); - /* dyn_tx_power is 2 bit at 8822C/14B/98F/12F*/ -} - -#endif - -boolean -phydm_check_rates(void *dm_void, u8 rate_idx) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - u32 check_rate_bitmap0 = 0x08080808; /* @check CCK11M, OFDM54M, MCS7, MCS15*/ - u32 check_rate_bitmap1 = 0x80200808; /* @check MCS23, MCS31, VHT1SS M9, VHT2SS M9*/ - u32 check_rate_bitmap2 = 0x00080200; /* @check VHT3SS M9, VHT4SS M9*/ - u32 bitmap_result; - -#if (RTL8822B_SUPPORT == 1) - if (dm->support_ic_type & ODM_RTL8822B) { - check_rate_bitmap2 &= 0; - check_rate_bitmap1 &= 0xfffff000; - check_rate_bitmap0 &= 0x0fffffff; - } -#endif - -#if (RTL8197F_SUPPORT == 1) - if (dm->support_ic_type & ODM_RTL8197F) { - check_rate_bitmap2 &= 0; - check_rate_bitmap1 &= 0; - check_rate_bitmap0 &= 0x0fffffff; - } -#endif - -#if (RTL8192E_SUPPORT == 1) - if (dm->support_ic_type & ODM_RTL8192E) { - check_rate_bitmap2 &= 0; - check_rate_bitmap1 &= 0; - check_rate_bitmap0 &= 0x0fffffff; - } -#endif - -/*@jj add 20170822*/ -#if (RTL8192F_SUPPORT == 1) - if (dm->support_ic_type & ODM_RTL8192F) { - check_rate_bitmap2 &= 0; - check_rate_bitmap1 &= 0; - check_rate_bitmap0 &= 0x0fffffff; - } -#endif -#if (RTL8721D_SUPPORT == 1) - if (dm->support_ic_type & ODM_RTL8721D) { - check_rate_bitmap2 &= 0; - check_rate_bitmap1 &= 0; - check_rate_bitmap0 &= 0x000fffff; - } -#endif -#if (RTL8821C_SUPPORT == 1) - if (dm->support_ic_type & ODM_RTL8821C) { - check_rate_bitmap2 &= 0; - check_rate_bitmap1 &= 0x003ff000; - check_rate_bitmap0 &= 0x000fffff; - } -#endif - - if (rate_idx >= 64) - bitmap_result = BIT(rate_idx - 64) & check_rate_bitmap2; - else if (rate_idx >= 32) - bitmap_result = BIT(rate_idx - 32) & check_rate_bitmap1; - else if (rate_idx <= 31) - bitmap_result = BIT(rate_idx) & check_rate_bitmap0; - - if (bitmap_result != 0) - return true; - else - return false; -} - -enum rf_path -phydm_check_paths(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - enum rf_path max_path = RF_PATH_A; - - if (dm->num_rf_path == 1) - max_path = RF_PATH_A; - if (dm->num_rf_path == 2) - max_path = RF_PATH_B; - if (dm->num_rf_path == 3) - max_path = RF_PATH_C; - if (dm->num_rf_path == 4) - max_path = RF_PATH_D; - - return max_path; -} - -#ifndef PHYDM_COMMON_API_SUPPORT -u8 phydm_dtp_get_txagc(void *dm_void, enum rf_path path, u8 hw_rate) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - u8 ret = 0xff; - -#if (RTL8192E_SUPPORT == 1) - ret = config_phydm_read_txagc_n(dm, path, hw_rate); -#endif - return ret; -} -#endif - -u8 phydm_search_min_power_index(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - enum rf_path path; - enum rf_path max_path; - u8 min_gain_index = 0x3f; - u8 gain_index; - u8 rate_idx; - - PHYDM_DBG(dm, DBG_DYN_TXPWR, "%s\n", __func__); - max_path = phydm_check_paths(dm); - for (path = 0; path <= max_path; path++) - for (rate_idx = 0; rate_idx < 84; rate_idx++) - if (phydm_check_rates(dm, rate_idx)) { -#ifdef PHYDM_COMMON_API_SUPPORT - /*This is for API support IC : 97F,8822B,92F,8821C*/ - gain_index = phydm_api_get_txagc(dm, path, rate_idx); -#else - /*This is for API non-support IC : 92E */ - gain_index = phydm_dtp_get_txagc(dm, path, rate_idx); -#endif - if (gain_index == 0xff) { - min_gain_index = 0x20; - PHYDM_DBG(dm, DBG_DYN_TXPWR, - "Error Gain idx!! Rewite to: ((%d))\n", min_gain_index); - break; - } - PHYDM_DBG(dm, DBG_DYN_TXPWR, - "Support Rate: ((%d)) -> Gain idx: ((%d))\n", - rate_idx, gain_index); - if (gain_index < min_gain_index) - min_gain_index = gain_index; - } - - return min_gain_index; -} - -void phydm_dynamic_tx_power_init(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - u8 i; - dm->last_dtp_lvl = tx_high_pwr_level_normal; - dm->dynamic_tx_high_power_lvl = tx_high_pwr_level_normal; - for (i = 0; i < 3; i++) { - dm->enhance_pwr_th[i] = 0xff; - } - dm->set_pwr_th[0] = TX_POWER_NEAR_FIELD_THRESH_LVL1; - dm->set_pwr_th[1] = TX_POWER_NEAR_FIELD_THRESH_LVL2; - dm->set_pwr_th[2] = 0xff; - dm->min_power_index = phydm_search_min_power_index(dm); - PHYDM_DBG(dm, DBG_DYN_TXPWR, "DTP init: Min Gain idx: ((%d))\n", - dm->min_power_index); -} - -void phydm_noisy_enhance_hp_th(void *dm_void, u8 noisy_state) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - if (noisy_state == 0) { - dm->enhance_pwr_th[0] = dm->set_pwr_th[0]; - dm->enhance_pwr_th[1] = dm->set_pwr_th[1]; - dm->enhance_pwr_th[2] = dm->set_pwr_th[2]; - } else { - dm->enhance_pwr_th[0] = dm->set_pwr_th[0] + 8; - dm->enhance_pwr_th[1] = dm->set_pwr_th[1] + 5; - dm->enhance_pwr_th[2] = dm->set_pwr_th[2]; - } - PHYDM_DBG(dm, DBG_DYN_TXPWR, - "DTP hp_th: Lv1_th =%d ,Lv2_th = %d ,Lv3_th = %d\n", - dm->enhance_pwr_th[0], dm->enhance_pwr_th[1], - dm->enhance_pwr_th[2]); -} - -u8 phydm_pwr_lvl_check(void *dm_void, u8 input_rssi) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - u8 th0,th1,th2; - th2 = dm->enhance_pwr_th[2]; - th1 = dm->enhance_pwr_th[1]; - th0 = dm->enhance_pwr_th[0]; - if (input_rssi >= th2) - return tx_high_pwr_level_level3; - else if (input_rssi < (th2 - 3) && input_rssi >= th1) - return tx_high_pwr_level_level2; - else if (input_rssi < (th1 - 3) && input_rssi >= th0) - return tx_high_pwr_level_level1; - else if (input_rssi < (th0 - 3)) - return tx_high_pwr_level_normal; - else - return tx_high_pwr_level_unchange; -} - -u8 phydm_pwr_lv_mapping(u8 tx_pwr_lv) -{ - if (tx_pwr_lv == tx_high_pwr_level_level3) - return PHYDM_OFFSET_MINUS_11DB; - else if (tx_pwr_lv == tx_high_pwr_level_level2) - return PHYDM_OFFSET_MINUS_7DB; - else if (tx_pwr_lv == tx_high_pwr_level_level1) - return PHYDM_OFFSET_MINUS_3DB; - else - return PHYDM_OFFSET_ZERO; -} - -void phydm_dynamic_response_power(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - u8 rpwr; - if (!(dm->support_ability & ODM_BB_DYNAMIC_TXPWR)) - return; - if (dm->dynamic_tx_high_power_lvl == tx_high_pwr_level_unchange) { - dm->dynamic_tx_high_power_lvl = dm->last_dtp_lvl; - PHYDM_DBG(dm, DBG_DYN_TXPWR, "RespPwr not change\n"); - return; - } - - PHYDM_DBG(dm, DBG_DYN_TXPWR, - "RespPwr update_DTP_lv: ((%d)) -> ((%d))\n", dm->last_dtp_lvl, - dm->dynamic_tx_high_power_lvl); - dm->last_dtp_lvl = dm->dynamic_tx_high_power_lvl; - rpwr = phydm_pwr_lv_mapping(dm->dynamic_tx_high_power_lvl); - odm_set_mac_reg(dm, ODM_REG_RESP_TX_11AC, BIT(20) | BIT(19) | BIT(18), rpwr); - PHYDM_DBG(dm, DBG_DYN_TXPWR, "RespPwr Set TxPwr: Lv (%d)\n", - dm->dynamic_tx_high_power_lvl); -} - -void phydm_dtp_fill_cmninfo(void *dm_void, u8 macid, u8 dtp_lvl) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct dtp_info *dtp = NULL; - dtp = &dm->phydm_sta_info[macid]->dtp_stat; - if (!(dm->support_ability & ODM_BB_DYNAMIC_TXPWR)) - return; - dtp->dyn_tx_power = phydm_pwr_lv_mapping(dtp_lvl); - PHYDM_DBG(dm, DBG_DYN_TXPWR, - "Fill cmninfo TxPwr: macid=(%d), PwrLv (%d)\n", macid, - dtp->dyn_tx_power); -} - -void phydm_dtp_per_sta(void *dm_void, u8 macid) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct cmn_sta_info *sta = dm->phydm_sta_info[macid]; - struct dtp_info *dtp = NULL; - struct rssi_info *rssi = NULL; - if (is_sta_active(sta)) { - dtp = &sta->dtp_stat; - rssi = &sta->rssi_stat; - dtp->sta_tx_high_power_lvl = phydm_pwr_lvl_check(dm, rssi->rssi); - PHYDM_DBG(dm, DBG_DYN_TXPWR, - "STA=%d , RSSI: %d , GetPwrLv: %d\n", macid, - rssi->rssi, dtp->sta_tx_high_power_lvl); - if (dtp->sta_tx_high_power_lvl == tx_high_pwr_level_unchange - || dtp->sta_tx_high_power_lvl == dtp->sta_last_dtp_lvl) { - dtp->sta_tx_high_power_lvl = dtp->sta_last_dtp_lvl; - PHYDM_DBG(dm, DBG_DYN_TXPWR, - "DTP_lv not change: ((%d))\n", - dtp->sta_tx_high_power_lvl); - return; - } - - PHYDM_DBG(dm, DBG_DYN_TXPWR, - "DTP_lv update: ((%d)) -> ((%d))\n", dm->last_dtp_lvl, - dm->dynamic_tx_high_power_lvl); - dtp->sta_last_dtp_lvl = dtp->sta_tx_high_power_lvl; -#ifdef BB_RAM_SUPPORT - phydm_dtp_fill_cmninfo_2ndtype(dm, macid, dtp->sta_tx_high_power_lvl); -#else - phydm_dtp_fill_cmninfo(dm, macid, dtp->sta_tx_high_power_lvl); -#endif - } -} - - -void odm_set_dyntxpwr(void *dm_void, u8 *desc, u8 macid) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct dtp_info *dtp = NULL; - dtp = &dm->phydm_sta_info[macid]->dtp_stat; - if (!(dm->support_ability & ODM_BB_DYNAMIC_TXPWR)) - return; - if (dm->fill_desc_dyntxpwr) - dm->fill_desc_dyntxpwr(dm, desc, dtp->dyn_tx_power); - else - PHYDM_DBG(dm, DBG_DYN_TXPWR, - "%s: fill_desc_dyntxpwr is null!\n", __func__); - if (dtp->last_tx_power != dtp->dyn_tx_power) { - PHYDM_DBG(dm, DBG_DYN_TXPWR, - "%s: last_offset=%d, txpwr_offset=%d\n", __func__, - dtp->last_tx_power, dtp->dyn_tx_power); - dtp->last_tx_power = dtp->dyn_tx_power; - } -} - -void phydm_dtp_debug(void *dm_void, char input[][16], u32 *_used, char *output, - u32 *_out_len) -{ - u32 used = *_used; - u32 out_len = *_out_len; - - struct dm_struct *dm = (struct dm_struct *)dm_void; - char help[] = "-h"; - u32 var1[3] = {0}; - u8 set_pwr_th1, set_pwr_th2, set_pwr_th3; - u8 i; - - if ((strcmp(input[1], help) == 0)) { - PDM_SNPF(out_len, used, output + used, out_len - used, - "Set DTP threhosld: {1} {TH[0]} {TH[1]} {TH[2]}\n"); - } else { - for (i = 0; i < 3; i++) { - if (input[i + 1]) - PHYDM_SSCANF(input[i + 1], DCMD_HEX, &var1[i]); - } - if (var1[0] == 1) { - for (i = 0; i < 3; i++) - if (var1[i] == 0 || var1[i] > 100) - dm->set_pwr_th[i] = 0xff; - else - dm->set_pwr_th[i] = (u8)var1[1 + i]; - - PDM_SNPF(out_len, used, output + used, out_len - used, - "DTP_TH[0:2] = {%d, %d, %d}\n", - dm->set_pwr_th[0], dm->set_pwr_th[1], - dm->set_pwr_th[2]); - } - } - *_used = used; - *_out_len = out_len; -} - - -void phydm_dynamic_tx_power(void *dm_void) -{ - - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct cmn_sta_info *sta = NULL; - u8 i; - u8 cnt = 0; - u8 rssi_min = dm->rssi_min; - u8 rssi_tmp = 0; - - if (!(dm->support_ability & ODM_BB_DYNAMIC_TXPWR)) - return; - - PHYDM_DBG(dm, DBG_DYN_TXPWR, - "[%s] RSSI_min = %d, Noisy_dec = %d\n", __func__, rssi_min, - dm->noisy_decision); - phydm_noisy_enhance_hp_th(dm, dm->noisy_decision); -#ifndef BB_RAM_SUPPORT - /* Response Power */ - dm->dynamic_tx_high_power_lvl = phydm_pwr_lvl_check(dm, rssi_min); - phydm_dynamic_response_power(dm); -#endif /* #ifndef BB_RAM_SUPPORT */ - /* Per STA Tx power */ - for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) { - phydm_dtp_per_sta(dm, i); - cnt++; - if (cnt >= dm->number_linked_client) - break; - } -} -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - -void phydm_dynamic_tx_power_init_win(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - void *adapter = dm->adapter; - PMGNT_INFO mgnt_info = &((PADAPTER)adapter)->MgntInfo; - HAL_DATA_TYPE *hal_data = GET_HAL_DATA((PADAPTER)adapter); - - mgnt_info->bDynamicTxPowerEnable = false; - - #if DEV_BUS_TYPE == RT_USB_INTERFACE - if (RT_GetInterfaceSelection((PADAPTER)adapter) == - INTF_SEL1_USB_High_Power) { - mgnt_info->bDynamicTxPowerEnable = true; - } - #endif - - hal_data->LastDTPLvl = tx_high_pwr_level_normal; - hal_data->DynamicTxHighPowerLvl = tx_high_pwr_level_normal; - - PHYDM_DBG(dm, DBG_DYN_TXPWR, "[%s] DTP=%d\n", __func__, - mgnt_info->bDynamicTxPowerEnable); -} - -void phydm_dynamic_tx_power_win(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - - if (!(dm->support_ability & ODM_BB_DYNAMIC_TXPWR)) - return; - - #if (RTL8814A_SUPPORT == 1) - if (dm->support_ic_type == ODM_RTL8814A) - odm_dynamic_tx_power_8814a(dm); - #endif - - #if (RTL8821A_SUPPORT == 1) - if (dm->support_ic_type & ODM_RTL8821) { - void *adapter = dm->adapter; - PMGNT_INFO mgnt_info = GetDefaultMgntInfo((PADAPTER)adapter); - - if (mgnt_info->RegRspPwr == 1) { - if (dm->rssi_min > 60) { - /*Resp TXAGC offset = -3dB*/ - odm_set_mac_reg(dm, 0x6d8, 0x1C0000, 1); - } else if (dm->rssi_min < 55) { - /*Resp TXAGC offset = 0dB*/ - odm_set_mac_reg(dm, 0x6d8, 0x1C0000, 0); - } - } - } - #endif -} -#endif /*@#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)*/ -#endif /* @#ifdef CONFIG_DYNAMIC_TX_TWR */ diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/phydm_mp.c b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/phydm_mp.c deleted file mode 100644 index 7d964f5d6ec970..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/phydm_mp.c +++ /dev/null @@ -1,348 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2017 Realtek Corporation. - * - * 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 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. - * - * The full GNU General Public License is included in this distribution in the - * file called LICENSE. - * - * Contact Information: - * wlanfae - * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park, - * Hsinchu 300, Taiwan. - * - * Larry Finger - * - *****************************************************************************/ - -/*@************************************************************ - * include files - ************************************************************/ - -#include "mp_precomp.h" -#include "phydm_precomp.h" - -#ifdef PHYDM_MP_SUPPORT -#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT - -void phydm_mp_set_single_tone_jgr3(void *dm_void, boolean is_single_tone, - u8 path) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct phydm_mp *mp = &dm->dm_mp_table; - u8 start = RF_PATH_A, end = RF_PATH_A; - - switch (path) { - case RF_PATH_A: - case RF_PATH_B: - case RF_PATH_C: - case RF_PATH_D: - start = path; - end = path; - break; - case RF_PATH_AB: - start = RF_PATH_A; - end = RF_PATH_B; - break; -#if (RTL8814B_SUPPORT == 1 || RTL8198F_SUPPORT == 1) - case RF_PATH_AC: - start = RF_PATH_A; - end = RF_PATH_C; - break; - case RF_PATH_AD: - start = RF_PATH_A; - end = RF_PATH_D; - break; - case RF_PATH_BC: - start = RF_PATH_B; - end = RF_PATH_C; - break; - case RF_PATH_BD: - start = RF_PATH_B; - end = RF_PATH_D; - break; - case RF_PATH_CD: - start = RF_PATH_C; - end = RF_PATH_D; - break; - case RF_PATH_ABC: - start = RF_PATH_A; - end = RF_PATH_C; - break; - case RF_PATH_ABD: - start = RF_PATH_A; - end = RF_PATH_D; - break; - case RF_PATH_ACD: - start = RF_PATH_A; - end = RF_PATH_D; - break; - case RF_PATH_BCD: - start = RF_PATH_B; - end = RF_PATH_D; - break; - case RF_PATH_ABCD: - start = RF_PATH_A; - end = RF_PATH_D; - break; -#endif - } - if (is_single_tone) { - mp->rf_reg0 = odm_get_rf_reg(dm, RF_PATH_A, RF_0x00, 0xfffff); -#if 0 - mp->rfe_sel_a_0 = odm_get_bb_reg(dm, R_0x1840, MASKDWORD); - mp->rfe_sel_b_0 = odm_get_bb_reg(dm, R_0x4140, MASKDWORD); - mp->rfe_sel_c_0 = odm_get_bb_reg(dm, R_0x5240, MASKDWORD); - mp->rfe_sel_d_0 = odm_get_bb_reg(dm, R_0x5340, MASKDWORD); - mp->rfe_sel_a_1 = odm_get_bb_reg(dm, R_0x1844, MASKDWORD); - mp->rfe_sel_b_1 = odm_get_bb_reg(dm, R_0x4144, MASKDWORD); - mp->rfe_sel_c_1 = odm_get_bb_reg(dm, R_0x5244, MASKDWORD); - mp->rfe_sel_d_1 = odm_get_bb_reg(dm, R_0x5344, MASKDWORD); -#endif - /* Disable CCK and OFDM */ - odm_set_bb_reg(dm, R_0x1c3c, 0x3, 0x0); - for (start; start <= end; start++) { - /* @Tx mode: RF0x00[19:16]=4'b0010 */ - odm_set_rf_reg(dm, start, RF_0x0, 0xF0000, 0x2); - /* @Lowest RF gain index: RF_0x0[4:0] = 0*/ - odm_set_rf_reg(dm, start, RF_0x0, 0x1F, 0x0); - /* @RF LO enabled */ - odm_set_rf_reg(dm, start, RF_0x58, BIT(1), 0x1); - } - #if (RTL8814B_SUPPORT == 1) - if (dm->support_ic_type & ODM_RTL8814B) { - /* @Tx mode: RF0x00[19:16]=4'b0010 */ - config_phydm_write_rf_syn_8814b(dm, RF_SYN0, RF_0x0, - 0xF0000, 0x2); - /* @Lowest RF gain index: RF_0x0[4:0] = 0*/ - config_phydm_write_rf_syn_8814b(dm, RF_SYN0, RF_0x0, - 0x1F, 0x0); - /* @RF LO enabled */ - config_phydm_write_rf_syn_8814b(dm, RF_SYN0, RF_0x58, - BIT(1), 0x1); - } - #endif - } else { - /* Eable CCK and OFDM */ - odm_set_bb_reg(dm, R_0x1c3c, 0x3, 0x3); - if (!(dm->support_ic_type & ODM_RTL8814B)) { - for (start; start <= end; start++) { - odm_set_rf_reg(dm, start, RF_0x00, 0xfffff, - mp->rf_reg0); - /* RF LO disabled */ - odm_set_rf_reg(dm, start, RF_0x58, BIT(1), - 0x0); - } - } -#if 0 - odm_set_bb_reg(dm, R_0x1840, MASKDWORD, mp->rfe_sel_a_0); - odm_set_bb_reg(dm, R_0x4140, MASKDWORD, mp->rfe_sel_b_0); - odm_set_bb_reg(dm, R_0x5240, MASKDWORD, mp->rfe_sel_c_0); - odm_set_bb_reg(dm, R_0x5340, MASKDWORD, mp->rfe_sel_d_0); - odm_set_bb_reg(dm, R_0x1844, MASKDWORD, mp->rfe_sel_a_1); - odm_set_bb_reg(dm, R_0x4144, MASKDWORD, mp->rfe_sel_b_1); - odm_set_bb_reg(dm, R_0x5244, MASKDWORD, mp->rfe_sel_c_1); - odm_set_bb_reg(dm, R_0x5344, MASKDWORD, mp->rfe_sel_d_1); -#endif - } -} - -void phydm_mp_set_carrier_supp_jgr3(void *dm_void, boolean is_carrier_supp, - u32 rate_index) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct phydm_mp *mp = &dm->dm_mp_table; - - if (is_carrier_supp) { - if (phydm_is_cck_rate(dm, (u8)rate_index)) { - /* @if CCK block on? */ - if (!odm_get_bb_reg(dm, R_0x1c3c, BIT(1))) - odm_set_bb_reg(dm, R_0x1c3c, BIT(1), 1); - - /* @Turn Off All Test mode */ - odm_set_bb_reg(dm, R_0x1ca4, 0x7, 0x0); - - /* @transmit mode */ - odm_set_bb_reg(dm, R_0x1a00, 0x3, 0x2); - /* @turn off scramble setting */ - odm_set_bb_reg(dm, R_0x1a00, 0x8, 0x0); - /* @Set CCK Tx Test Rate, set FTxRate to 1Mbps */ - odm_set_bb_reg(dm, R_0x1a00, 0x3000, 0x0); - } - } else { /* @Stop Carrier Suppression. */ - if (phydm_is_cck_rate(dm, (u8)rate_index)) { - /* @normal mode */ - odm_set_bb_reg(dm, R_0x1a00, 0x3, 0x0); - /* @turn on scramble setting */ - odm_set_bb_reg(dm, R_0x1a00, 0x8, 0x1); - /* @BB Reset */ - odm_set_bb_reg(dm, R_0x1d0c, 0x10000, 0x0); - odm_set_bb_reg(dm, R_0x1d0c, 0x10000, 0x1); - } - } -} -#endif - -void phydm_mp_set_crystal_cap(void *dm_void, u8 crystal_cap) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - - phydm_set_crystal_cap(dm, crystal_cap); -} - -void phydm_mp_set_single_tone(void *dm_void, boolean is_single_tone, u8 path) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - - if (dm->support_ic_type & ODM_IC_JGR3_SERIES) - phydm_mp_set_single_tone_jgr3(dm, is_single_tone, path); -} - -void phydm_mp_set_carrier_supp(void *dm_void, boolean is_carrier_supp, - u32 rate_index) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - - if (dm->support_ic_type & ODM_IC_JGR3_SERIES) - phydm_mp_set_carrier_supp_jgr3(dm, is_carrier_supp, rate_index); -} - -void phydm_mp_set_single_carrier(void *dm_void, boolean is_single_carrier) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct phydm_mp *mp = &dm->dm_mp_table; - - if (is_single_carrier) { - if (dm->support_ic_type & ODM_IC_JGR3_SERIES) { - /* @1. if OFDM block on? */ - if (!odm_get_bb_reg(dm, R_0x1c3c, BIT(0))) - odm_set_bb_reg(dm, R_0x1c3c, BIT(0), 1); - - /* @2. set CCK test mode off, set to CCK normal mode */ - odm_set_bb_reg(dm, R_0x1a00, 0x3, 0); - - /* @3. turn on scramble setting */ - odm_set_bb_reg(dm, R_0x1a00, 0x8, 1); - - /* @4. Turn On single carrier. */ - odm_set_bb_reg(dm, R_0x1ca4, 0x7, OFDM_SINGLE_CARRIER); - } else { - /* @1. if OFDM block on? */ - if (!odm_get_bb_reg(dm, R_0x800, 0x2000000)) - odm_set_bb_reg(dm, R_0x800, 0x2000000, 1); - - /* @2. set CCK test mode off, set to CCK normal mode */ - odm_set_bb_reg(dm, R_0xa00, 0x3, 0); - - /* @3. turn on scramble setting */ - odm_set_bb_reg(dm, R_0xa00, 0x8, 1); - - /* @4. Turn On single carrier. */ - if (dm->support_ic_type & ODM_IC_11AC_SERIES) - odm_set_bb_reg(dm, R_0x914, 0x70000, - OFDM_SINGLE_CARRIER); - else if (dm->support_ic_type & ODM_IC_11N_SERIES) - odm_set_bb_reg(dm, R_0xd00, 0x70000000, - OFDM_SINGLE_CARRIER); - } - } else { /* @Stop Single Carrier. */ - /* @Turn off all test modes. */ - if (dm->support_ic_type & ODM_IC_JGR3_SERIES) - odm_set_bb_reg(dm, R_0x1ca4, 0x7, OFDM_OFF); - else if (dm->support_ic_type & ODM_IC_11AC_SERIES) - odm_set_bb_reg(dm, R_0x914, 0x70000, OFDM_OFF); - else if (dm->support_ic_type & ODM_IC_11N_SERIES) - odm_set_bb_reg(dm, R_0xd00, 0x70000000, OFDM_OFF); - /* @Delay 10 ms */ - ODM_delay_ms(10); - - /* @BB Reset */ - if (dm->support_ic_type & ODM_IC_JGR3_SERIES) { - odm_set_bb_reg(dm, R_0x1d0c, 0x10000, 0x0); - odm_set_bb_reg(dm, R_0x1d0c, 0x10000, 0x1); - } else { - odm_set_bb_reg(dm, R_0x100, 0x100, 0x0); - odm_set_bb_reg(dm, R_0x100, 0x100, 0x1); - } - } -} -void phydm_mp_reset_rx_counters_phy(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - - phydm_reset_bb_hw_cnt(dm); -} - -void phydm_mp_get_tx_ok(void *dm_void, u32 rate_index) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct phydm_mp *mp = &dm->dm_mp_table; - - if (dm->support_ic_type & ODM_IC_JGR3_SERIES) { - if (phydm_is_cck_rate(dm, (u8)rate_index)) - mp->tx_phy_ok_cnt = odm_get_bb_reg(dm, R_0x2de4, - 0xffff); - else - mp->tx_phy_ok_cnt = odm_get_bb_reg(dm, R_0x2de0, - 0xffff); - } else { - if (phydm_is_cck_rate(dm, (u8)rate_index)) - mp->tx_phy_ok_cnt = odm_get_bb_reg(dm, R_0xf50, - 0xffff); - else - mp->tx_phy_ok_cnt = odm_get_bb_reg(dm, R_0xf50, - 0xffff0000); - } -} - -void phydm_mp_get_rx_ok(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct phydm_mp *mp = &dm->dm_mp_table; - - u32 cck_ok = 0, ofdm_ok = 0, ht_ok = 0, vht_ok = 0; - u32 cck_err = 0, ofdm_err = 0, ht_err = 0, vht_err = 0; - - if (dm->support_ic_type & ODM_IC_JGR3_SERIES) { - cck_ok = odm_get_bb_reg(dm, R_0x2c04, 0xffff); - ofdm_ok = odm_get_bb_reg(dm, R_0x2c14, 0xffff); - ht_ok = odm_get_bb_reg(dm, R_0x2c10, 0xffff); - vht_ok = odm_get_bb_reg(dm, R_0x2c0c, 0xffff); - - cck_err = odm_get_bb_reg(dm, R_0x2c04, 0xffff0000); - ofdm_err = odm_get_bb_reg(dm, R_0x2c14, 0xffff0000); - ht_err = odm_get_bb_reg(dm, R_0x2c10, 0xffff0000); - vht_err = odm_get_bb_reg(dm, R_0x2c0c, 0xffff0000); - } else if (dm->support_ic_type & ODM_IC_11AC_SERIES) { - cck_ok = odm_get_bb_reg(dm, R_0xf04, 0x3FFF); - ofdm_ok = odm_get_bb_reg(dm, R_0xf14, 0x3FFF); - ht_ok = odm_get_bb_reg(dm, R_0xf10, 0x3FFF); - vht_ok = odm_get_bb_reg(dm, R_0xf0c, 0x3FFF); - - cck_err = odm_get_bb_reg(dm, R_0xf04, 0x3FFF0000); - ofdm_err = odm_get_bb_reg(dm, R_0xf14, 0x3FFF0000); - ht_err = odm_get_bb_reg(dm, R_0xf10, 0x3FFF0000); - vht_err = odm_get_bb_reg(dm, R_0xf0c, 0x3FFF0000); - } else if (dm->support_ic_type & ODM_IC_11N_SERIES) { - cck_ok = odm_get_bb_reg(dm, R_0xf88, MASKDWORD); - ofdm_ok = odm_get_bb_reg(dm, R_0xf94, 0xffff); - ht_ok = odm_get_bb_reg(dm, R_0xf90, 0xffff); - - cck_err = odm_get_bb_reg(dm, R_0xf84, MASKDWORD); - ofdm_err = odm_get_bb_reg(dm, R_0xf94, 0xffff0000); - ht_err = odm_get_bb_reg(dm, R_0xf90, 0xffff0000); - } - - mp->rx_phy_ok_cnt = cck_ok + ofdm_ok + ht_ok + vht_ok; - mp->rx_phy_crc_err_cnt = cck_err + ofdm_err + ht_err + vht_err; - mp->io_value = (u32)mp->rx_phy_ok_cnt; -} -#endif diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/phydm_pmac_tx_setting.c b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/phydm_pmac_tx_setting.c deleted file mode 100644 index 882283c7b1a7ec..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/phydm_pmac_tx_setting.c +++ /dev/null @@ -1,543 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2017 Realtek Corporation. - * - * 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 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. - * - * The full GNU General Public License is included in this distribution in the - * file called LICENSE. - * - * Contact Information: - * wlanfae - * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park, - * Hsinchu 300, Taiwan. - * - * Larry Finger - * - *****************************************************************************/ - -/*@************************************************************ - * include files - ************************************************************/ - -#include "mp_precomp.h" -#include "phydm_precomp.h" - -#ifdef PHYDM_PMAC_TX_SETTING_SUPPORT -#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT - -void phydm_start_cck_cont_tx_jgr3(void *dm_void, - struct phydm_pmac_info *tx_info) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct phydm_pmac_tx *pmac_tx = &dm->dm_pmac_tx_table; - u8 rate = tx_info->tx_rate; /* @HW rate */ - - /* @if CCK block on? */ - if (!odm_get_bb_reg(dm, R_0x1c3c, BIT(1))) - odm_set_bb_reg(dm, R_0x1c3c, BIT(1), 1); - - /* @Turn Off All Test mode */ - odm_set_bb_reg(dm, R_0x1ca4, 0x7, 0x0); - - odm_set_bb_reg(dm, R_0x1a00, 0x3000, rate); - odm_set_bb_reg(dm, R_0x1a00, 0x3, 0x2); /* @transmit mode */ - odm_set_bb_reg(dm, R_0x1a00, 0x8, 0x1); /* @turn on scramble setting */ - - /* @Fix rate selection issue */ - odm_set_bb_reg(dm, R_0x1a70, 0x4000, 0x1); - /* @set RX weighting for path I & Q to 0 */ - odm_set_bb_reg(dm, R_0x1a14, 0x300, 0x3); - /* @set loopback mode */ - odm_set_bb_reg(dm, R_0x1c3c, 0x10, 0x1); - - pmac_tx->cck_cont_tx = true; - pmac_tx->ofdm_cont_tx = false; -} - -void phydm_stop_cck_cont_tx_jgr3(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct phydm_pmac_tx *pmac_tx = &dm->dm_pmac_tx_table; - - pmac_tx->cck_cont_tx = false; - pmac_tx->ofdm_cont_tx = false; - - odm_set_bb_reg(dm, R_0x1a00, 0x3, 0x0); /* @normal mode */ - odm_set_bb_reg(dm, R_0x1a00, 0x8, 0x1); /* @turn on scramble setting */ - - /* @back to default */ - odm_set_bb_reg(dm, R_0x1a70, 0x4000, 0x0); - odm_set_bb_reg(dm, R_0x1a14, 0x300, 0x0); - odm_set_bb_reg(dm, R_0x1c3c, 0x10, 0x0); - /* @BB Reset */ - odm_set_bb_reg(dm, R_0x1d0c, 0x10000, 0x0); - odm_set_bb_reg(dm, R_0x1d0c, 0x10000, 0x1); -} - -void phydm_start_ofdm_cont_tx_jgr3(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct phydm_pmac_tx *pmac_tx = &dm->dm_pmac_tx_table; - - /* @1. if OFDM block on */ - if (!odm_get_bb_reg(dm, R_0x1c3c, BIT(0))) - odm_set_bb_reg(dm, R_0x1c3c, BIT(0), 1); - - /* @2. set CCK test mode off, set to CCK normal mode */ - odm_set_bb_reg(dm, R_0x1a00, 0x3, 0); - - /* @3. turn on scramble setting */ - odm_set_bb_reg(dm, R_0x1a00, 0x8, 1); - - /* @4. Turn On Continue Tx and turn off the other test modes. */ - odm_set_bb_reg(dm, R_0x1ca4, 0x7, 0x1); - - pmac_tx->cck_cont_tx = false; - pmac_tx->ofdm_cont_tx = true; -} - -void phydm_stop_ofdm_cont_tx_jgr3(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct phydm_pmac_tx *pmac_tx = &dm->dm_pmac_tx_table; - - pmac_tx->cck_cont_tx = false; - pmac_tx->ofdm_cont_tx = false; - - /* @Turn Off All Test mode */ - odm_set_bb_reg(dm, R_0x1ca4, 0x7, 0x0); - - /* @Delay 10 ms */ - ODM_delay_ms(10); - - /* @BB Reset */ - odm_set_bb_reg(dm, R_0x1d0c, 0x10000, 0x0); - odm_set_bb_reg(dm, R_0x1d0c, 0x10000, 0x1); -} - -void phydm_set_single_tone_jgr3(void *dm_void, boolean is_single_tone, - boolean en_pmac_tx, u8 path) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct phydm_pmac_tx *pmac_tx = &dm->dm_pmac_tx_table; - u8 start = RF_PATH_A, end = RF_PATH_A; - - switch (path) { - case RF_PATH_A: - case RF_PATH_B: - case RF_PATH_C: - case RF_PATH_D: - start = path; - end = path; - break; - case RF_PATH_AB: - start = RF_PATH_A; - end = RF_PATH_B; - break; -#if (RTL8814B_SUPPORT || RTL8198F_SUPPORT) - case RF_PATH_AC: - start = RF_PATH_A; - end = RF_PATH_C; - break; - case RF_PATH_AD: - start = RF_PATH_A; - end = RF_PATH_D; - break; - case RF_PATH_BC: - start = RF_PATH_B; - end = RF_PATH_C; - break; - case RF_PATH_BD: - start = RF_PATH_B; - end = RF_PATH_D; - break; - case RF_PATH_CD: - start = RF_PATH_C; - end = RF_PATH_D; - break; - case RF_PATH_ABC: - start = RF_PATH_A; - end = RF_PATH_C; - break; - case RF_PATH_ABD: - start = RF_PATH_A; - end = RF_PATH_D; - break; - case RF_PATH_ACD: - start = RF_PATH_A; - end = RF_PATH_D; - break; - case RF_PATH_BCD: - start = RF_PATH_B; - end = RF_PATH_D; - break; - case RF_PATH_ABCD: - start = RF_PATH_A; - end = RF_PATH_D; - break; -#endif - } - - if (is_single_tone) { - pmac_tx->tx_scailing = odm_get_bb_reg(dm, R_0x81c, MASKDWORD); - - if (!en_pmac_tx) { - phydm_start_ofdm_cont_tx_jgr3(dm); - /*SendPSPoll(pAdapter);*/ - } - - odm_set_bb_reg(dm, R_0x1c68, BIT(24), 0x1); /* @Disable CCA */ - - for (start; start <= end; start++) { - /* @Tx mode: RF0x00[19:16]=4'b0010 */ - /* odm_set_rf_reg(dm, start, RF_0x0, 0xF0000, 0x2); */ - /* @Lowest RF gain index: RF_0x0[4:0] = 0*/ - odm_set_rf_reg(dm, start, RF_0x0, 0x1F, 0x0); - /* @RF LO enabled */ - odm_set_rf_reg(dm, start, RF_0x58, BIT(1), 0x1); - } - #if (RTL8814B_SUPPORT == 1) - if (dm->support_ic_type & ODM_RTL8814B) { - /* @Tx mode: RF0x00[19:16]=4'b0010 */ - /* config_phydm_write_rf_syn_8814b(dm, RF_SYN0, RF_0x0, - * 0xF0000, 0x2); - */ - /* @Lowest RF gain index: RF_0x0[4:0] = 0*/ - config_phydm_write_rf_syn_8814b(dm, RF_SYN0, RF_0x0, - 0x1F, 0x0); - /* @RF LO enabled */ - config_phydm_write_rf_syn_8814b(dm, RF_SYN0, RF_0x58, - BIT(1), 0x1); - } - #endif - odm_set_bb_reg(dm, R_0x81c, 0x001FC000, 0); - } else { - for (start; start <= end; start++) { - /* @RF LO disabled */ - odm_set_rf_reg(dm, start, RF_0x58, BIT(1), 0x0); - } - odm_set_bb_reg(dm, R_0x1c68, BIT(24), 0x0); /* @Enable CCA */ - - if (!en_pmac_tx) - phydm_stop_ofdm_cont_tx_jgr3(dm); - - odm_set_bb_reg(dm, R_0x81c, MASKDWORD, pmac_tx->tx_scailing); - } -} - -void phydm_stop_pmac_tx_jgr3(void *dm_void, struct phydm_pmac_info *tx_info) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct phydm_pmac_tx *pmac_tx = &dm->dm_pmac_tx_table; - u32 tmp = 0; - - if (tx_info->mode == CONT_TX) { - odm_set_bb_reg(dm, R_0x1e70, 0xf, 2); /* TX Stop */ - if (pmac_tx->is_cck_rate) - phydm_stop_cck_cont_tx_jgr3(dm); - else - phydm_stop_ofdm_cont_tx_jgr3(dm); - } else { - if (pmac_tx->is_cck_rate) { - tmp = odm_get_bb_reg(dm, R_0x2de4, MASKLWORD); - odm_set_bb_reg(dm, R_0x1e64, MASKLWORD, tmp + 50); - } - odm_set_bb_reg(dm, R_0x1e70, 0xf, 2); /* TX Stop */ - } - - if (tx_info->mode == OFDM_SINGLE_TONE_TX) { - /* Stop HW TX -> Stop Continuous TX -> Stop RF Setting */ - if (pmac_tx->is_cck_rate) - phydm_stop_cck_cont_tx_jgr3(dm); - else - phydm_stop_ofdm_cont_tx_jgr3(dm); - - phydm_set_single_tone_jgr3(dm, false, true, pmac_tx->path); - } -} - -void phydm_set_mac_phy_txinfo_jgr3(void *dm_void, - struct phydm_pmac_info *tx_info) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct phydm_pmac_tx *pmac_tx = &dm->dm_pmac_tx_table; - u32 tmp = 0; - - odm_set_bb_reg(dm, R_0xa58, 0x003F8000, tx_info->tx_rate); - - /* @0x900[1] ndp_sound */ - odm_set_bb_reg(dm, R_0x900, 0x2, tx_info->ndp_sound); - /* @0x900[27:24] txsc [29:28] bw [31:30] m_stbc */ - tmp = (tx_info->tx_sc) | ((tx_info->bw) << 4) | - ((tx_info->m_stbc - 1) << 6); - odm_set_bb_reg(dm, R_0x900, 0xFF000000, tmp); - - if (pmac_tx->is_ofdm_rate) { - odm_set_bb_reg(dm, R_0x900, 0x1, 0); - odm_set_bb_reg(dm, R_0x900, 0x4, 0); - } else if (pmac_tx->is_ht_rate) { - odm_set_bb_reg(dm, R_0x900, 0x1, 1); - odm_set_bb_reg(dm, R_0x900, 0x4, 0); - } else if (pmac_tx->is_vht_rate) { - odm_set_bb_reg(dm, R_0x900, 0x1, 0); - odm_set_bb_reg(dm, R_0x900, 0x4, 1); - } - - tmp = tx_info->packet_period; /* @for TX interval */ - odm_set_bb_reg(dm, R_0x9b8, 0xffff0000, tmp); -} - -void phydm_set_sig_jgr3(void *dm_void, struct phydm_pmac_info *tx_info) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct phydm_pmac_tx *pmac_tx = &dm->dm_pmac_tx_table; - u32 tmp = 0; - - if (pmac_tx->is_cck_rate) - return; - - /* @L-SIG */ - odm_set_bb_reg(dm, R_0x1eb4, 0xfffff, tx_info->packet_count); - - tmp = BYTE_2_DWORD(0, tx_info->lsig[2], tx_info->lsig[1], - tx_info->lsig[0]); - odm_set_bb_reg(dm, R_0x908, 0xffffff, tmp); -#if 0 - /* @0x924[7:0] = Data init octet */ - tmp = tx_info->packet_pattern; - odm_set_bb_reg(dm, R_0x924, 0xff, tmp); - - if (tx_info->packet_pattern == RANDOM_BY_PN32) - tmp = 0x3; - else - tmp = 0x0; - - odm_set_bb_reg(dm, R_0x914, 0x60000000, tmp); -#endif - if (pmac_tx->is_ht_rate) { - /* @HT SIG */ - tmp = BYTE_2_DWORD(0, tx_info->ht_sig[2], tx_info->ht_sig[1], - tx_info->ht_sig[0]); - odm_set_bb_reg(dm, R_0x90c, 0xffffff, tmp); - tmp = BYTE_2_DWORD(0, tx_info->ht_sig[5], tx_info->ht_sig[4], - tx_info->ht_sig[3]); - odm_set_bb_reg(dm, R_0x910, 0xffffff, tmp); - } else if (pmac_tx->is_vht_rate) { - /* @VHT SIG A/B/serv_field/delimiter */ - tmp = BYTE_2_DWORD(0, tx_info->vht_sig_a[2], - tx_info->vht_sig_a[1], - tx_info->vht_sig_a[0]); - odm_set_bb_reg(dm, R_0x90c, 0xffffff, tmp); - tmp = BYTE_2_DWORD(0, tx_info->vht_sig_a[5], - tx_info->vht_sig_a[4], - tx_info->vht_sig_a[3]); - odm_set_bb_reg(dm, R_0x910, 0xffffff, tmp); - tmp = BYTE_2_DWORD(tx_info->vht_sig_b[3], tx_info->vht_sig_b[2], - tx_info->vht_sig_b[1], - tx_info->vht_sig_b[0]); - odm_set_bb_reg(dm, R_0x914, 0x1FFFFFFF, tmp); - - tmp = tx_info->vht_sig_b_crc; - odm_set_bb_reg(dm, R_0x938, 0xff00, tmp); - - tmp = BYTE_2_DWORD(tx_info->vht_delimiter[3], - tx_info->vht_delimiter[2], - tx_info->vht_delimiter[1], - tx_info->vht_delimiter[0]); - odm_set_bb_reg(dm, R_0x940, MASKDWORD, tmp); - } -} - -void phydm_set_cck_preamble_hdr_jgr3(void *dm_void, - struct phydm_pmac_info *tx_info) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct phydm_pmac_tx *pmac_tx = &dm->dm_pmac_tx_table; - u32 tmp = 0; - - if (!pmac_tx->is_cck_rate) - return; - - tmp = tx_info->packet_count | (tx_info->sfd << 16); - odm_set_bb_reg(dm, R_0x1e64, MASKDWORD, tmp); - tmp = tx_info->signal_field | (tx_info->service_field << 8) | - (tx_info->length << 16); - odm_set_bb_reg(dm, R_0x1e68, MASKDWORD, tmp); - tmp = BYTE_2_DWORD(0, 0, tx_info->crc16[1], tx_info->crc16[0]); - odm_set_bb_reg(dm, R_0x1e6c, 0xffff, tmp); - - if (tx_info->is_short_preamble) - odm_set_bb_reg(dm, R_0x1e6c, BIT(16), 0); - else - odm_set_bb_reg(dm, R_0x1e6c, BIT(16), 1); -} - -void phydm_set_mode_jgr3(void *dm_void, struct phydm_pmac_info *tx_info, - enum phydm_pmac_mode mode) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct phydm_pmac_tx *pmac_tx = &dm->dm_pmac_tx_table; - - if (mode == CONT_TX) { - tx_info->packet_count = 1; - - if (pmac_tx->is_cck_rate) - phydm_start_cck_cont_tx_jgr3(dm, tx_info); - else - phydm_start_ofdm_cont_tx_jgr3(dm); - } else if (mode == OFDM_SINGLE_TONE_TX) { - /* Continuous TX -> HW TX -> RF Setting */ - tx_info->packet_count = 1; - - if (pmac_tx->is_cck_rate) - phydm_start_cck_cont_tx_jgr3(dm, tx_info); - else - phydm_start_ofdm_cont_tx_jgr3(dm); - } else if (mode == PKTS_TX) { - if (pmac_tx->is_cck_rate && tx_info->packet_count == 0) - tx_info->packet_count = 0xffff; - } -} - -void phydm_set_pmac_txon_jgr3(void *dm_void, struct phydm_pmac_info *tx_info) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct phydm_pmac_tx *pmac_tx = &dm->dm_pmac_tx_table; - - odm_set_bb_reg(dm, R_0x1d08, BIT(0), 1); /* Turn on PMAC */ - - /* mac scramble seed setting, only in 8198F */ - #if (RTL8198F_SUPPORT == 1) - if (dm->support_ic_type & ODM_RTL8198F) - if ~(odm_get_bb_reg(dm, R_0x1d10, BIT(16))) - odm_set_bb_reg(dm, R_0x1d10, BIT(16), 1); - #endif - - if (pmac_tx->is_cck_rate) { - odm_set_bb_reg(dm, R_0x1e70, 0xf, 8); /* TX CCK ON */ - odm_set_bb_reg(dm, R_0x1a84, BIT(31), 0); - } else { - odm_set_bb_reg(dm, R_0x1e70, 0xf, 4); /* TX Ofdm ON */ - } - - if (tx_info->mode == OFDM_SINGLE_TONE_TX) - phydm_set_single_tone_jgr3(dm, true, true, pmac_tx->path); -} - -void phydm_set_pmac_tx_jgr3(void *dm_void, struct phydm_pmac_info *tx_info, - enum rf_path mpt_rf_path) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - struct phydm_pmac_tx *pmac_tx = &dm->dm_pmac_tx_table; - - pmac_tx->is_cck_rate = phydm_is_cck_rate(dm, tx_info->tx_rate); - pmac_tx->is_ofdm_rate = phydm_is_ofdm_rate(dm, tx_info->tx_rate); - pmac_tx->is_ht_rate = phydm_is_ht_rate(dm, tx_info->tx_rate); - pmac_tx->is_vht_rate = phydm_is_vht_rate(dm, tx_info->tx_rate); - pmac_tx->path = mpt_rf_path; - - if (!tx_info->en_pmac_tx) { - phydm_stop_pmac_tx_jgr3(dm, tx_info); - return; - } - - phydm_set_mode_jgr3(dm, tx_info, tx_info->mode); - - if (pmac_tx->is_cck_rate) - phydm_set_cck_preamble_hdr_jgr3(dm, tx_info); - else - phydm_set_sig_jgr3(dm, tx_info); - - phydm_set_mac_phy_txinfo_jgr3(dm, tx_info); - phydm_set_pmac_txon_jgr3(dm, tx_info); -} - -void phydm_set_tmac_tx_jgr3(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - - /* Turn on TMAC */ - if (odm_get_bb_reg(dm, R_0x1d08, BIT(0))) - odm_set_bb_reg(dm, R_0x1d08, BIT(0), 0); - - /* mac scramble seed setting, only in 8198F */ - #if (RTL8198F_SUPPORT == 1) - if (dm->support_ic_type & ODM_RTL8198F) - if (odm_get_bb_reg(dm, R_0x1d10, BIT(16))) - odm_set_bb_reg(dm, R_0x1d10, BIT(16), 0); - #endif - - /* Turn on TMAC CCK */ - if ((odm_get_bb_reg(dm, R_0x1a84, BIT(31))) == 0) - odm_set_bb_reg(dm, R_0x1a84, BIT(31), 1); -} -#endif - -void phydm_start_cck_cont_tx(void *dm_void, struct phydm_pmac_info *tx_info) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - - if (dm->support_ic_type & ODM_IC_JGR3_SERIES) - phydm_start_cck_cont_tx_jgr3(dm, tx_info); -} - -void phydm_stop_cck_cont_tx(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - - if (dm->support_ic_type & ODM_IC_JGR3_SERIES) - phydm_stop_cck_cont_tx_jgr3(dm); -} - -void phydm_start_ofdm_cont_tx(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - - if (dm->support_ic_type & ODM_IC_JGR3_SERIES) - phydm_start_ofdm_cont_tx_jgr3(dm); -} - -void phydm_stop_ofdm_cont_tx(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - - if (dm->support_ic_type & ODM_IC_JGR3_SERIES) - phydm_stop_ofdm_cont_tx_jgr3(dm); -} - -void phydm_set_single_tone(void *dm_void, boolean is_single_tone, - boolean en_pmac_tx, u8 path) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - - if (dm->support_ic_type & ODM_IC_JGR3_SERIES) - phydm_set_single_tone_jgr3(dm, is_single_tone, - en_pmac_tx, path); -} - -void phydm_set_pmac_tx(void *dm_void, struct phydm_pmac_info *tx_info, - enum rf_path mpt_rf_path) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - - if (dm->support_ic_type & ODM_IC_JGR3_SERIES) - phydm_set_pmac_tx_jgr3(dm, tx_info, mpt_rf_path); -} - -void phydm_set_tmac_tx(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - - if (dm->support_ic_type & ODM_IC_JGR3_SERIES) - phydm_set_tmac_tx_jgr3(dm); -} - -#endif diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/hal8814areg_odm.h b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/hal8814areg_odm.h deleted file mode 100644 index 1cd40304ae061a..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/hal8814areg_odm.h +++ /dev/null @@ -1,47 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -//============================================================ -/* File Name: hal8814areg_odm.h */ -// -// Description: -// -// This file is for RTL8814A register definition. -// -// -//============================================================ -#ifndef __HAL_8814A_REG_H__ -#define __HAL_8814A_REG_H__ - -// -// Register Definition -// -#define TRX_ANTDIV_PATH 0x860 -#define RX_ANTDIV_PATH 0xb2c -#define ODM_R_A_AGC_CORE1_8814A 0xc50 - - -// -// Bitmap Definition -// -#define BIT_FA_RESET_8814A BIT0 - - -#endif - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_bb.c b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_bb.c deleted file mode 100644 index f928e5391fe4eb..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_bb.c +++ /dev/null @@ -1,4299 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2017 Realtek Corporation. - * - * 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 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. - * - *****************************************************************************/ - -/*Image2HeaderVersion: 2.19*/ -#include "mp_precomp.h" -#include "../phydm_precomp.h" - -#if (RTL8814A_SUPPORT == 1) -static BOOLEAN -CheckPositive( - struct dm_struct *pDM_Odm, - const u32 Condition1, - const u32 Condition2, - const u32 Condition3, - const u32 Condition4 -) -{ - u1Byte _BoardType = ((pDM_Odm->board_type & BIT4) >> 4) << 0 | /* _GLNA*/ - ((pDM_Odm->board_type & BIT3) >> 3) << 1 | /* _GPA*/ - ((pDM_Odm->board_type & BIT7) >> 7) << 2 | /* _ALNA*/ - ((pDM_Odm->board_type & BIT6) >> 6) << 3 | /* _APA */ - ((pDM_Odm->board_type & BIT2) >> 2) << 4; /* _BT*/ - - u32 cond1 = Condition1, cond2 = Condition2, cond3 = Condition3, cond4 = Condition4; - u32 driver1 = pDM_Odm->cut_version << 24 | - (pDM_Odm->support_interface & 0xF0) << 16 | - pDM_Odm->support_platform << 16 | - pDM_Odm->package_type << 12 | - (pDM_Odm->support_interface & 0x0F) << 8 | - _BoardType; - - u32 driver2 = (pDM_Odm->type_glna & 0xFF) << 0 | - (pDM_Odm->type_gpa & 0xFF) << 8 | - (pDM_Odm->type_alna & 0xFF) << 16 | - (pDM_Odm->type_apa & 0xFF) << 24; - -u32 driver3 = 0; - - u32 driver4 = (pDM_Odm->type_glna & 0xFF00) >> 8 | - (pDM_Odm->type_gpa & 0xFF00) | - (pDM_Odm->type_alna & 0xFF00) << 8 | - (pDM_Odm->type_apa & 0xFF00) << 16; - - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, - "===> CheckPositive (cond1, cond2, cond3, cond4) = (0x%X 0x%X 0x%X 0x%X)\n", cond1, cond2, cond3, cond4); - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, - "===> CheckPositive (driver1, driver2, driver3, driver4) = (0x%X 0x%X 0x%X 0x%X)\n", driver1, driver2, driver3, driver4); - - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, - " (Platform, Interface) = (0x%X, 0x%X)\n", pDM_Odm->support_platform, pDM_Odm->support_interface); - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, - " (Board, Package) = (0x%X, 0x%X)\n", pDM_Odm->board_type, pDM_Odm->package_type); - - - /*============== Value Defined Check ===============*/ - /*QFN Type [15:12] and Cut Version [27:24] need to do value check*/ - - if (((cond1 & 0x0000F000) != 0) && ((cond1 & 0x0000F000) != (driver1 & 0x0000F000))) - return FALSE; - if (((cond1 & 0x0F000000) != 0) && ((cond1 & 0x0F000000) != (driver1 & 0x0F000000))) - return FALSE; - - /*=============== Bit Defined Check ================*/ - /* We don't care [31:28] */ - - cond1 &= 0x00FF0FFF; - driver1 &= 0x00FF0FFF; - - if ((cond1 & driver1) == cond1) { - u32 bitMask = 0; - - if ((cond1 & 0x0F) == 0) /* BoardType is DONTCARE*/ - return TRUE; - - if ((cond1 & BIT0) != 0) /*GLNA*/ - bitMask |= 0x000000FF; - if ((cond1 & BIT1) != 0) /*GPA*/ - bitMask |= 0x0000FF00; - if ((cond1 & BIT2) != 0) /*ALNA*/ - bitMask |= 0x00FF0000; - if ((cond1 & BIT3) != 0) /*APA*/ - bitMask |= 0xFF000000; - - if (((cond2 & bitMask) == (driver2 & bitMask)) && ((cond4 & bitMask) == (driver4 & bitMask))) /* BoardType of each RF path is matched*/ - return TRUE; - else - return FALSE; - } else - return FALSE; -} - -/****************************************************************************** -* AGC_TAB.TXT -******************************************************************************/ - -u32 Array_MP_8814A_AGC_TAB[] = { - 0x80000001, 0x00000055, 0x40000000, 0x00000000, - 0x81C, 0xFE000003, - 0x81C, 0xFF000003, - 0x81C, 0xFE020003, - 0x81C, 0xFD040003, - 0x81C, 0xFC060003, - 0x81C, 0xFB080003, - 0x81C, 0xFA0A0003, - 0x81C, 0xF90C0003, - 0x81C, 0xF80E0003, - 0x81C, 0xF7100003, - 0x81C, 0xF6120003, - 0x81C, 0xF5140003, - 0x81C, 0xF4160003, - 0x81C, 0xF3180003, - 0x81C, 0xF21A0003, - 0x81C, 0xF11C0003, - 0x81C, 0xF01E0003, - 0x81C, 0xEF200003, - 0x81C, 0xEE220003, - 0x81C, 0xED240003, - 0x81C, 0xEC260003, - 0x81C, 0xEB280003, - 0x81C, 0xEA2A0003, - 0x81C, 0xE92C0003, - 0x81C, 0xE82E0003, - 0x81C, 0xE7300003, - 0x81C, 0xE6320003, - 0x81C, 0xE5340003, - 0x81C, 0xE4360003, - 0x81C, 0xE3380003, - 0x81C, 0xC53A0003, - 0x81C, 0xC43C0003, - 0x81C, 0xC33E0003, - 0x81C, 0xC2400003, - 0x81C, 0xC1420003, - 0x81C, 0xA8440003, - 0x81C, 0xA7460003, - 0x81C, 0xA6480003, - 0x81C, 0xA54A0003, - 0x81C, 0xA44C0003, - 0x81C, 0xA34E0003, - 0x81C, 0xA2500003, - 0x81C, 0x65520003, - 0x81C, 0x64540003, - 0x81C, 0x63560003, - 0x81C, 0x62580003, - 0x81C, 0x615A0003, - 0x81C, 0x475C0003, - 0x81C, 0x465E0003, - 0x81C, 0x45600003, - 0x81C, 0x44620003, - 0x81C, 0x43640003, - 0x81C, 0x42660003, - 0x81C, 0x41680003, - 0x81C, 0x416A0003, - 0x81C, 0x416C0003, - 0x81C, 0x416E0003, - 0x81C, 0x41700003, - 0x81C, 0x41720003, - 0x81C, 0x41740003, - 0x81C, 0x41760003, - 0x81C, 0x41780003, - 0x81C, 0x417A0003, - 0x81C, 0x417C0003, - 0x81C, 0x417E0003, - 0x90000001, 0x000000aa, 0x40000000, 0x00000000, - 0x81C, 0xFE000003, - 0x81C, 0xFE000003, - 0x81C, 0xFD020003, - 0x81C, 0xFC040003, - 0x81C, 0xFB060003, - 0x81C, 0xFA080003, - 0x81C, 0xF90A0003, - 0x81C, 0xF80C0003, - 0x81C, 0xF70E0003, - 0x81C, 0xF6100003, - 0x81C, 0xF5120003, - 0x81C, 0xF4140003, - 0x81C, 0xF3160003, - 0x81C, 0xF2180003, - 0x81C, 0xF11A0003, - 0x81C, 0xF01C0003, - 0x81C, 0xEF1E0003, - 0x81C, 0xEE200003, - 0x81C, 0xED220003, - 0x81C, 0xEC240003, - 0x81C, 0xEB260003, - 0x81C, 0xEA280003, - 0x81C, 0xE92A0003, - 0x81C, 0xE82C0003, - 0x81C, 0xE72E0003, - 0x81C, 0xE6300003, - 0x81C, 0xE5320003, - 0x81C, 0xE4340003, - 0x81C, 0xE3360003, - 0x81C, 0xC6380003, - 0x81C, 0xC53A0003, - 0x81C, 0xC43C0003, - 0x81C, 0xC33E0003, - 0x81C, 0xC2400003, - 0x81C, 0xA9420003, - 0x81C, 0xA8440003, - 0x81C, 0xA7460003, - 0x81C, 0xA6480003, - 0x81C, 0xA54A0003, - 0x81C, 0xA44C0003, - 0x81C, 0xA34E0003, - 0x81C, 0x66500003, - 0x81C, 0x65520003, - 0x81C, 0x64540003, - 0x81C, 0x63560003, - 0x81C, 0x49580003, - 0x81C, 0x485A0003, - 0x81C, 0x475C0003, - 0x81C, 0x465E0003, - 0x81C, 0x45600003, - 0x81C, 0x44620003, - 0x81C, 0x43640003, - 0x81C, 0x42660003, - 0x81C, 0x41680003, - 0x81C, 0x416A0003, - 0x81C, 0x416C0003, - 0x81C, 0x416E0003, - 0x81C, 0x41700003, - 0x81C, 0x41720003, - 0x81C, 0x41740003, - 0x81C, 0x41760003, - 0x81C, 0x41780003, - 0x81C, 0x417A0003, - 0x81C, 0x417C0003, - 0x81C, 0x417E0003, - 0xA0000000, 0x00000000, - 0x81C, 0xFF000003, - 0x81C, 0xFE020003, - 0x81C, 0xFD040003, - 0x81C, 0xFC060003, - 0x81C, 0xFB080003, - 0x81C, 0xFA0A0003, - 0x81C, 0xF90C0003, - 0x81C, 0xF80E0003, - 0x81C, 0xF7100003, - 0x81C, 0xF6120003, - 0x81C, 0xF5140003, - 0x81C, 0xF4160003, - 0x81C, 0xF3180003, - 0x81C, 0xF21A0003, - 0x81C, 0xF11C0003, - 0x81C, 0xF01E0003, - 0x81C, 0xEF200003, - 0x81C, 0xEE220003, - 0x81C, 0xED240003, - 0x81C, 0xCF260003, - 0x81C, 0xCE280003, - 0x81C, 0xCD2A0003, - 0x81C, 0xCC2C0003, - 0x81C, 0xCB2E0003, - 0x81C, 0xCA300003, - 0x81C, 0xC9320003, - 0x81C, 0xC8340003, - 0x81C, 0xC7360003, - 0x81C, 0xC6380003, - 0x81C, 0xC53A0003, - 0x81C, 0xC43C0003, - 0x81C, 0xA63E0003, - 0x81C, 0xA5400003, - 0x81C, 0xA4420003, - 0x81C, 0xA3440003, - 0x81C, 0xA2460003, - 0x81C, 0xA1480003, - 0x81C, 0x864A0003, - 0x81C, 0x854C0003, - 0x81C, 0x844E0003, - 0x81C, 0x83500003, - 0x81C, 0x66520003, - 0x81C, 0x65540003, - 0x81C, 0x64560003, - 0x81C, 0x63580003, - 0x81C, 0x625A0003, - 0x81C, 0x615C0003, - 0x81C, 0x435E0003, - 0x81C, 0x42600003, - 0x81C, 0x41620003, - 0x81C, 0x27640003, - 0x81C, 0x26660003, - 0x81C, 0x25680003, - 0x81C, 0x246A0003, - 0x81C, 0x236C0003, - 0x81C, 0x226E0003, - 0x81C, 0x21700003, - 0x81C, 0x21720003, - 0x81C, 0x21740003, - 0x81C, 0x21760003, - 0x81C, 0x21780003, - 0x81C, 0x217A0003, - 0x81C, 0x217C0003, - 0x81C, 0x217E0003, - 0x81C, 0x217E0003, - 0xB0000000, 0x00000000, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x81C, 0xFA000103, - 0x81C, 0xF9020103, - 0x81C, 0xF8040103, - 0x81C, 0xF7060103, - 0x81C, 0xF6080103, - 0x81C, 0xF50A0103, - 0x81C, 0xF40C0103, - 0x81C, 0xF30E0103, - 0x81C, 0xF2100103, - 0x81C, 0xF1120103, - 0x81C, 0xF0140103, - 0x81C, 0xEF160103, - 0x81C, 0xEE180103, - 0x81C, 0xED1A0103, - 0x81C, 0xEC1C0103, - 0x81C, 0xEB1E0103, - 0x81C, 0xEA200103, - 0x81C, 0xE9220103, - 0x81C, 0xE8240103, - 0x81C, 0xE7260103, - 0x81C, 0xE6280103, - 0x81C, 0xE52A0103, - 0x81C, 0xE42C0103, - 0x81C, 0xE32E0103, - 0x81C, 0xE2300103, - 0x81C, 0xE1320103, - 0x81C, 0xA5340103, - 0x81C, 0xA4360103, - 0x81C, 0xA3380103, - 0x81C, 0xA23A0103, - 0x81C, 0xA13C0103, - 0x81C, 0x843E0103, - 0x81C, 0x83400103, - 0x81C, 0x82420103, - 0x81C, 0x81440103, - 0x81C, 0x64460103, - 0x81C, 0x63480103, - 0x81C, 0x624A0103, - 0x81C, 0x614C0103, - 0x81C, 0x454E0103, - 0x81C, 0x44500103, - 0x81C, 0x43520103, - 0x81C, 0x42540103, - 0x81C, 0x41560103, - 0x81C, 0x24580103, - 0x81C, 0x235A0103, - 0x81C, 0x225C0103, - 0x81C, 0x055E0103, - 0x81C, 0x04600103, - 0x81C, 0x03620103, - 0x81C, 0x02640103, - 0x81C, 0x01660103, - 0x81C, 0x01680103, - 0x81C, 0x016A0103, - 0x81C, 0x016C0103, - 0x81C, 0x016E0103, - 0x81C, 0x01700103, - 0x81C, 0x01720103, - 0x81C, 0x01740103, - 0x81C, 0x01760103, - 0x81C, 0x01780103, - 0x81C, 0x017A0103, - 0x81C, 0x017C0103, - 0x81C, 0x017E0103, - 0x90000004, 0x00550000, 0x40000000, 0x00000000, - 0x81C, 0xF8000103, - 0x81C, 0xF7020103, - 0x81C, 0xF6040103, - 0x81C, 0xF5060103, - 0x81C, 0xF4080103, - 0x81C, 0xF30A0103, - 0x81C, 0xF20C0103, - 0x81C, 0xF10E0103, - 0x81C, 0xF0100103, - 0x81C, 0xEF120103, - 0x81C, 0xEE140103, - 0x81C, 0xED160103, - 0x81C, 0xEC180103, - 0x81C, 0xEB1A0103, - 0x81C, 0xEA1C0103, - 0x81C, 0xE91E0103, - 0x81C, 0xE8200103, - 0x81C, 0xE7220103, - 0x81C, 0xE6240103, - 0x81C, 0xE5260103, - 0x81C, 0xE4280103, - 0x81C, 0xE32A0103, - 0x81C, 0xE22C0103, - 0x81C, 0xE12E0103, - 0x81C, 0xA5300103, - 0x81C, 0xA4320103, - 0x81C, 0xA3340103, - 0x81C, 0xA2360103, - 0x81C, 0xA1380103, - 0x81C, 0x843A0103, - 0x81C, 0x833C0103, - 0x81C, 0x823E0103, - 0x81C, 0x81400103, - 0x81C, 0x64420103, - 0x81C, 0x63440103, - 0x81C, 0x62460103, - 0x81C, 0x61480103, - 0x81C, 0x454A0103, - 0x81C, 0x444C0103, - 0x81C, 0x434E0103, - 0x81C, 0x42500103, - 0x81C, 0x25520103, - 0x81C, 0x24540103, - 0x81C, 0x23560103, - 0x81C, 0x06580103, - 0x81C, 0x055A0103, - 0x81C, 0x045C0103, - 0x81C, 0x035E0103, - 0x81C, 0x02600103, - 0x81C, 0x01620103, - 0x81C, 0x01640103, - 0x81C, 0x01660103, - 0x81C, 0x01680103, - 0x81C, 0x016A0103, - 0x81C, 0x016C0103, - 0x81C, 0x016E0103, - 0x81C, 0x01700103, - 0x81C, 0x01720103, - 0x81C, 0x01740103, - 0x81C, 0x01760103, - 0x81C, 0x01780103, - 0x81C, 0x017A0103, - 0x81C, 0x017C0103, - 0x81C, 0x017E0103, - 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x81C, 0xFC000103, - 0x81C, 0xFB020103, - 0x81C, 0xFA040103, - 0x81C, 0xF9060103, - 0x81C, 0xF8080103, - 0x81C, 0xF70A0103, - 0x81C, 0xF60C0103, - 0x81C, 0xF50E0103, - 0x81C, 0xF4100103, - 0x81C, 0xF3120103, - 0x81C, 0xF2140103, - 0x81C, 0xF1160103, - 0x81C, 0xF0180103, - 0x81C, 0xEF1A0103, - 0x81C, 0xEE1C0103, - 0x81C, 0xED1E0103, - 0x81C, 0xEC200103, - 0x81C, 0xEB220103, - 0x81C, 0xEA240103, - 0x81C, 0xE9260103, - 0x81C, 0xE8280103, - 0x81C, 0xE72A0103, - 0x81C, 0xE62C0103, - 0x81C, 0xE52E0103, - 0x81C, 0xE4300103, - 0x81C, 0xE3320103, - 0x81C, 0xE2340103, - 0x81C, 0xE1360103, - 0x81C, 0x87380103, - 0x81C, 0x863A0103, - 0x81C, 0x853C0103, - 0x81C, 0x843E0103, - 0x81C, 0x83400103, - 0x81C, 0x82420103, - 0x81C, 0x81440103, - 0x81C, 0x64460103, - 0x81C, 0x63480103, - 0x81C, 0x624A0103, - 0x81C, 0x464C0103, - 0x81C, 0x454E0103, - 0x81C, 0x44500103, - 0x81C, 0x43520103, - 0x81C, 0x26540103, - 0x81C, 0x25560103, - 0x81C, 0x24580103, - 0x81C, 0x075A0103, - 0x81C, 0x065C0103, - 0x81C, 0x055E0103, - 0x81C, 0x04600103, - 0x81C, 0x03620103, - 0x81C, 0x02640103, - 0x81C, 0x01660103, - 0x81C, 0x01680103, - 0x81C, 0x016A0103, - 0x81C, 0x016C0103, - 0x81C, 0x016E0103, - 0x81C, 0x01700103, - 0x81C, 0x01720103, - 0x81C, 0x01740103, - 0x81C, 0x01760103, - 0x81C, 0x01780103, - 0x81C, 0x017A0103, - 0x81C, 0x017C0103, - 0x81C, 0x017E0103, - 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, - 0x81C, 0xF9000103, - 0x81C, 0xF8020103, - 0x81C, 0xF7040103, - 0x81C, 0xF6060103, - 0x81C, 0xF5080103, - 0x81C, 0xF40A0103, - 0x81C, 0xF30C0103, - 0x81C, 0xF20E0103, - 0x81C, 0xF1100103, - 0x81C, 0xF0120103, - 0x81C, 0xEF140103, - 0x81C, 0xEE160103, - 0x81C, 0xED180103, - 0x81C, 0xEC1A0103, - 0x81C, 0xEB1C0103, - 0x81C, 0xEA1E0103, - 0x81C, 0xE9200103, - 0x81C, 0xE8220103, - 0x81C, 0xE7240103, - 0x81C, 0xE6260103, - 0x81C, 0xE5280103, - 0x81C, 0xE42A0103, - 0x81C, 0xE32C0103, - 0x81C, 0xE22E0103, - 0x81C, 0xA6300103, - 0x81C, 0xA5320103, - 0x81C, 0xA4340103, - 0x81C, 0xA3360103, - 0x81C, 0xA2380103, - 0x81C, 0xA13A0103, - 0x81C, 0x843C0103, - 0x81C, 0x833E0103, - 0x81C, 0x82400103, - 0x81C, 0x81420103, - 0x81C, 0x64440103, - 0x81C, 0x63460103, - 0x81C, 0x62480103, - 0x81C, 0x614A0103, - 0x81C, 0x444C0103, - 0x81C, 0x434E0103, - 0x81C, 0x42500103, - 0x81C, 0x41520103, - 0x81C, 0x25540103, - 0x81C, 0x24560103, - 0x81C, 0x23580103, - 0x81C, 0x225A0103, - 0x81C, 0x055C0103, - 0x81C, 0x045E0103, - 0x81C, 0x03600103, - 0x81C, 0x02620103, - 0x81C, 0x01640103, - 0x81C, 0x01660103, - 0x81C, 0x01680103, - 0x81C, 0x016A0103, - 0x81C, 0x016C0103, - 0x81C, 0x016E0103, - 0x81C, 0x01700103, - 0x81C, 0x01720103, - 0x81C, 0x01740103, - 0x81C, 0x01760103, - 0x81C, 0x01780103, - 0x81C, 0x017A0103, - 0x81C, 0x017C0103, - 0x81C, 0x017E0103, - 0x90000004, 0x00000000, 0x40000000, 0x00550000, - 0x81C, 0xFD000103, - 0x81C, 0xFC020103, - 0x81C, 0xFB040103, - 0x81C, 0xFA060103, - 0x81C, 0xF9080103, - 0x81C, 0xF80A0103, - 0x81C, 0xF70C0103, - 0x81C, 0xF60E0103, - 0x81C, 0xF5100103, - 0x81C, 0xF4120103, - 0x81C, 0xF3140103, - 0x81C, 0xF2160103, - 0x81C, 0xF1180103, - 0x81C, 0xF01A0103, - 0x81C, 0xEF1C0103, - 0x81C, 0xEE1E0103, - 0x81C, 0xED200103, - 0x81C, 0xEC220103, - 0x81C, 0xEB240103, - 0x81C, 0xEA260103, - 0x81C, 0xE9280103, - 0x81C, 0xE82A0103, - 0x81C, 0xE72C0103, - 0x81C, 0xE62E0103, - 0x81C, 0xE5300103, - 0x81C, 0xE4320103, - 0x81C, 0xE3340103, - 0x81C, 0xE2360103, - 0x81C, 0xE1380103, - 0x81C, 0xA33A0103, - 0x81C, 0xA23C0103, - 0x81C, 0xA13E0103, - 0x81C, 0x84400103, - 0x81C, 0x83420103, - 0x81C, 0x82440103, - 0x81C, 0x81460103, - 0x81C, 0x64480103, - 0x81C, 0x634A0103, - 0x81C, 0x624C0103, - 0x81C, 0x614E0103, - 0x81C, 0x45500103, - 0x81C, 0x44520103, - 0x81C, 0x43540103, - 0x81C, 0x42560103, - 0x81C, 0x25580103, - 0x81C, 0x245A0103, - 0x81C, 0x235C0103, - 0x81C, 0x065E0103, - 0x81C, 0x05600103, - 0x81C, 0x04620103, - 0x81C, 0x03640103, - 0x81C, 0x02660103, - 0x81C, 0x01680103, - 0x81C, 0x016A0103, - 0x81C, 0x016C0103, - 0x81C, 0x016E0103, - 0x81C, 0x01700103, - 0x81C, 0x01720103, - 0x81C, 0x01740103, - 0x81C, 0x01760103, - 0x81C, 0x01780103, - 0x81C, 0x017A0103, - 0x81C, 0x017C0103, - 0x81C, 0x017E0103, - 0xA0000000, 0x00000000, - 0x81C, 0xFF000103, - 0x81C, 0xFE020103, - 0x81C, 0xFD040103, - 0x81C, 0xFC060103, - 0x81C, 0xFB080103, - 0x81C, 0xFA0A0103, - 0x81C, 0xF90C0103, - 0x81C, 0xF80E0103, - 0x81C, 0xF7100103, - 0x81C, 0xF6120103, - 0x81C, 0xF5140103, - 0x81C, 0xF4160103, - 0x81C, 0xF3180103, - 0x81C, 0xF21A0103, - 0x81C, 0xF11C0103, - 0x81C, 0xF01E0103, - 0x81C, 0xEF200103, - 0x81C, 0xEE220103, - 0x81C, 0xED240103, - 0x81C, 0xEC260103, - 0x81C, 0xEB280103, - 0x81C, 0xEA2A0103, - 0x81C, 0xE92C0103, - 0x81C, 0xE82E0103, - 0x81C, 0xE7300103, - 0x81C, 0xE6320103, - 0x81C, 0xE5340103, - 0x81C, 0xE4360103, - 0x81C, 0xE3380103, - 0x81C, 0xE23A0103, - 0x81C, 0xE13C0103, - 0x81C, 0xA43E0103, - 0x81C, 0xA3400103, - 0x81C, 0xA2420103, - 0x81C, 0xA1440103, - 0x81C, 0x86460103, - 0x81C, 0x85480103, - 0x81C, 0x844A0103, - 0x81C, 0x834C0103, - 0x81C, 0x824E0103, - 0x81C, 0x81500103, - 0x81C, 0x64520103, - 0x81C, 0x63540103, - 0x81C, 0x62560103, - 0x81C, 0x61580103, - 0x81C, 0x435A0103, - 0x81C, 0x425C0103, - 0x81C, 0x415E0103, - 0x81C, 0x25600103, - 0x81C, 0x24620103, - 0x81C, 0x06640103, - 0x81C, 0x05660103, - 0x81C, 0x04680103, - 0x81C, 0x036A0103, - 0x81C, 0x026C0103, - 0x81C, 0x016E0103, - 0x81C, 0x01700103, - 0x81C, 0x01720103, - 0x81C, 0x01740103, - 0x81C, 0x01760103, - 0x81C, 0x01780103, - 0x81C, 0x017A0103, - 0x81C, 0x017C0103, - 0x81C, 0x017E0103, - 0xB0000000, 0x00000000, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x81C, 0xFC000203, - 0x81C, 0xFB020203, - 0x81C, 0xFA040203, - 0x81C, 0xF9060203, - 0x81C, 0xF8080203, - 0x81C, 0xF70A0203, - 0x81C, 0xF60C0203, - 0x81C, 0xF50E0203, - 0x81C, 0xF4100203, - 0x81C, 0xF3120203, - 0x81C, 0xF2140203, - 0x81C, 0xF1160203, - 0x81C, 0xF0180203, - 0x81C, 0xEF1A0203, - 0x81C, 0xEE1C0203, - 0x81C, 0xED1E0203, - 0x81C, 0xEC200203, - 0x81C, 0xEB220203, - 0x81C, 0xEA240203, - 0x81C, 0xE9260203, - 0x81C, 0xE8280203, - 0x81C, 0xE72A0203, - 0x81C, 0xE62C0203, - 0x81C, 0xE52E0203, - 0x81C, 0xE4300203, - 0x81C, 0xE3320203, - 0x81C, 0xE2340203, - 0x81C, 0xE1360203, - 0x81C, 0xA5380203, - 0x81C, 0xA43A0203, - 0x81C, 0xA33C0203, - 0x81C, 0x853E0203, - 0x81C, 0x84400203, - 0x81C, 0x83420203, - 0x81C, 0x82440203, - 0x81C, 0x81460203, - 0x81C, 0x64480203, - 0x81C, 0x634A0203, - 0x81C, 0x624C0203, - 0x81C, 0x614E0203, - 0x81C, 0x46500203, - 0x81C, 0x45520203, - 0x81C, 0x44540203, - 0x81C, 0x43560203, - 0x81C, 0x25580203, - 0x81C, 0x245A0203, - 0x81C, 0x235C0203, - 0x81C, 0x075E0203, - 0x81C, 0x06600203, - 0x81C, 0x05620203, - 0x81C, 0x04640203, - 0x81C, 0x03660203, - 0x81C, 0x02680203, - 0x81C, 0x016A0203, - 0x81C, 0x016C0203, - 0x81C, 0x016E0203, - 0x81C, 0x01700203, - 0x81C, 0x01720203, - 0x81C, 0x01740203, - 0x81C, 0x01760203, - 0x81C, 0x01780203, - 0x81C, 0x017A0203, - 0x81C, 0x017C0203, - 0x81C, 0x017E0203, - 0x90000004, 0x00550000, 0x40000000, 0x00000000, - 0x81C, 0xF8000203, - 0x81C, 0xF7020203, - 0x81C, 0xF6040203, - 0x81C, 0xF5060203, - 0x81C, 0xF4080203, - 0x81C, 0xF30A0203, - 0x81C, 0xF20C0203, - 0x81C, 0xF10E0203, - 0x81C, 0xF0100203, - 0x81C, 0xEF120203, - 0x81C, 0xEE140203, - 0x81C, 0xED160203, - 0x81C, 0xEC180203, - 0x81C, 0xEB1A0203, - 0x81C, 0xEA1C0203, - 0x81C, 0xE91E0203, - 0x81C, 0xE8200203, - 0x81C, 0xE7220203, - 0x81C, 0xE6240203, - 0x81C, 0xE5260203, - 0x81C, 0xE4280203, - 0x81C, 0xE32A0203, - 0x81C, 0xE22C0203, - 0x81C, 0xE12E0203, - 0x81C, 0xA6300203, - 0x81C, 0xA5320203, - 0x81C, 0xA4340203, - 0x81C, 0xA3360203, - 0x81C, 0xA2380203, - 0x81C, 0x853A0203, - 0x81C, 0x843C0203, - 0x81C, 0x833E0203, - 0x81C, 0x82400203, - 0x81C, 0x81420203, - 0x81C, 0x64440203, - 0x81C, 0x63460203, - 0x81C, 0x62480203, - 0x81C, 0x614A0203, - 0x81C, 0x444C0203, - 0x81C, 0x434E0203, - 0x81C, 0x42500203, - 0x81C, 0x25520203, - 0x81C, 0x24540203, - 0x81C, 0x23560203, - 0x81C, 0x06580203, - 0x81C, 0x055A0203, - 0x81C, 0x045C0203, - 0x81C, 0x035E0203, - 0x81C, 0x02600203, - 0x81C, 0x01620203, - 0x81C, 0x01640203, - 0x81C, 0x01660203, - 0x81C, 0x01680203, - 0x81C, 0x016A0203, - 0x81C, 0x016C0203, - 0x81C, 0x016E0203, - 0x81C, 0x01700203, - 0x81C, 0x01720203, - 0x81C, 0x01740203, - 0x81C, 0x01760203, - 0x81C, 0x01780203, - 0x81C, 0x017A0203, - 0x81C, 0x017C0203, - 0x81C, 0x017E0203, - 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x81C, 0xFC000203, - 0x81C, 0xFB020203, - 0x81C, 0xFA040203, - 0x81C, 0xF9060203, - 0x81C, 0xF8080203, - 0x81C, 0xF70A0203, - 0x81C, 0xF60C0203, - 0x81C, 0xF50E0203, - 0x81C, 0xF4100203, - 0x81C, 0xF3120203, - 0x81C, 0xF2140203, - 0x81C, 0xF1160203, - 0x81C, 0xF0180203, - 0x81C, 0xEF1A0203, - 0x81C, 0xEE1C0203, - 0x81C, 0xED1E0203, - 0x81C, 0xEC200203, - 0x81C, 0xEB220203, - 0x81C, 0xEA240203, - 0x81C, 0xE9260203, - 0x81C, 0xE8280203, - 0x81C, 0xE72A0203, - 0x81C, 0xE62C0203, - 0x81C, 0xE52E0203, - 0x81C, 0xE4300203, - 0x81C, 0xE3320203, - 0x81C, 0xE2340203, - 0x81C, 0xE1360203, - 0x81C, 0x87380203, - 0x81C, 0x863A0203, - 0x81C, 0x853C0203, - 0x81C, 0x843E0203, - 0x81C, 0x83400203, - 0x81C, 0x82420203, - 0x81C, 0x81440203, - 0x81C, 0x64460203, - 0x81C, 0x63480203, - 0x81C, 0x624A0203, - 0x81C, 0x474C0203, - 0x81C, 0x464E0203, - 0x81C, 0x45500203, - 0x81C, 0x44520203, - 0x81C, 0x43540203, - 0x81C, 0x42560203, - 0x81C, 0x24580203, - 0x81C, 0x235A0203, - 0x81C, 0x075C0203, - 0x81C, 0x065E0203, - 0x81C, 0x05600203, - 0x81C, 0x04620203, - 0x81C, 0x03640203, - 0x81C, 0x02660203, - 0x81C, 0x01680203, - 0x81C, 0x016A0203, - 0x81C, 0x016C0203, - 0x81C, 0x016E0203, - 0x81C, 0x01700203, - 0x81C, 0x01720203, - 0x81C, 0x01740203, - 0x81C, 0x01760203, - 0x81C, 0x01780203, - 0x81C, 0x017A0203, - 0x81C, 0x017C0203, - 0x81C, 0x017E0203, - 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, - 0x81C, 0xF8000203, - 0x81C, 0xF7020203, - 0x81C, 0xF6040203, - 0x81C, 0xF5060203, - 0x81C, 0xF4080203, - 0x81C, 0xF30A0203, - 0x81C, 0xF20C0203, - 0x81C, 0xF10E0203, - 0x81C, 0xF0100203, - 0x81C, 0xEF120203, - 0x81C, 0xEE140203, - 0x81C, 0xED160203, - 0x81C, 0xEC180203, - 0x81C, 0xEB1A0203, - 0x81C, 0xEA1C0203, - 0x81C, 0xE91E0203, - 0x81C, 0xE8200203, - 0x81C, 0xE7220203, - 0x81C, 0xE6240203, - 0x81C, 0xE5260203, - 0x81C, 0xE4280203, - 0x81C, 0xE32A0203, - 0x81C, 0xE22C0203, - 0x81C, 0xE12E0203, - 0x81C, 0xA6300203, - 0x81C, 0xA5320203, - 0x81C, 0xA4340203, - 0x81C, 0xA3360203, - 0x81C, 0xA2380203, - 0x81C, 0xA13A0203, - 0x81C, 0x843C0203, - 0x81C, 0x833E0203, - 0x81C, 0x82400203, - 0x81C, 0x81420203, - 0x81C, 0x64440203, - 0x81C, 0x63460203, - 0x81C, 0x62480203, - 0x81C, 0x614A0203, - 0x81C, 0x444C0203, - 0x81C, 0x434E0203, - 0x81C, 0x42500203, - 0x81C, 0x41520203, - 0x81C, 0x25540203, - 0x81C, 0x24560203, - 0x81C, 0x23580203, - 0x81C, 0x065A0203, - 0x81C, 0x055C0203, - 0x81C, 0x045E0203, - 0x81C, 0x03600203, - 0x81C, 0x02620203, - 0x81C, 0x01640203, - 0x81C, 0x01660203, - 0x81C, 0x01680203, - 0x81C, 0x016A0203, - 0x81C, 0x016C0203, - 0x81C, 0x016E0203, - 0x81C, 0x01700203, - 0x81C, 0x01720203, - 0x81C, 0x01740203, - 0x81C, 0x01760203, - 0x81C, 0x01780203, - 0x81C, 0x017A0203, - 0x81C, 0x017C0203, - 0x81C, 0x017E0203, - 0x90000004, 0x00000000, 0x40000000, 0x00550000, - 0x81C, 0xFB000203, - 0x81C, 0xFA020203, - 0x81C, 0xF9040203, - 0x81C, 0xF8060203, - 0x81C, 0xF7080203, - 0x81C, 0xF60A0203, - 0x81C, 0xF50C0203, - 0x81C, 0xF40E0203, - 0x81C, 0xF3100203, - 0x81C, 0xF2120203, - 0x81C, 0xF1140203, - 0x81C, 0xF0160203, - 0x81C, 0xEF180203, - 0x81C, 0xEE1A0203, - 0x81C, 0xED1C0203, - 0x81C, 0xEC1E0203, - 0x81C, 0xEB200203, - 0x81C, 0xEA220203, - 0x81C, 0xE9240203, - 0x81C, 0xE8260203, - 0x81C, 0xE7280203, - 0x81C, 0xE62A0203, - 0x81C, 0xE52C0203, - 0x81C, 0xE42E0203, - 0x81C, 0xE3300203, - 0x81C, 0xE2320203, - 0x81C, 0xE1340203, - 0x81C, 0xA5360203, - 0x81C, 0xA4380203, - 0x81C, 0xA33A0203, - 0x81C, 0xA23C0203, - 0x81C, 0x843E0203, - 0x81C, 0x83400203, - 0x81C, 0x82420203, - 0x81C, 0x81440203, - 0x81C, 0x64460203, - 0x81C, 0x63480203, - 0x81C, 0x624A0203, - 0x81C, 0x614C0203, - 0x81C, 0x474E0203, - 0x81C, 0x46500203, - 0x81C, 0x45520203, - 0x81C, 0x44540203, - 0x81C, 0x43560203, - 0x81C, 0x25580203, - 0x81C, 0x245A0203, - 0x81C, 0x235C0203, - 0x81C, 0x075E0203, - 0x81C, 0x06600203, - 0x81C, 0x05620203, - 0x81C, 0x04640203, - 0x81C, 0x03660203, - 0x81C, 0x02680203, - 0x81C, 0x016A0203, - 0x81C, 0x016C0203, - 0x81C, 0x016E0203, - 0x81C, 0x01700203, - 0x81C, 0x01720203, - 0x81C, 0x01740203, - 0x81C, 0x01760203, - 0x81C, 0x01780203, - 0x81C, 0x017A0203, - 0x81C, 0x017C0203, - 0x81C, 0x017E0203, - 0xA0000000, 0x00000000, - 0x81C, 0xFF000203, - 0x81C, 0xFF020203, - 0x81C, 0xFE040203, - 0x81C, 0xFD060203, - 0x81C, 0xFC080203, - 0x81C, 0xFB0A0203, - 0x81C, 0xFA0C0203, - 0x81C, 0xF90E0203, - 0x81C, 0xF8100203, - 0x81C, 0xF7120203, - 0x81C, 0xF6140203, - 0x81C, 0xF5160203, - 0x81C, 0xF4180203, - 0x81C, 0xF31A0203, - 0x81C, 0xF21C0203, - 0x81C, 0xF11E0203, - 0x81C, 0xF0200203, - 0x81C, 0xEF220203, - 0x81C, 0xEE240203, - 0x81C, 0xED260203, - 0x81C, 0xEC280203, - 0x81C, 0xEB2A0203, - 0x81C, 0xEA2C0203, - 0x81C, 0xE92E0203, - 0x81C, 0xE8300203, - 0x81C, 0xE7320203, - 0x81C, 0xE6340203, - 0x81C, 0xE5360203, - 0x81C, 0xE4380203, - 0x81C, 0xE33A0203, - 0x81C, 0xE23C0203, - 0x81C, 0xE13E0203, - 0x81C, 0xA4400203, - 0x81C, 0xA3420203, - 0x81C, 0xA2440203, - 0x81C, 0xA1460203, - 0x81C, 0x85480203, - 0x81C, 0x844A0203, - 0x81C, 0x834C0203, - 0x81C, 0x824E0203, - 0x81C, 0x81500203, - 0x81C, 0x64520203, - 0x81C, 0x63540203, - 0x81C, 0x62560203, - 0x81C, 0x61580203, - 0x81C, 0x445A0203, - 0x81C, 0x435C0203, - 0x81C, 0x425E0203, - 0x81C, 0x25600203, - 0x81C, 0x24620203, - 0x81C, 0x06640203, - 0x81C, 0x05660203, - 0x81C, 0x04680203, - 0x81C, 0x036A0203, - 0x81C, 0x026C0203, - 0x81C, 0x016E0203, - 0x81C, 0x01700203, - 0x81C, 0x01720203, - 0x81C, 0x01740203, - 0x81C, 0x01760203, - 0x81C, 0x01780203, - 0x81C, 0x017A0203, - 0x81C, 0x017C0203, - 0x81C, 0x017E0203, - 0xB0000000, 0x00000000, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x81C, 0xF9000303, - 0x81C, 0xF8020303, - 0x81C, 0xF7040303, - 0x81C, 0xF6060303, - 0x81C, 0xF5080303, - 0x81C, 0xF40A0303, - 0x81C, 0xF30C0303, - 0x81C, 0xF20E0303, - 0x81C, 0xF1100303, - 0x81C, 0xF0120303, - 0x81C, 0xEF140303, - 0x81C, 0xEE160303, - 0x81C, 0xED180303, - 0x81C, 0xEC1A0303, - 0x81C, 0xEB1C0303, - 0x81C, 0xEA1E0303, - 0x81C, 0xE9200303, - 0x81C, 0xE8220303, - 0x81C, 0xE7240303, - 0x81C, 0xE6260303, - 0x81C, 0xE5280303, - 0x81C, 0xE42A0303, - 0x81C, 0xE32C0303, - 0x81C, 0xE22E0303, - 0x81C, 0xE1300303, - 0x81C, 0xA6320303, - 0x81C, 0xA5340303, - 0x81C, 0xA4360303, - 0x81C, 0xA3380303, - 0x81C, 0xA23A0303, - 0x81C, 0xA13C0303, - 0x81C, 0x853E0303, - 0x81C, 0x84400303, - 0x81C, 0x83420303, - 0x81C, 0x82440303, - 0x81C, 0x81460303, - 0x81C, 0x64480303, - 0x81C, 0x634A0303, - 0x81C, 0x624C0303, - 0x81C, 0x614E0303, - 0x81C, 0x44500303, - 0x81C, 0x43520303, - 0x81C, 0x42540303, - 0x81C, 0x41560303, - 0x81C, 0x25580303, - 0x81C, 0x245A0303, - 0x81C, 0x235C0303, - 0x81C, 0x055E0303, - 0x81C, 0x04600303, - 0x81C, 0x03620303, - 0x81C, 0x02640303, - 0x81C, 0x01660303, - 0x81C, 0x01680303, - 0x81C, 0x016A0303, - 0x81C, 0x016C0303, - 0x81C, 0x016E0303, - 0x81C, 0x01700303, - 0x81C, 0x01720303, - 0x81C, 0x01740303, - 0x81C, 0x01760303, - 0x81C, 0x01780303, - 0x81C, 0x017A0303, - 0x81C, 0x017C0303, - 0x81C, 0x017E0303, - 0x90000004, 0x00550000, 0x40000000, 0x00000000, - 0x81C, 0xF7000303, - 0x81C, 0xF6020303, - 0x81C, 0xF5040303, - 0x81C, 0xF4060303, - 0x81C, 0xF3080303, - 0x81C, 0xF20A0303, - 0x81C, 0xF10C0303, - 0x81C, 0xF00E0303, - 0x81C, 0xEF100303, - 0x81C, 0xEE120303, - 0x81C, 0xED140303, - 0x81C, 0xEC160303, - 0x81C, 0xEB180303, - 0x81C, 0xEA1A0303, - 0x81C, 0xE91C0303, - 0x81C, 0xE81E0303, - 0x81C, 0xE7200303, - 0x81C, 0xE6220303, - 0x81C, 0xE5240303, - 0x81C, 0xE4260303, - 0x81C, 0xE3280303, - 0x81C, 0xC32A0303, - 0x81C, 0xC22C0303, - 0x81C, 0xC12E0303, - 0x81C, 0xA5300303, - 0x81C, 0xA4320303, - 0x81C, 0xA3340303, - 0x81C, 0xA2360303, - 0x81C, 0xA1380303, - 0x81C, 0x853A0303, - 0x81C, 0x843C0303, - 0x81C, 0x833E0303, - 0x81C, 0x82400303, - 0x81C, 0x81420303, - 0x81C, 0x64440303, - 0x81C, 0x63460303, - 0x81C, 0x62480303, - 0x81C, 0x614A0303, - 0x81C, 0x454C0303, - 0x81C, 0x444E0303, - 0x81C, 0x43500303, - 0x81C, 0x25520303, - 0x81C, 0x24540303, - 0x81C, 0x23560303, - 0x81C, 0x06580303, - 0x81C, 0x055A0303, - 0x81C, 0x045C0303, - 0x81C, 0x035E0303, - 0x81C, 0x02600303, - 0x81C, 0x01620303, - 0x81C, 0x01640303, - 0x81C, 0x01660303, - 0x81C, 0x01680303, - 0x81C, 0x016A0303, - 0x81C, 0x016C0303, - 0x81C, 0x016E0303, - 0x81C, 0x01700303, - 0x81C, 0x01720303, - 0x81C, 0x01740303, - 0x81C, 0x01760303, - 0x81C, 0x01780303, - 0x81C, 0x017A0303, - 0x81C, 0x017C0303, - 0x81C, 0x017E0303, - 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x81C, 0xF9000303, - 0x81C, 0xF8020303, - 0x81C, 0xF7040303, - 0x81C, 0xF6060303, - 0x81C, 0xF5080303, - 0x81C, 0xF40A0303, - 0x81C, 0xF30C0303, - 0x81C, 0xF20E0303, - 0x81C, 0xF1100303, - 0x81C, 0xF0120303, - 0x81C, 0xEF140303, - 0x81C, 0xEE160303, - 0x81C, 0xED180303, - 0x81C, 0xEC1A0303, - 0x81C, 0xEB1C0303, - 0x81C, 0xEA1E0303, - 0x81C, 0xE9200303, - 0x81C, 0xE8220303, - 0x81C, 0xE7240303, - 0x81C, 0xE6260303, - 0x81C, 0xE5280303, - 0x81C, 0xE42A0303, - 0x81C, 0xE32C0303, - 0x81C, 0xE22E0303, - 0x81C, 0xE1300303, - 0x81C, 0xA4320303, - 0x81C, 0xA3340303, - 0x81C, 0xA2360303, - 0x81C, 0xA1380303, - 0x81C, 0x853A0303, - 0x81C, 0x843C0303, - 0x81C, 0x833E0303, - 0x81C, 0x82400303, - 0x81C, 0x81420303, - 0x81C, 0x64440303, - 0x81C, 0x63460303, - 0x81C, 0x62480303, - 0x81C, 0x614A0303, - 0x81C, 0x444C0303, - 0x81C, 0x434E0303, - 0x81C, 0x42500303, - 0x81C, 0x25520303, - 0x81C, 0x24540303, - 0x81C, 0x23560303, - 0x81C, 0x07580303, - 0x81C, 0x065A0303, - 0x81C, 0x055C0303, - 0x81C, 0x045E0303, - 0x81C, 0x03600303, - 0x81C, 0x02620303, - 0x81C, 0x01640303, - 0x81C, 0x01660303, - 0x81C, 0x01680303, - 0x81C, 0x016A0303, - 0x81C, 0x016C0303, - 0x81C, 0x016E0303, - 0x81C, 0x01700303, - 0x81C, 0x01720303, - 0x81C, 0x01740303, - 0x81C, 0x01760303, - 0x81C, 0x01780303, - 0x81C, 0x017A0303, - 0x81C, 0x017C0303, - 0x81C, 0x017E0303, - 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, - 0x81C, 0xF7000303, - 0x81C, 0xF6020303, - 0x81C, 0xF5040303, - 0x81C, 0xF4060303, - 0x81C, 0xF3080303, - 0x81C, 0xF20A0303, - 0x81C, 0xF10C0303, - 0x81C, 0xF00E0303, - 0x81C, 0xEF100303, - 0x81C, 0xEE120303, - 0x81C, 0xED140303, - 0x81C, 0xEC160303, - 0x81C, 0xEB180303, - 0x81C, 0xEA1A0303, - 0x81C, 0xE91C0303, - 0x81C, 0xE81E0303, - 0x81C, 0xE7200303, - 0x81C, 0xE6220303, - 0x81C, 0xE5240303, - 0x81C, 0xE4260303, - 0x81C, 0xE3280303, - 0x81C, 0xE22A0303, - 0x81C, 0xE12C0303, - 0x81C, 0xA72E0303, - 0x81C, 0xA6300303, - 0x81C, 0xA5320303, - 0x81C, 0xA4340303, - 0x81C, 0xA3360303, - 0x81C, 0xA2380303, - 0x81C, 0xA13A0303, - 0x81C, 0x843C0303, - 0x81C, 0x833E0303, - 0x81C, 0x82400303, - 0x81C, 0x81420303, - 0x81C, 0x64440303, - 0x81C, 0x63460303, - 0x81C, 0x62480303, - 0x81C, 0x614A0303, - 0x81C, 0x454C0303, - 0x81C, 0x444E0303, - 0x81C, 0x43500303, - 0x81C, 0x42520303, - 0x81C, 0x41540303, - 0x81C, 0x24560303, - 0x81C, 0x23580303, - 0x81C, 0x065A0303, - 0x81C, 0x055C0303, - 0x81C, 0x045E0303, - 0x81C, 0x03600303, - 0x81C, 0x02620303, - 0x81C, 0x01640303, - 0x81C, 0x01660303, - 0x81C, 0x01680303, - 0x81C, 0x016A0303, - 0x81C, 0x016C0303, - 0x81C, 0x016E0303, - 0x81C, 0x01700303, - 0x81C, 0x01720303, - 0x81C, 0x01740303, - 0x81C, 0x01760303, - 0x81C, 0x01780303, - 0x81C, 0x017A0303, - 0x81C, 0x017C0303, - 0x81C, 0x017E0303, - 0x90000004, 0x00000000, 0x40000000, 0x00550000, - 0x81C, 0xFB000303, - 0x81C, 0xFA020303, - 0x81C, 0xF9040303, - 0x81C, 0xF8060303, - 0x81C, 0xF7080303, - 0x81C, 0xF60A0303, - 0x81C, 0xF50C0303, - 0x81C, 0xF40E0303, - 0x81C, 0xF3100303, - 0x81C, 0xF2120303, - 0x81C, 0xF1140303, - 0x81C, 0xF0160303, - 0x81C, 0xEF180303, - 0x81C, 0xEE1A0303, - 0x81C, 0xED1C0303, - 0x81C, 0xEC1E0303, - 0x81C, 0xEB200303, - 0x81C, 0xEA220303, - 0x81C, 0xE9240303, - 0x81C, 0xE8260303, - 0x81C, 0xE7280303, - 0x81C, 0xE62A0303, - 0x81C, 0xE52C0303, - 0x81C, 0xE42E0303, - 0x81C, 0xE3300303, - 0x81C, 0xE2320303, - 0x81C, 0xE1340303, - 0x81C, 0xC2360303, - 0x81C, 0xC1380303, - 0x81C, 0xA33A0303, - 0x81C, 0xA23C0303, - 0x81C, 0x853E0303, - 0x81C, 0x84400303, - 0x81C, 0x83420303, - 0x81C, 0x66440303, - 0x81C, 0x65460303, - 0x81C, 0x64480303, - 0x81C, 0x634A0303, - 0x81C, 0x624C0303, - 0x81C, 0x614E0303, - 0x81C, 0x45500303, - 0x81C, 0x44520303, - 0x81C, 0x43540303, - 0x81C, 0x42560303, - 0x81C, 0x25580303, - 0x81C, 0x245A0303, - 0x81C, 0x235C0303, - 0x81C, 0x065E0303, - 0x81C, 0x05600303, - 0x81C, 0x04620303, - 0x81C, 0x03640303, - 0x81C, 0x02660303, - 0x81C, 0x01680303, - 0x81C, 0x016A0303, - 0x81C, 0x016C0303, - 0x81C, 0x016E0303, - 0x81C, 0x01700303, - 0x81C, 0x01720303, - 0x81C, 0x01740303, - 0x81C, 0x01760303, - 0x81C, 0x01780303, - 0x81C, 0x017A0303, - 0x81C, 0x017C0303, - 0x81C, 0x017E0303, - 0xA0000000, 0x00000000, - 0x81C, 0xFD000303, - 0x81C, 0xFC020303, - 0x81C, 0xFB040303, - 0x81C, 0xFA060303, - 0x81C, 0xF9080303, - 0x81C, 0xF80A0303, - 0x81C, 0xF70C0303, - 0x81C, 0xF60E0303, - 0x81C, 0xF5100303, - 0x81C, 0xF4120303, - 0x81C, 0xF3140303, - 0x81C, 0xF2160303, - 0x81C, 0xF1180303, - 0x81C, 0xF01A0303, - 0x81C, 0xEF1C0303, - 0x81C, 0xEE1E0303, - 0x81C, 0xED200303, - 0x81C, 0xEC220303, - 0x81C, 0xEB240303, - 0x81C, 0xEA260303, - 0x81C, 0xE9280303, - 0x81C, 0xE82A0303, - 0x81C, 0xE72C0303, - 0x81C, 0xE62E0303, - 0x81C, 0xE5300303, - 0x81C, 0xE4320303, - 0x81C, 0xE3340303, - 0x81C, 0xE2360303, - 0x81C, 0xE1380303, - 0x81C, 0xA53A0303, - 0x81C, 0xA43C0303, - 0x81C, 0xA33E0303, - 0x81C, 0xA2400303, - 0x81C, 0xA1420303, - 0x81C, 0x87440303, - 0x81C, 0x86460303, - 0x81C, 0x85480303, - 0x81C, 0x844A0303, - 0x81C, 0x834C0303, - 0x81C, 0x824E0303, - 0x81C, 0x81500303, - 0x81C, 0x64520303, - 0x81C, 0x63540303, - 0x81C, 0x62560303, - 0x81C, 0x61580303, - 0x81C, 0x435A0303, - 0x81C, 0x425C0303, - 0x81C, 0x415E0303, - 0x81C, 0x07600303, - 0x81C, 0x06620303, - 0x81C, 0x05640303, - 0x81C, 0x04660303, - 0x81C, 0x03680303, - 0x81C, 0x026A0303, - 0x81C, 0x016C0303, - 0x81C, 0x016E0303, - 0x81C, 0x01700303, - 0x81C, 0x01720303, - 0x81C, 0x01740303, - 0x81C, 0x01760303, - 0x81C, 0x01780303, - 0x81C, 0x017A0303, - 0x81C, 0x017C0303, - 0x81C, 0x017E0303, - 0xB0000000, 0x00000000, - 0xC50, 0x00000022, - 0xC50, 0x00000020, - 0xE50, 0x00000022, - 0xE50, 0x00000020, - 0x1850, 0x00000022, - 0x1850, 0x00000020, - 0x1A50, 0x00000022, - 0x1A50, 0x00000020, - -}; - -void -odm_read_and_config_mp_8814a_agc_tab( - struct dm_struct* pDM_Odm -) -{ - u32 i = 0; - u1Byte cCond; - BOOLEAN bMatched = TRUE, bSkipped = FALSE; - u32 ArrayLen = sizeof(Array_MP_8814A_AGC_TAB)/sizeof(u32); - u32* Array = Array_MP_8814A_AGC_TAB; - - u32 v1 = 0, v2 = 0, pre_v1 = 0, pre_v2 = 0; - - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_8814A_AGC_TAB\n"); - - while ((i + 1) < ArrayLen) { - v1 = Array[i]; - v2 = Array[i + 1]; - - if (v1 & (BIT31 | BIT30)) {/*positive & negative condition*/ - if (v1 & BIT31) {/* positive condition*/ - cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28); - if (cCond == COND_ENDIF) {/*end*/ - bMatched = TRUE; - bSkipped = FALSE; - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "ENDIF\n"); - } else if (cCond == COND_ELSE) { /*else*/ - bMatched = bSkipped?FALSE:TRUE; - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "ELSE\n"); - } else {/*if , else if*/ - pre_v1 = v1; - pre_v2 = v2; - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "IF or ELSE IF\n"); - } - } else if (v1 & BIT30) { /*negative condition*/ - if (bSkipped == FALSE) { - if (CheckPositive(pDM_Odm, pre_v1, pre_v2, v1, v2)) { - bMatched = TRUE; - bSkipped = TRUE; - } else { - bMatched = FALSE; - bSkipped = FALSE; - } - } else - bMatched = FALSE; - } - } else { - if (bMatched) - odm_ConfigBB_AGC_8814A(pDM_Odm, v1, bMaskDWord, v2); - } - i = i + 2; - } -} - -u32 -ODM_GetVersion_MP_8814A_AGC_TAB(void) -{ - return 85; -} - -/****************************************************************************** -* PHY_REG.TXT -******************************************************************************/ - -u32 Array_MP_8814A_PHY_REG[] = { - 0x800, 0x9020D010, - 0x804, 0x08011280, - 0x808, 0x0E0282FF, - 0x80C, 0x1000002F, - 0x8000000f, 0xaaaaaaaa, 0x40000000, 0x00000000, - 0x810, 0x21101263, - 0x9000000f, 0xaa00aaaa, 0x40000000, 0x00550000, - 0x810, 0x21101263, - 0xA0000000, 0x00000000, - 0x810, 0x20101263, - 0xB0000000, 0x00000000, - 0x814, 0x020C3D10, - 0x818, 0x04A10385, - 0x820, 0x00000000, - 0x824, 0x00033E40, - 0x828, 0x00000000, - 0x82C, 0x73985170, - 0x830, 0x79A0EA08, - 0x834, 0x042E7086, - 0x8000000f, 0x55555555, 0x40000000, 0x00000000, - 0x838, 0x86667640, - 0x9000000f, 0x55ff5555, 0x40000000, 0x00000000, - 0x838, 0x86667641, - 0xA0000000, 0x00000000, - 0x838, 0x86667640, - 0xB0000000, 0x00000000, - 0x83C, 0x9798B9B9, - 0x840, 0x17577F60, - 0x844, 0x4BBDFCDE, - 0x848, 0x5CD07F8B, - 0x84C, 0x6CFBF7B5, - 0x850, 0x28834706, - 0x854, 0x0001520C, - 0x858, 0x4060C000, - 0x85C, 0x74210368, - 0x860, 0x6929C321, - 0x864, 0x79727432, - 0x868, 0x8CA7A314, - 0x86C, 0x438C2878, - 0x870, 0x44444444, - 0x874, 0x21612C2E, - 0x878, 0x00003152, - 0x87C, 0x000FC000, - 0x8A0, 0x00000013, - 0x8A4, 0x7F7F7F7F, - 0x8A8, 0xA202033E, - 0x8AC, 0xF40F550A, - 0x8B0, 0x00000600, - 0x8B4, 0x000FC080, - 0x8B8, 0xEC0057FF, - 0x8BC, 0x8CA520C3, - 0x8C0, 0x3FF00020, - 0x8C4, 0x44C00000, - 0x8C8, 0x80025169, - 0x8CC, 0x08250492, - 0x8D0, 0x0000B800, - 0x8D4, 0x940008A0, - 0x8D8, 0x290B5612, - 0x8DC, 0x00000000, - 0x8E0, 0x32316407, - 0x8E4, 0x4A092925, - 0x8E8, 0xFFFFC42C, - 0x8EC, 0x99999999, - 0x8F0, 0x00009999, - 0x8F4, 0x00F80FA1, - 0x8F8, 0x400082C0, - 0x8FC, 0x00000000, - 0x900, 0x00400700, - 0x90C, 0x09004000, - 0x910, 0x0000FC00, - 0x914, 0xD6400404, - 0x918, 0x1C1028C0, - 0x91C, 0x64B11A1C, - 0x920, 0xE0767233, - 0x924, 0x055AA500, - 0x928, 0x4AB0E4E4, - 0x92C, 0xFFFE0000, - 0x930, 0xFFFFFFFE, - 0x934, 0x001FFFFF, - 0x938, 0x00008400, - 0x93C, 0x932C0642, - 0x940, 0x093E9360, - 0x944, 0x08000000, - 0x948, 0x04000000, - 0x950, 0x02010080, - 0x954, 0x86510080, - 0x960, 0x00000000, - 0x964, 0x00000000, - 0x968, 0x00000000, - 0x96C, 0x00000000, - 0x970, 0x801FFFFF, - 0x978, 0x00000000, - 0x97C, 0x00000000, - 0x980, 0x00000000, - 0x984, 0x00000000, - 0x988, 0x00000000, - 0x98C, 0x03440000, - 0x990, 0x27100000, - 0x994, 0xFFFF0100, - 0x998, 0xFFFFFF5C, - 0x99C, 0xFFFFFFFF, - 0x9A0, 0x000000FF, - 0x9A4, 0x00080080, - 0x9A8, 0x0C2F0000, - 0x9AC, 0x00560000, - 0x9B0, 0x81081008, - 0x9B4, 0x00000000, - 0x9B8, 0x01081008, - 0x9BC, 0x01081008, - 0x9D0, 0x00000000, - 0x9D4, 0x00000000, - 0x9D8, 0x00000000, - 0x9DC, 0x00000000, - 0x9E4, 0x00000002, - 0x9E8, 0x000022D5, - 0x9FC, 0xEFFFF7FF, - 0xB00, 0xE3100000, - 0xB04, 0x0000B000, - 0xB0C, 0x31EAA006, - 0xB5C, 0x41CFFFFF, - 0xC00, 0x00000007, - 0xC04, 0x00042020, - 0xC08, 0x80410231, - 0xC0C, 0x00000000, - 0xC10, 0x00000100, - 0xC14, 0x01000000, - 0xC1C, 0x40000053, - 0xC50, 0x00000020, - 0xC54, 0x00000000, - 0x8000000f, 0x55555555, 0x40000000, 0x00000000, - 0xC58, 0x3C0A0C14, - 0x9000000f, 0x55ff5555, 0x40000000, 0x00000000, - 0xC58, 0x3C0A0C14, - 0xA0000000, 0x00000000, - 0xC58, 0x3C020C14, - 0xB0000000, 0x00000000, - 0xC5C, 0x0D000058, - 0xC60, 0x1B800000, - 0xC60, 0x0B800001, - 0xC60, 0x05800002, - 0xC60, 0x07800003, - 0xC60, 0x1A800004, - 0xC60, 0x0B800005, - 0xC60, 0x05800006, - 0xC60, 0x0E800007, - 0xC60, 0x1A800008, - 0xC60, 0x0B800009, - 0xC60, 0x1580000A, - 0xC60, 0x0880000B, - 0xC60, 0x1A80000C, - 0xC60, 0x0B80000D, - 0xC60, 0x0580000E, - 0xC60, 0x0E80000F, - 0xC60, 0x1A800010, - 0xC60, 0x0B800011, - 0xC60, 0x15800012, - 0xC60, 0x08800013, - 0xC60, 0x1A800014, - 0xC60, 0x0B800015, - 0xC60, 0x05800016, - 0xC60, 0x07800017, - 0xC60, 0x1A800018, - 0xC60, 0x0B800019, - 0xC60, 0x1580001A, - 0xC60, 0x0880001B, - 0xC60, 0x1B80001C, - 0xC60, 0x0B80001D, - 0xC60, 0x0580001E, - 0xC60, 0x0780001F, - 0xC60, 0x1B800020, - 0xC60, 0x0B800021, - 0xC60, 0x05800022, - 0xC60, 0x07800023, - 0xC60, 0x1B800024, - 0xC60, 0x0B800025, - 0xC60, 0x05800026, - 0xC60, 0x07800027, - 0xC60, 0x1B800028, - 0xC60, 0x0B800029, - 0xC60, 0x0580002A, - 0xC60, 0x0780002B, - 0xC60, 0x1B800030, - 0xC60, 0x0B800031, - 0xC60, 0x05800032, - 0xC60, 0x00800033, - 0xC60, 0x1B800034, - 0xC60, 0x0B800035, - 0xC60, 0x05800036, - 0xC60, 0x00800037, - 0xC60, 0x1B800038, - 0xC60, 0x0B800039, - 0xC60, 0x0580003A, - 0xC60, 0x0E80803B, - 0xC94, 0x01000401, - 0xC98, 0x00188000, - 0xCA0, 0x00002929, - 0xCA4, 0x08040201, - 0xCA8, 0x80402010, - 0xCAC, 0x77777000, - 0xCB0, 0x54775477, - 0xCB4, 0x54775477, - 0xCB8, 0x00500000, - 0xCBC, 0x77700000, - 0xCC0, 0x00000010, - 0xCC8, 0x00000010, - 0xE00, 0x00000007, - 0xE04, 0x00042020, - 0xE08, 0x80410231, - 0xE0C, 0x00000000, - 0xE10, 0x00000100, - 0xE14, 0x01000000, - 0xE1C, 0x40000053, - 0xE50, 0x00000020, - 0xE54, 0x00000000, - 0x8000000f, 0x55555555, 0x40000000, 0x00000000, - 0xE58, 0x3C0A0C14, - 0x9000000f, 0x55ff5555, 0x40000000, 0x00000000, - 0xE58, 0x3C0A0C14, - 0xA0000000, 0x00000000, - 0xE58, 0x3C020C14, - 0xB0000000, 0x00000000, - 0xE5C, 0x0D000058, - 0xE60, 0x1B800000, - 0xE60, 0x0B800001, - 0xE60, 0x05800002, - 0xE60, 0x07800003, - 0xE60, 0x1A800004, - 0xE60, 0x0B800005, - 0xE60, 0x05800006, - 0xE60, 0x0E800007, - 0xE60, 0x1A800008, - 0xE60, 0x0B800009, - 0xE60, 0x1580000A, - 0xE60, 0x0880000B, - 0xE60, 0x1A80000C, - 0xE60, 0x0B80000D, - 0xE60, 0x0580000E, - 0xE60, 0x0E80000F, - 0xE60, 0x1A800010, - 0xE60, 0x0B800011, - 0xE60, 0x15800012, - 0xE60, 0x08800013, - 0xE60, 0x1A800014, - 0xE60, 0x0B800015, - 0xE60, 0x05800016, - 0xE60, 0x07800017, - 0xE60, 0x1A800018, - 0xE60, 0x0B800019, - 0xE60, 0x1580001A, - 0xE60, 0x0880001B, - 0xE60, 0x1B80001C, - 0xE60, 0x0B80001D, - 0xE60, 0x0580001E, - 0xE60, 0x0780001F, - 0xE60, 0x1B800020, - 0xE60, 0x0B800021, - 0xE60, 0x05800022, - 0xE60, 0x07800023, - 0xE60, 0x1B800024, - 0xE60, 0x0B800025, - 0xE60, 0x05800026, - 0xE60, 0x07800027, - 0xE60, 0x1B800028, - 0xE60, 0x0B800029, - 0xE60, 0x0580002A, - 0xE60, 0x0780002B, - 0xE60, 0x1B800030, - 0xE60, 0x0B800031, - 0xE60, 0x05800032, - 0xE60, 0x00800033, - 0xE60, 0x1B800034, - 0xE60, 0x0B800035, - 0xE60, 0x05800036, - 0xE60, 0x00800037, - 0xE60, 0x1B800038, - 0xE60, 0x0B800039, - 0xE60, 0x0580003A, - 0xE60, 0x0E80803B, - 0xE94, 0x01000401, - 0xE98, 0x00188000, - 0xEA0, 0x00002929, - 0xEA4, 0x08040201, - 0xEA8, 0x80402010, - 0xEAC, 0x77777000, - 0xEB0, 0x54775477, - 0xEB4, 0x54775477, - 0xEB8, 0x00500000, - 0xEBC, 0x77700000, - 0x1800, 0x00000007, - 0x1804, 0x00042020, - 0x1808, 0x80410231, - 0x180C, 0x00000000, - 0x1810, 0x00000100, - 0x1814, 0x01000000, - 0x181C, 0x40000053, - 0x1850, 0x00000020, - 0x1854, 0x00000000, - 0x8000000f, 0x55555555, 0x40000000, 0x00000000, - 0x1858, 0x3C0A0C14, - 0x9000000f, 0x55ff5555, 0x40000000, 0x00000000, - 0x1858, 0x3C0A0C14, - 0xA0000000, 0x00000000, - 0x1858, 0x3C020C14, - 0xB0000000, 0x00000000, - 0x185C, 0x0D000058, - 0x1860, 0x1B800000, - 0x1860, 0x0B800001, - 0x1860, 0x05800002, - 0x1860, 0x07800003, - 0x1860, 0x1A800004, - 0x1860, 0x0B800005, - 0x1860, 0x05800006, - 0x1860, 0x0E800007, - 0x1860, 0x1A800008, - 0x1860, 0x0B800009, - 0x1860, 0x1580000A, - 0x1860, 0x0880000B, - 0x1860, 0x1A80000C, - 0x1860, 0x0B80000D, - 0x1860, 0x0580000E, - 0x1860, 0x0E80000F, - 0x1860, 0x1A800010, - 0x1860, 0x0B800011, - 0x1860, 0x15800012, - 0x1860, 0x08800013, - 0x1860, 0x1A800014, - 0x1860, 0x0B800015, - 0x1860, 0x05800016, - 0x1860, 0x07800017, - 0x1860, 0x1A800018, - 0x1860, 0x0B800019, - 0x1860, 0x1580001A, - 0x1860, 0x0880001B, - 0x1860, 0x1B80001C, - 0x1860, 0x0B80001D, - 0x1860, 0x0580001E, - 0x1860, 0x0780001F, - 0x1860, 0x1B800020, - 0x1860, 0x0B800021, - 0x1860, 0x05800022, - 0x1860, 0x07800023, - 0x1860, 0x1B800024, - 0x1860, 0x0B800025, - 0x1860, 0x05800026, - 0x1860, 0x07800027, - 0x1860, 0x1B800028, - 0x1860, 0x0B800029, - 0x1860, 0x0580002A, - 0x1860, 0x0780002B, - 0x1860, 0x1B800030, - 0x1860, 0x0B800031, - 0x1860, 0x05800032, - 0x1860, 0x00800033, - 0x1860, 0x1B800034, - 0x1860, 0x0B800035, - 0x1860, 0x05800036, - 0x1860, 0x00800037, - 0x1860, 0x1B800038, - 0x1860, 0x0B800039, - 0x1860, 0x0580003A, - 0x1860, 0x0E80803B, - 0x1894, 0x01000401, - 0x1898, 0x00188000, - 0x18A0, 0x00002929, - 0x18A4, 0x08040201, - 0x18A8, 0x80402010, - 0x18AC, 0x77777000, - 0x18B0, 0x54775477, - 0x18B4, 0x54775477, - 0x18B8, 0x00500000, - 0x18BC, 0x77700000, - 0x1A00, 0x00000007, - 0x1A04, 0x00042020, - 0x1A08, 0x80410231, - 0x1A0C, 0x00000000, - 0x1A10, 0x00000100, - 0x1A14, 0x01000000, - 0x1A1C, 0x40000053, - 0x1A50, 0x00000020, - 0x1A54, 0x00000000, - 0x8000000f, 0x55555555, 0x40000000, 0x00000000, - 0x1A58, 0x3C0A0C14, - 0x9000000f, 0x55ff5555, 0x40000000, 0x00000000, - 0x1A58, 0x3C0A0C14, - 0xA0000000, 0x00000000, - 0x1A58, 0x3C020C14, - 0xB0000000, 0x00000000, - 0x1A5C, 0x0D000058, - 0x1A60, 0x1B800000, - 0x1A60, 0x0B800001, - 0x1A60, 0x05800002, - 0x1A60, 0x07800003, - 0x1A60, 0x1A800004, - 0x1A60, 0x0B800005, - 0x1A60, 0x05800006, - 0x1A60, 0x0E800007, - 0x1A60, 0x1A800008, - 0x1A60, 0x0B800009, - 0x1A60, 0x1580000A, - 0x1A60, 0x0880000B, - 0x1A60, 0x1A80000C, - 0x1A60, 0x0B80000D, - 0x1A60, 0x0580000E, - 0x1A60, 0x0E80000F, - 0x1A60, 0x1A800010, - 0x1A60, 0x0B800011, - 0x1A60, 0x15800012, - 0x1A60, 0x08800013, - 0x1A60, 0x1A800014, - 0x1A60, 0x0B800015, - 0x1A60, 0x05800016, - 0x1A60, 0x07800017, - 0x1A60, 0x1A800018, - 0x1A60, 0x0B800019, - 0x1A60, 0x1580001A, - 0x1A60, 0x0880001B, - 0x1A60, 0x1B80001C, - 0x1A60, 0x0B80001D, - 0x1A60, 0x0580001E, - 0x1A60, 0x0780001F, - 0x1A60, 0x1B800020, - 0x1A60, 0x0B800021, - 0x1A60, 0x05800022, - 0x1A60, 0x07800023, - 0x1A60, 0x1B800024, - 0x1A60, 0x0B800025, - 0x1A60, 0x05800026, - 0x1A60, 0x07800027, - 0x1A60, 0x1B800028, - 0x1A60, 0x0B800029, - 0x1A60, 0x0580002A, - 0x1A60, 0x0780002B, - 0x1A60, 0x1B800030, - 0x1A60, 0x0B800031, - 0x1A60, 0x05800032, - 0x1A60, 0x00800033, - 0x1A60, 0x1B800034, - 0x1A60, 0x0B800035, - 0x1A60, 0x05800036, - 0x1A60, 0x00800037, - 0x1A60, 0x1B800038, - 0x1A60, 0x0B800039, - 0x1A60, 0x0580003A, - 0x1A60, 0x0E80803B, - 0x1A94, 0x01000401, - 0x1A98, 0x00188000, - 0x1AA0, 0x00002929, - 0x1AA4, 0x08040201, - 0x1AA8, 0x80402010, - 0x1AAC, 0x77777000, - 0x1AB0, 0x54775477, - 0x1AB4, 0x54775477, - 0x1AB8, 0x00500000, - 0x1ABC, 0x77700000, - 0x1904, 0x00030000, - 0x1914, 0x00030000, - 0x1984, 0x03000000, - 0x1988, 0x00000087, - 0x198C, 0x00000007, - 0x1990, 0xFFAA5500, - 0x1994, 0x00000077, - 0x1998, 0x12801000, - 0x1998, 0x12801000, - 0x1998, 0x12801001, - 0x1998, 0x12801002, - 0x1998, 0x12801003, - 0x1998, 0x12801004, - 0x1998, 0x12801005, - 0x1998, 0x12801006, - 0x1998, 0x12801007, - 0x1998, 0x12801008, - 0x1998, 0x12801009, - 0x1998, 0x1280100A, - 0x1998, 0x1280100B, - 0x1998, 0x1280100C, - 0x1998, 0x1280100D, - 0x1998, 0x1280100E, - 0x1998, 0x1280100F, - 0x1998, 0x12801010, - 0x1998, 0x12801011, - 0x1998, 0x12801012, - 0x1998, 0x12801013, - 0x1998, 0x12801014, - 0x1998, 0x12801015, - 0x1998, 0x12801016, - 0x1998, 0x12801017, - 0x1998, 0x12801018, - 0x1998, 0x12801019, - 0x1998, 0x1280101A, - 0x1998, 0x1280101B, - 0x1998, 0x1280101C, - 0x1998, 0x1280101D, - 0x1998, 0x1280101E, - 0x1998, 0x1280101F, - 0x1998, 0x12801020, - 0x1998, 0x12801021, - 0x1998, 0x12801022, - 0x1998, 0x12801023, - 0x1998, 0x1280102C, - 0x1998, 0x1280102D, - 0x1998, 0x1280102E, - 0x1998, 0x1280102F, - 0x1998, 0x12801030, - 0x1998, 0x12801031, - 0x1998, 0x12801032, - 0x1998, 0x12801033, - 0x1998, 0x12801034, - 0x1998, 0x12801035, - 0x1998, 0x12801036, - 0x1998, 0x12801037, - 0x1998, 0x12801038, - 0x1998, 0x12801039, - 0x1998, 0x1280103A, - 0x1998, 0x1280103B, - 0x1998, 0x1280103C, - 0x1998, 0x1280103D, - 0x1998, 0x1280103E, - 0x1998, 0x1280103F, - 0x1998, 0x12801040, - 0x1998, 0x12801041, - 0x1998, 0x12801042, - 0x1998, 0x12801043, - 0x1998, 0x12801044, - 0x1998, 0x12801045, - 0x1998, 0x12801046, - 0x1998, 0x12801047, - 0x1998, 0x12801048, - 0x1998, 0x12801049, - 0x1998, 0x12801100, - 0x1998, 0x12801101, - 0x1998, 0x12801102, - 0x1998, 0x12801103, - 0x1998, 0x12801104, - 0x1998, 0x12801105, - 0x1998, 0x12801106, - 0x1998, 0x12801107, - 0x1998, 0x12801108, - 0x1998, 0x12801109, - 0x1998, 0x1280110A, - 0x1998, 0x1280110B, - 0x1998, 0x1280110C, - 0x1998, 0x1280110D, - 0x1998, 0x1280110E, - 0x1998, 0x1280110F, - 0x1998, 0x12801110, - 0x1998, 0x12801111, - 0x1998, 0x12801112, - 0x1998, 0x12801113, - 0x1998, 0x12801114, - 0x1998, 0x12801115, - 0x1998, 0x12801116, - 0x1998, 0x12801117, - 0x1998, 0x12801118, - 0x1998, 0x12801119, - 0x1998, 0x1280111A, - 0x1998, 0x1280111B, - 0x1998, 0x1280111C, - 0x1998, 0x1280111D, - 0x1998, 0x1280111E, - 0x1998, 0x1280111F, - 0x1998, 0x12801120, - 0x1998, 0x12801121, - 0x1998, 0x12801122, - 0x1998, 0x12801123, - 0x1998, 0x1280112C, - 0x1998, 0x1280112D, - 0x1998, 0x1280112E, - 0x1998, 0x1280112F, - 0x1998, 0x12801130, - 0x1998, 0x12801131, - 0x1998, 0x12801132, - 0x1998, 0x12801133, - 0x1998, 0x12801134, - 0x1998, 0x12801135, - 0x1998, 0x12801136, - 0x1998, 0x12801137, - 0x1998, 0x12801138, - 0x1998, 0x12801139, - 0x1998, 0x1280113A, - 0x1998, 0x1280113B, - 0x1998, 0x1280113C, - 0x1998, 0x1280113D, - 0x1998, 0x1280113E, - 0x1998, 0x1280113F, - 0x1998, 0x12801140, - 0x1998, 0x12801141, - 0x1998, 0x12801142, - 0x1998, 0x12801143, - 0x1998, 0x12801144, - 0x1998, 0x12801145, - 0x1998, 0x12801146, - 0x1998, 0x12801147, - 0x1998, 0x12801148, - 0x1998, 0x12801149, - 0x1998, 0x12801200, - 0x1998, 0x12801201, - 0x1998, 0x12801202, - 0x1998, 0x12801203, - 0x1998, 0x12801204, - 0x1998, 0x12801205, - 0x1998, 0x12801206, - 0x1998, 0x12801207, - 0x1998, 0x12801208, - 0x1998, 0x12801209, - 0x1998, 0x1280120A, - 0x1998, 0x1280120B, - 0x1998, 0x1280120C, - 0x1998, 0x1280120D, - 0x1998, 0x1280120E, - 0x1998, 0x1280120F, - 0x1998, 0x12801210, - 0x1998, 0x12801211, - 0x1998, 0x12801212, - 0x1998, 0x12801213, - 0x1998, 0x12801214, - 0x1998, 0x12801215, - 0x1998, 0x12801216, - 0x1998, 0x12801217, - 0x1998, 0x12801218, - 0x1998, 0x12801219, - 0x1998, 0x1280121A, - 0x1998, 0x1280121B, - 0x1998, 0x1280121C, - 0x1998, 0x1280121D, - 0x1998, 0x1280121E, - 0x1998, 0x1280121F, - 0x1998, 0x12801220, - 0x1998, 0x12801221, - 0x1998, 0x12801222, - 0x1998, 0x12801223, - 0x1998, 0x1280122C, - 0x1998, 0x1280122D, - 0x1998, 0x1280122E, - 0x1998, 0x1280122F, - 0x1998, 0x12801230, - 0x1998, 0x12801231, - 0x1998, 0x12801232, - 0x1998, 0x12801233, - 0x1998, 0x12801234, - 0x1998, 0x12801235, - 0x1998, 0x12801236, - 0x1998, 0x12801237, - 0x1998, 0x12801238, - 0x1998, 0x12801239, - 0x1998, 0x1280123A, - 0x1998, 0x1280123B, - 0x1998, 0x1280123C, - 0x1998, 0x1280123D, - 0x1998, 0x1280123E, - 0x1998, 0x1280123F, - 0x1998, 0x12801240, - 0x1998, 0x12801241, - 0x1998, 0x12801242, - 0x1998, 0x12801243, - 0x1998, 0x12801244, - 0x1998, 0x12801245, - 0x1998, 0x12801246, - 0x1998, 0x12801247, - 0x1998, 0x12801248, - 0x1998, 0x12801249, - 0x1998, 0x12801300, - 0x1998, 0x12801301, - 0x1998, 0x12801302, - 0x1998, 0x12801303, - 0x1998, 0x12801304, - 0x1998, 0x12801305, - 0x1998, 0x12801306, - 0x1998, 0x12801307, - 0x1998, 0x12801308, - 0x1998, 0x12801309, - 0x1998, 0x1280130A, - 0x1998, 0x1280130B, - 0x1998, 0x1280130C, - 0x1998, 0x1280130D, - 0x1998, 0x1280130E, - 0x1998, 0x1280130F, - 0x1998, 0x12801310, - 0x1998, 0x12801311, - 0x1998, 0x12801312, - 0x1998, 0x12801313, - 0x1998, 0x12801314, - 0x1998, 0x12801315, - 0x1998, 0x12801316, - 0x1998, 0x12801317, - 0x1998, 0x12801318, - 0x1998, 0x12801319, - 0x1998, 0x1280131A, - 0x1998, 0x1280131B, - 0x1998, 0x1280131C, - 0x1998, 0x1280131D, - 0x1998, 0x1280131E, - 0x1998, 0x1280131F, - 0x1998, 0x12801320, - 0x1998, 0x12801321, - 0x1998, 0x12801322, - 0x1998, 0x12801323, - 0x1998, 0x1280132C, - 0x1998, 0x1280132D, - 0x1998, 0x1280132E, - 0x1998, 0x1280132F, - 0x1998, 0x12801330, - 0x1998, 0x12801331, - 0x1998, 0x12801332, - 0x1998, 0x12801333, - 0x1998, 0x12801334, - 0x1998, 0x12801335, - 0x1998, 0x12801336, - 0x1998, 0x12801337, - 0x1998, 0x12801338, - 0x1998, 0x12801339, - 0x1998, 0x1280133A, - 0x1998, 0x1280133B, - 0x1998, 0x1280133C, - 0x1998, 0x1280133D, - 0x1998, 0x1280133E, - 0x1998, 0x1280133F, - 0x1998, 0x12801340, - 0x1998, 0x12801341, - 0x1998, 0x12801342, - 0x1998, 0x12801343, - 0x1998, 0x12801344, - 0x1998, 0x12801345, - 0x1998, 0x12801346, - 0x1998, 0x12801347, - 0x1998, 0x12801348, - 0x1998, 0x12801349, - 0x19D4, 0x88888888, - 0x19D8, 0x00000888, - 0xB00, 0xE3100100, - 0xB00, 0xE7100100, - 0xC60, 0x15808002, - 0xC60, 0x01808003, - 0xE60, 0x15808002, - 0xE60, 0x01808003, - 0x1860, 0x15808002, - 0x1860, 0x01808003, - 0x1A60, 0x15808002, - 0x1A60, 0x01808003, - 0xB00, 0xE3100100, - 0xC5C, 0x0D080058, - 0xE5C, 0x0D080058, - 0x185C, 0x0D080058, - 0x1A5C, 0x0D080058, - 0xC5C, 0x0D000058, - 0xE5C, 0x0D000058, - 0x185C, 0x0D000058, - 0x1A5C, 0x0D000058, - 0xC60, 0x05808002, - 0xC60, 0x0E808003, - 0xE60, 0x05808002, - 0xE60, 0x0E808003, - 0x1860, 0x05808002, - 0x1860, 0x0E808003, - 0x1A60, 0x05808002, - 0x1A60, 0x0E808003, - 0xB00, 0xE7100100, - 0xB00, 0xE3100100, - 0xB00, 0xE3100000, - 0x1C38, 0x00000002, - 0xA00, 0x00D047C8, - 0xA04, 0x46FF800C, - 0xA08, 0x8C838300, - 0xA0C, 0x2E7E000F, - 0xA10, 0x9500BB78, - 0xA14, 0x11144028, - 0xA18, 0x00881117, - 0xA1C, 0x89140F00, - 0xA20, 0x1A1B0030, - 0xA24, 0x090E1317, - 0xA28, 0x00000204, - 0xA2C, 0x00900000, - 0xA70, 0x101FFF00, - 0xA74, 0x00000128, - 0xA78, 0x00000900, - 0xA7C, 0x225B0606, - 0xA80, 0x218075B2, - 0xA84, 0x9C1F8C00, - 0x1B04, 0xE24628D2, - 0x1B10, 0x88010D46, - 0x1B14, 0x00000000, - 0x1B18, 0x00292903, - 0x1B00, 0xF8000000, - 0x1B00, 0xF800D000, - 0x1B00, 0xF801F000, - 0x1B1C, 0xA2123DB2, - 0x1B20, 0x07040001, - 0x1B24, 0x07060807, - 0x8000000c, 0x00000000, 0x40000000, 0x00000000, - 0x1B28, 0xC0060324, - 0x9000000f, 0x55555555, 0x40000000, 0x00000000, - 0x1B28, 0xC0060324, - 0x9000000f, 0x55ff5555, 0x40000000, 0x00000000, - 0x1B28, 0xC0060324, - 0x9000000f, 0xaaaaaaaa, 0x40000000, 0x00000000, - 0x1B28, 0xC0060324, - 0x9000000f, 0xaa00aaaa, 0x40000000, 0x00550000, - 0x1B28, 0xC0060324, - 0x90000004, 0x00000000, 0x40000000, 0x00000000, - 0x1B28, 0xC0060324, - 0xA0000000, 0x00000000, - 0x1B28, 0xC0060348, - 0xB0000000, 0x00000000, - 0x1B2C, 0x20000003, - 0x1B30, 0x20000000, - 0x1B38, 0x20000000, - 0x1B3C, 0x20000000, - 0x1BD4, 0x00000001, - 0x1B94, 0x80000000, - 0x1B34, 0x00000000, - 0x1B34, 0x00000002, - 0x1B34, 0x00000000, - 0x1B00, 0xF8000002, - 0x1B00, 0xF800D002, - 0x1B00, 0xF801F002, - 0x1B1C, 0xA2123DB2, - 0x1B20, 0x07040001, - 0x1B24, 0x07060807, - 0x8000000c, 0x00000000, 0x40000000, 0x00000000, - 0x1B28, 0xC0060324, - 0x9000000f, 0x55555555, 0x40000000, 0x00000000, - 0x1B28, 0xC0060324, - 0x9000000f, 0x55ff5555, 0x40000000, 0x00000000, - 0x1B28, 0xC0060324, - 0x9000000f, 0xaaaaaaaa, 0x40000000, 0x00000000, - 0x1B28, 0xC0060324, - 0x9000000f, 0xaa00aaaa, 0x40000000, 0x00550000, - 0x1B28, 0xC0060324, - 0x90000004, 0x00000000, 0x40000000, 0x00000000, - 0x1B28, 0xC0060324, - 0xA0000000, 0x00000000, - 0x1B28, 0xC0060348, - 0xB0000000, 0x00000000, - 0x1B2C, 0x20000003, - 0x1B30, 0x20000000, - 0x1B38, 0x20000000, - 0x1B3C, 0x20000000, - 0x1BD4, 0x00000001, - 0x1B94, 0x80000000, - 0x1B34, 0x00000000, - 0x1B34, 0x00000002, - 0x1B34, 0x00000000, - 0x1B00, 0xF8000004, - 0x1B00, 0xF800D004, - 0x1B00, 0xF801F004, - 0x1B1C, 0xA2123DB2, - 0x1B20, 0x07040001, - 0x1B24, 0x07060807, - 0x8000000c, 0x00000000, 0x40000000, 0x00000000, - 0x1B28, 0xC0060324, - 0x9000000f, 0x55555555, 0x40000000, 0x00000000, - 0x1B28, 0xC0060324, - 0x9000000f, 0x55ff5555, 0x40000000, 0x00000000, - 0x1B28, 0xC0060324, - 0x9000000f, 0xaaaaaaaa, 0x40000000, 0x00000000, - 0x1B28, 0xC0060324, - 0x9000000f, 0xaa00aaaa, 0x40000000, 0x00550000, - 0x1B28, 0xC0060324, - 0x90000004, 0x00000000, 0x40000000, 0x00000000, - 0x1B28, 0xC0060324, - 0xA0000000, 0x00000000, - 0x1B28, 0xC0060348, - 0xB0000000, 0x00000000, - 0x1B2C, 0x20000003, - 0x1B30, 0x20000000, - 0x1B38, 0x20000000, - 0x1B3C, 0x20000000, - 0x1BD4, 0x00000001, - 0x1B94, 0x80000000, - 0x1B34, 0x00000000, - 0x1B34, 0x00000002, - 0x1B34, 0x00000000, - 0x1B00, 0xF8000006, - 0x1B00, 0xF800D006, - 0x1B00, 0xF801F006, - 0x1B1C, 0xA2123DB2, - 0x1B20, 0x07040001, - 0x1B24, 0x07060807, - 0x8000000c, 0x00000000, 0x40000000, 0x00000000, - 0x1B28, 0xC0060324, - 0x9000000f, 0x55555555, 0x40000000, 0x00000000, - 0x1B28, 0xC0060324, - 0x9000000f, 0x55ff5555, 0x40000000, 0x00000000, - 0x1B28, 0xC0060324, - 0x9000000f, 0xaaaaaaaa, 0x40000000, 0x00000000, - 0x1B28, 0xC0060324, - 0x9000000f, 0xaa00aaaa, 0x40000000, 0x00550000, - 0x1B28, 0xC0060324, - 0x90000004, 0x00000000, 0x40000000, 0x00000000, - 0x1B28, 0xC0060324, - 0xA0000000, 0x00000000, - 0x1B28, 0xC0060348, - 0xB0000000, 0x00000000, - 0x1B2C, 0x20000003, - 0x1B30, 0x20000000, - 0x1B38, 0x20000000, - 0x1B3C, 0x20000000, - 0x1BD4, 0x00000001, - 0x1B94, 0x80000000, - 0x1B34, 0x00000000, - 0x1B34, 0x00000002, - 0x1B34, 0x00000000, - 0x1B00, 0xF8000000, - 0x1B80, 0x00000007, - 0x1B80, 0x09060005, - 0x1B80, 0x09060007, - 0x1B80, 0x0FFE0015, - 0x1B80, 0x0FFE0017, - 0x1B80, 0x00240025, - 0x1B80, 0x00240027, - 0x1B80, 0x00040035, - 0x1B80, 0x00040037, - 0x1B80, 0x05C00045, - 0x1B80, 0x05C00047, - 0x1B80, 0x00070055, - 0x1B80, 0x00070057, - 0x1B80, 0x64000065, - 0x1B80, 0x64000067, - 0x1B80, 0x00020075, - 0x1B80, 0x00020077, - 0x1B80, 0x00080085, - 0x1B80, 0x00080087, - 0x1B80, 0x80000095, - 0x1B80, 0x80000097, - 0x1B80, 0x090100A5, - 0x1B80, 0x090100A7, - 0x1B80, 0x0F0200B5, - 0x1B80, 0x0F0200B7, - 0x1B80, 0x002400C5, - 0x1B80, 0x002400C7, - 0x1B80, 0x000400D5, - 0x1B80, 0x000400D7, - 0x1B80, 0x05C000E5, - 0x1B80, 0x05C000E7, - 0x1B80, 0x000700F5, - 0x1B80, 0x000700F7, - 0x1B80, 0x64020105, - 0x1B80, 0x64020107, - 0x1B80, 0x00020115, - 0x1B80, 0x00020117, - 0x1B80, 0x00040125, - 0x1B80, 0x00040127, - 0x1B80, 0x4A000135, - 0x1B80, 0x4A000137, - 0x1B80, 0x4B040145, - 0x1B80, 0x4B040147, - 0x1B80, 0x85030155, - 0x1B80, 0x85030157, - 0x1B80, 0x40010165, - 0x1B80, 0x40010167, - 0x1B80, 0xE0290175, - 0x1B80, 0xE0290177, - 0x1B80, 0x00040185, - 0x1B80, 0x00040187, - 0x1B80, 0x4B050195, - 0x1B80, 0x4B050197, - 0x1B80, 0x860301A5, - 0x1B80, 0x860301A7, - 0x1B80, 0x400301B5, - 0x1B80, 0x400301B7, - 0x1B80, 0xE02901C5, - 0x1B80, 0xE02901C7, - 0x1B80, 0x000401D5, - 0x1B80, 0x000401D7, - 0x1B80, 0x4B0601E5, - 0x1B80, 0x4B0601E7, - 0x1B80, 0x870301F5, - 0x1B80, 0x870301F7, - 0x1B80, 0x40050205, - 0x1B80, 0x40050207, - 0x1B80, 0xE0290215, - 0x1B80, 0xE0290217, - 0x1B80, 0x00040225, - 0x1B80, 0x00040227, - 0x1B80, 0x4B070235, - 0x1B80, 0x4B070237, - 0x1B80, 0x88030245, - 0x1B80, 0x88030247, - 0x1B80, 0x40070255, - 0x1B80, 0x40070257, - 0x1B80, 0xE0290265, - 0x1B80, 0xE0290267, - 0x1B80, 0x4B000275, - 0x1B80, 0x4B000277, - 0x1B80, 0x30000285, - 0x1B80, 0x30000287, - 0x1B80, 0xFE100295, - 0x1B80, 0xFE100297, - 0x1B80, 0xFF1002A5, - 0x1B80, 0xFF1002A7, - 0x1B80, 0xE18602B5, - 0x1B80, 0xE18602B7, - 0x1B80, 0xF00A02C5, - 0x1B80, 0xF00A02C7, - 0x1B80, 0xF10A02D5, - 0x1B80, 0xF10A02D7, - 0x1B80, 0xF20A02E5, - 0x1B80, 0xF20A02E7, - 0x1B80, 0xF30802F5, - 0x1B80, 0xF30802F7, - 0x1B80, 0xF4070305, - 0x1B80, 0xF4070307, - 0x1B80, 0xF5060315, - 0x1B80, 0xF5060317, - 0x1B80, 0xF7060325, - 0x1B80, 0xF7060327, - 0x1B80, 0xF8050335, - 0x1B80, 0xF8050337, - 0x1B80, 0xF9040345, - 0x1B80, 0xF9040347, - 0x1B80, 0x00010355, - 0x1B80, 0x00010357, - 0x1B80, 0x303B0365, - 0x1B80, 0x303B0367, - 0x1B80, 0x30500375, - 0x1B80, 0x30500377, - 0x1B80, 0x305C0385, - 0x1B80, 0x305C0387, - 0x1B80, 0x31D50395, - 0x1B80, 0x31D50397, - 0x1B80, 0x31C503A5, - 0x1B80, 0x31C503A7, - 0x1B80, 0x4D0403B5, - 0x1B80, 0x4D0403B7, - 0x1B80, 0x2EF003C5, - 0x1B80, 0x2EF003C7, - 0x1B80, 0x000203D5, - 0x1B80, 0x000203D7, - 0x1B80, 0x208003E5, - 0x1B80, 0x208003E7, - 0x1B80, 0x000003F5, - 0x1B80, 0x000003F7, - 0x1B80, 0x4D000405, - 0x1B80, 0x4D000407, - 0x1B80, 0x55070415, - 0x1B80, 0x55070417, - 0x1B80, 0xE1230425, - 0x1B80, 0xE1230427, - 0x1B80, 0xE1230435, - 0x1B80, 0xE1230437, - 0x1B80, 0x4D040445, - 0x1B80, 0x4D040447, - 0x1B80, 0x20800455, - 0x1B80, 0x20800457, - 0x1B80, 0x84000465, - 0x1B80, 0x84000467, - 0x1B80, 0x4D000475, - 0x1B80, 0x4D000477, - 0x1B80, 0x550F0485, - 0x1B80, 0x550F0487, - 0x1B80, 0xE1230495, - 0x1B80, 0xE1230497, - 0x1B80, 0x4F0204A5, - 0x1B80, 0x4F0204A7, - 0x1B80, 0x4E0004B5, - 0x1B80, 0x4E0004B7, - 0x1B80, 0x530204C5, - 0x1B80, 0x530204C7, - 0x1B80, 0x520104D5, - 0x1B80, 0x520104D7, - 0x1B80, 0xE12704E5, - 0x1B80, 0xE12704E7, - 0x1B80, 0x000104F5, - 0x1B80, 0x000104F7, - 0x1B80, 0x5C720505, - 0x1B80, 0x5C720507, - 0x1B80, 0xE1320515, - 0x1B80, 0xE1320517, - 0x1B80, 0x54E50525, - 0x1B80, 0x54E50527, - 0x1B80, 0x54BF0535, - 0x1B80, 0x54BF0537, - 0x1B80, 0x54C50545, - 0x1B80, 0x54C50547, - 0x1B80, 0x54BE0555, - 0x1B80, 0x54BE0557, - 0x1B80, 0x54DF0565, - 0x1B80, 0x54DF0567, - 0x1B80, 0x0BA60575, - 0x1B80, 0x0BA60577, - 0x1B80, 0xF3130585, - 0x1B80, 0xF3130587, - 0x1B80, 0xF41E0595, - 0x1B80, 0xF41E0597, - 0x1B80, 0xF53C05A5, - 0x1B80, 0xF53C05A7, - 0x1B80, 0x000105B5, - 0x1B80, 0x000105B7, - 0x1B80, 0x620605C5, - 0x1B80, 0x620605C7, - 0x1B80, 0x600605D5, - 0x1B80, 0x600605D7, - 0x1B80, 0xE1A905E5, - 0x1B80, 0xE1A905E7, - 0x1B80, 0x0C0005F5, - 0x1B80, 0x0C0005F7, - 0x1B80, 0x5C720605, - 0x1B80, 0x5C720607, - 0x1B80, 0xE1320615, - 0x1B80, 0xE1320617, - 0x1B80, 0x5CF10625, - 0x1B80, 0x5CF10627, - 0x1B80, 0x0C010635, - 0x1B80, 0x0C010637, - 0x1B80, 0xF2020645, - 0x1B80, 0xF2020647, - 0x1B80, 0x30D60655, - 0x1B80, 0x30D60657, - 0x1B80, 0x0AC60665, - 0x1B80, 0x0AC60667, - 0x1B80, 0xE1B60675, - 0x1B80, 0xE1B60677, - 0x1B80, 0xE1580685, - 0x1B80, 0xE1580687, - 0x1B80, 0x54E50695, - 0x1B80, 0x54E50697, - 0x1B80, 0x000106A5, - 0x1B80, 0x000106A7, - 0x1B80, 0x560106B5, - 0x1B80, 0x560106B7, - 0x1B80, 0x5CE206C5, - 0x1B80, 0x5CE206C7, - 0x1B80, 0x0AE106D5, - 0x1B80, 0x0AE106D7, - 0x1B80, 0x630C06E5, - 0x1B80, 0x630C06E7, - 0x1B80, 0xE13F06F5, - 0x1B80, 0xE13F06F7, - 0x1B80, 0x00270705, - 0x1B80, 0x00270707, - 0x1B80, 0xE16C0715, - 0x1B80, 0xE16C0717, - 0x1B80, 0x00020725, - 0x1B80, 0x00020727, - 0x1B80, 0x002A0735, - 0x1B80, 0x002A0737, - 0x1B80, 0x07140745, - 0x1B80, 0x07140747, - 0x1B80, 0x00020755, - 0x1B80, 0x00020757, - 0x1B80, 0x30C30765, - 0x1B80, 0x30C30767, - 0x1B80, 0x56010775, - 0x1B80, 0x56010777, - 0x1B80, 0x5CE20785, - 0x1B80, 0x5CE20787, - 0x1B80, 0x0AE10795, - 0x1B80, 0x0AE10797, - 0x1B80, 0x631707A5, - 0x1B80, 0x631707A7, - 0x1B80, 0xE13F07B5, - 0x1B80, 0xE13F07B7, - 0x1B80, 0x002507C5, - 0x1B80, 0x002507C7, - 0x1B80, 0xE16C07D5, - 0x1B80, 0xE16C07D7, - 0x1B80, 0x000207E5, - 0x1B80, 0x000207E7, - 0x1B80, 0x630F07F5, - 0x1B80, 0x630F07F7, - 0x1B80, 0xE13F0805, - 0x1B80, 0xE13F0807, - 0x1B80, 0x63070815, - 0x1B80, 0x63070817, - 0x1B80, 0xE13F0825, - 0x1B80, 0xE13F0827, - 0x1B80, 0x07140835, - 0x1B80, 0x07140837, - 0x1B80, 0x56000845, - 0x1B80, 0x56000847, - 0x1B80, 0x5CF20855, - 0x1B80, 0x5CF20857, - 0x1B80, 0x0AF10865, - 0x1B80, 0x0AF10867, - 0x1B80, 0x07140875, - 0x1B80, 0x07140877, - 0x1B80, 0x07140885, - 0x1B80, 0x07140887, - 0x1B80, 0x630F0895, - 0x1B80, 0x630F0897, - 0x1B80, 0xE13F08A5, - 0x1B80, 0xE13F08A7, - 0x1B80, 0x631708B5, - 0x1B80, 0x631708B7, - 0x1B80, 0xE13F08C5, - 0x1B80, 0xE13F08C7, - 0x1B80, 0x002508D5, - 0x1B80, 0x002508D7, - 0x1B80, 0xE16C08E5, - 0x1B80, 0xE16C08E7, - 0x1B80, 0x000208F5, - 0x1B80, 0x000208F7, - 0x1B80, 0x30C30905, - 0x1B80, 0x30C30907, - 0x1B80, 0xE1A90915, - 0x1B80, 0xE1A90917, - 0x1B80, 0x62060925, - 0x1B80, 0x62060927, - 0x1B80, 0x60060935, - 0x1B80, 0x60060937, - 0x1B80, 0xE1160945, - 0x1B80, 0xE1160947, - 0x1B80, 0x54BE0955, - 0x1B80, 0x54BE0957, - 0x1B80, 0x56010965, - 0x1B80, 0x56010967, - 0x1B80, 0x5CE20975, - 0x1B80, 0x5CE20977, - 0x1B80, 0x0AE10985, - 0x1B80, 0x0AE10987, - 0x1B80, 0x633A0995, - 0x1B80, 0x633A0997, - 0x1B80, 0xE13F09A5, - 0x1B80, 0xE13F09A7, - 0x1B80, 0x633709B5, - 0x1B80, 0x633709B7, - 0x1B80, 0xE13F09C5, - 0x1B80, 0xE13F09C7, - 0x1B80, 0x632F09D5, - 0x1B80, 0x632F09D7, - 0x1B80, 0xE13F09E5, - 0x1B80, 0xE13F09E7, - 0x1B80, 0x632709F5, - 0x1B80, 0x632709F7, - 0x1B80, 0xE13F0A05, - 0x1B80, 0xE13F0A07, - 0x1B80, 0x631F0A15, - 0x1B80, 0x631F0A17, - 0x1B80, 0xE13F0A25, - 0x1B80, 0xE13F0A27, - 0x1B80, 0x63170A35, - 0x1B80, 0x63170A37, - 0x1B80, 0xE13F0A45, - 0x1B80, 0xE13F0A47, - 0x1B80, 0x630F0A55, - 0x1B80, 0x630F0A57, - 0x1B80, 0xE13F0A65, - 0x1B80, 0xE13F0A67, - 0x1B80, 0x63070A75, - 0x1B80, 0x63070A77, - 0x1B80, 0xE13F0A85, - 0x1B80, 0xE13F0A87, - 0x1B80, 0xE16C0A95, - 0x1B80, 0xE16C0A97, - 0x1B80, 0x56000AA5, - 0x1B80, 0x56000AA7, - 0x1B80, 0x5CF20AB5, - 0x1B80, 0x5CF20AB7, - 0x1B80, 0x0AF10AC5, - 0x1B80, 0x0AF10AC7, - 0x1B80, 0xF5040AD5, - 0x1B80, 0xF5040AD7, - 0x1B80, 0xE13F0AE5, - 0x1B80, 0xE13F0AE7, - 0x1B80, 0xE16C0AF5, - 0x1B80, 0xE16C0AF7, - 0x1B80, 0x30B30B05, - 0x1B80, 0x30B30B07, - 0x1B80, 0x07140B15, - 0x1B80, 0x07140B17, - 0x1B80, 0x07140B25, - 0x1B80, 0x07140B27, - 0x1B80, 0x630F0B35, - 0x1B80, 0x630F0B37, - 0x1B80, 0xE13F0B45, - 0x1B80, 0xE13F0B47, - 0x1B80, 0x63170B55, - 0x1B80, 0x63170B57, - 0x1B80, 0xE13F0B65, - 0x1B80, 0xE13F0B67, - 0x1B80, 0x631F0B75, - 0x1B80, 0x631F0B77, - 0x1B80, 0xE13F0B85, - 0x1B80, 0xE13F0B87, - 0x1B80, 0x63270B95, - 0x1B80, 0x63270B97, - 0x1B80, 0xE13F0BA5, - 0x1B80, 0xE13F0BA7, - 0x1B80, 0x632F0BB5, - 0x1B80, 0x632F0BB7, - 0x1B80, 0xE13F0BC5, - 0x1B80, 0xE13F0BC7, - 0x1B80, 0x63370BD5, - 0x1B80, 0x63370BD7, - 0x1B80, 0xE13F0BE5, - 0x1B80, 0xE13F0BE7, - 0x1B80, 0x633A0BF5, - 0x1B80, 0x633A0BF7, - 0x1B80, 0xE13F0C05, - 0x1B80, 0xE13F0C07, - 0x1B80, 0xF60B0C15, - 0x1B80, 0xF60B0C17, - 0x1B80, 0xF7170C25, - 0x1B80, 0xF7170C27, - 0x1B80, 0x4D300C35, - 0x1B80, 0x4D300C37, - 0x1B80, 0x57040C45, - 0x1B80, 0x57040C47, - 0x1B80, 0x57000C55, - 0x1B80, 0x57000C57, - 0x1B80, 0x96000C65, - 0x1B80, 0x96000C67, - 0x1B80, 0x57080C75, - 0x1B80, 0x57080C77, - 0x1B80, 0x57000C85, - 0x1B80, 0x57000C87, - 0x1B80, 0x95000C95, - 0x1B80, 0x95000C97, - 0x1B80, 0x4D000CA5, - 0x1B80, 0x4D000CA7, - 0x1B80, 0x6C070CB5, - 0x1B80, 0x6C070CB7, - 0x1B80, 0x00010CC5, - 0x1B80, 0x00010CC7, - 0x1B80, 0x00220CD5, - 0x1B80, 0x00220CD7, - 0x1B80, 0x06140CE5, - 0x1B80, 0x06140CE7, - 0x1B80, 0xE16C0CF5, - 0x1B80, 0xE16C0CF7, - 0x1B80, 0x00020D05, - 0x1B80, 0x00020D07, - 0x1B80, 0x00250D15, - 0x1B80, 0x00250D17, - 0x1B80, 0x06140D25, - 0x1B80, 0x06140D27, - 0x1B80, 0xE16C0D35, - 0x1B80, 0xE16C0D37, - 0x1B80, 0x00020D45, - 0x1B80, 0x00020D47, - 0x1B80, 0x00010D55, - 0x1B80, 0x00010D57, - 0x1B80, 0x00320D65, - 0x1B80, 0x00320D67, - 0x1B80, 0xE16C0D75, - 0x1B80, 0xE16C0D77, - 0x1B80, 0x00020D85, - 0x1B80, 0x00020D87, - 0x1B80, 0xE1860D95, - 0x1B80, 0xE1860D97, - 0x1B80, 0xE1B60DA5, - 0x1B80, 0xE1B60DA7, - 0x1B80, 0x5CD10DB5, - 0x1B80, 0x5CD10DB7, - 0x1B80, 0x673A0DC5, - 0x1B80, 0x673A0DC7, - 0x1B80, 0xE1230DD5, - 0x1B80, 0xE1230DD7, - 0x1B80, 0xF80B0DE5, - 0x1B80, 0xF80B0DE7, - 0x1B80, 0xF9110DF5, - 0x1B80, 0xF9110DF7, - 0x1B80, 0xE1580E05, - 0x1B80, 0xE1580E07, - 0x1B80, 0x67370E15, - 0x1B80, 0x67370E17, - 0x1B80, 0xE1580E25, - 0x1B80, 0xE1580E27, - 0x1B80, 0x672F0E35, - 0x1B80, 0x672F0E37, - 0x1B80, 0xE1580E45, - 0x1B80, 0xE1580E47, - 0x1B80, 0x67270E55, - 0x1B80, 0x67270E57, - 0x1B80, 0xE1580E65, - 0x1B80, 0xE1580E67, - 0x1B80, 0x671F0E75, - 0x1B80, 0x671F0E77, - 0x1B80, 0xE1580E85, - 0x1B80, 0xE1580E87, - 0x1B80, 0x67170E95, - 0x1B80, 0x67170E97, - 0x1B80, 0xE1580EA5, - 0x1B80, 0xE1580EA7, - 0x1B80, 0xF8020EB5, - 0x1B80, 0xF8020EB7, - 0x1B80, 0x30EE0EC5, - 0x1B80, 0x30EE0EC7, - 0x1B80, 0xE0D10ED5, - 0x1B80, 0xE0D10ED7, - 0x1B80, 0x670F0EE5, - 0x1B80, 0x670F0EE7, - 0x1B80, 0xE1580EF5, - 0x1B80, 0xE1580EF7, - 0x1B80, 0x67070F05, - 0x1B80, 0x67070F07, - 0x1B80, 0xE1580F15, - 0x1B80, 0xE1580F17, - 0x1B80, 0xF9020F25, - 0x1B80, 0xF9020F27, - 0x1B80, 0x30F50F35, - 0x1B80, 0x30F50F37, - 0x1B80, 0xE0CD0F45, - 0x1B80, 0xE0CD0F47, - 0x1B80, 0x06140F55, - 0x1B80, 0x06140F57, - 0x1B80, 0xE16C0F65, - 0x1B80, 0xE16C0F67, - 0x1B80, 0x5CF10F75, - 0x1B80, 0x5CF10F77, - 0x1B80, 0xE1580F85, - 0x1B80, 0xE1580F87, - 0x1B80, 0x06140F95, - 0x1B80, 0x06140F97, - 0x1B80, 0xE16C0FA5, - 0x1B80, 0xE16C0FA7, - 0x1B80, 0xF9020FB5, - 0x1B80, 0xF9020FB7, - 0x1B80, 0x30FF0FC5, - 0x1B80, 0x30FF0FC7, - 0x1B80, 0xE0CD0FD5, - 0x1B80, 0xE0CD0FD7, - 0x1B80, 0x31130FE5, - 0x1B80, 0x31130FE7, - 0x1B80, 0x670F0FF5, - 0x1B80, 0x670F0FF7, - 0x1B80, 0xE1581005, - 0x1B80, 0xE1581007, - 0x1B80, 0x67171015, - 0x1B80, 0x67171017, - 0x1B80, 0xE1581025, - 0x1B80, 0xE1581027, - 0x1B80, 0xF8021035, - 0x1B80, 0xF8021037, - 0x1B80, 0x31071045, - 0x1B80, 0x31071047, - 0x1B80, 0xE0D11055, - 0x1B80, 0xE0D11057, - 0x1B80, 0x31131065, - 0x1B80, 0x31131067, - 0x1B80, 0x670F1075, - 0x1B80, 0x670F1077, - 0x1B80, 0xE1581085, - 0x1B80, 0xE1581087, - 0x1B80, 0x671F1095, - 0x1B80, 0x671F1097, - 0x1B80, 0xE15810A5, - 0x1B80, 0xE15810A7, - 0x1B80, 0x672710B5, - 0x1B80, 0x672710B7, - 0x1B80, 0xE15810C5, - 0x1B80, 0xE15810C7, - 0x1B80, 0x672F10D5, - 0x1B80, 0x672F10D7, - 0x1B80, 0xE15810E5, - 0x1B80, 0xE15810E7, - 0x1B80, 0x673710F5, - 0x1B80, 0x673710F7, - 0x1B80, 0xE1581105, - 0x1B80, 0xE1581107, - 0x1B80, 0x673A1115, - 0x1B80, 0x673A1117, - 0x1B80, 0xE1581125, - 0x1B80, 0xE1581127, - 0x1B80, 0x4D101135, - 0x1B80, 0x4D101137, - 0x1B80, 0x30C41145, - 0x1B80, 0x30C41147, - 0x1B80, 0x00011155, - 0x1B80, 0x00011157, - 0x1B80, 0x6F241165, - 0x1B80, 0x6F241167, - 0x1B80, 0x6E401175, - 0x1B80, 0x6E401177, - 0x1B80, 0x6D001185, - 0x1B80, 0x6D001187, - 0x1B80, 0x55031195, - 0x1B80, 0x55031197, - 0x1B80, 0x312311A5, - 0x1B80, 0x312311A7, - 0x1B80, 0x6F1C11B5, - 0x1B80, 0x6F1C11B7, - 0x1B80, 0x6E4011C5, - 0x1B80, 0x6E4011C7, - 0x1B80, 0x550B11D5, - 0x1B80, 0x550B11D7, - 0x1B80, 0x312311E5, - 0x1B80, 0x312311E7, - 0x1B80, 0x061C11F5, - 0x1B80, 0x061C11F7, - 0x1B80, 0x54DE1205, - 0x1B80, 0x54DE1207, - 0x1B80, 0x06DC1215, - 0x1B80, 0x06DC1217, - 0x1B80, 0x55131225, - 0x1B80, 0x55131227, - 0x1B80, 0x74011235, - 0x1B80, 0x74011237, - 0x1B80, 0x74001245, - 0x1B80, 0x74001247, - 0x1B80, 0x8E001255, - 0x1B80, 0x8E001257, - 0x1B80, 0x00011265, - 0x1B80, 0x00011267, - 0x1B80, 0x57021275, - 0x1B80, 0x57021277, - 0x1B80, 0x57001285, - 0x1B80, 0x57001287, - 0x1B80, 0x97001295, - 0x1B80, 0x97001297, - 0x1B80, 0x000112A5, - 0x1B80, 0x000112A7, - 0x1B80, 0x54BF12B5, - 0x1B80, 0x54BF12B7, - 0x1B80, 0x54C112C5, - 0x1B80, 0x54C112C7, - 0x1B80, 0x54A212D5, - 0x1B80, 0x54A212D7, - 0x1B80, 0x54C012E5, - 0x1B80, 0x54C012E7, - 0x1B80, 0x54A112F5, - 0x1B80, 0x54A112F7, - 0x1B80, 0x54DF1305, - 0x1B80, 0x54DF1307, - 0x1B80, 0x00011315, - 0x1B80, 0x00011317, - 0x1B80, 0x55001325, - 0x1B80, 0x55001327, - 0x1B80, 0xE1231335, - 0x1B80, 0xE1231337, - 0x1B80, 0x54811345, - 0x1B80, 0x54811347, - 0x1B80, 0xE1231355, - 0x1B80, 0xE1231357, - 0x1B80, 0x54801365, - 0x1B80, 0x54801367, - 0x1B80, 0x002A1375, - 0x1B80, 0x002A1377, - 0x1B80, 0xE12B1385, - 0x1B80, 0xE12B1387, - 0x1B80, 0xE1231395, - 0x1B80, 0xE1231397, - 0x1B80, 0x548013A5, - 0x1B80, 0x548013A7, - 0x1B80, 0xE17213B5, - 0x1B80, 0xE17213B7, - 0x1B80, 0xBF3013C5, - 0x1B80, 0xBF3013C7, - 0x1B80, 0x000213D5, - 0x1B80, 0x000213D7, - 0x1B80, 0x302813E5, - 0x1B80, 0x302813E7, - 0x1B80, 0x4F7813F5, - 0x1B80, 0x4F7813F7, - 0x1B80, 0x4E001405, - 0x1B80, 0x4E001407, - 0x1B80, 0x53871415, - 0x1B80, 0x53871417, - 0x1B80, 0x52F11425, - 0x1B80, 0x52F11427, - 0x1B80, 0xE1161435, - 0x1B80, 0xE1161437, - 0x1B80, 0xE11B1445, - 0x1B80, 0xE11B1447, - 0x1B80, 0xE11F1455, - 0x1B80, 0xE11F1457, - 0x1B80, 0xE1271465, - 0x1B80, 0xE1271467, - 0x1B80, 0x54811475, - 0x1B80, 0x54811477, - 0x1B80, 0xE1161485, - 0x1B80, 0xE1161487, - 0x1B80, 0xE11B1495, - 0x1B80, 0xE11B1497, - 0x1B80, 0xE11F14A5, - 0x1B80, 0xE11F14A7, - 0x1B80, 0xE12714B5, - 0x1B80, 0xE12714B7, - 0x1B80, 0x548014C5, - 0x1B80, 0x548014C7, - 0x1B80, 0x002A14D5, - 0x1B80, 0x002A14D7, - 0x1B80, 0xE12B14E5, - 0x1B80, 0xE12B14E7, - 0x1B80, 0xE11614F5, - 0x1B80, 0xE11614F7, - 0x1B80, 0xE11B1505, - 0x1B80, 0xE11B1507, - 0x1B80, 0xE11F1515, - 0x1B80, 0xE11F1517, - 0x1B80, 0xE1271525, - 0x1B80, 0xE1271527, - 0x1B80, 0x54801535, - 0x1B80, 0x54801537, - 0x1B80, 0xE1721545, - 0x1B80, 0xE1721547, - 0x1B80, 0xBF171555, - 0x1B80, 0xBF171557, - 0x1B80, 0x00021565, - 0x1B80, 0x00021567, - 0x1B80, 0x30281575, - 0x1B80, 0x30281577, - 0x1B80, 0x06141585, - 0x1B80, 0x06141587, - 0x1B80, 0x73201595, - 0x1B80, 0x73201597, - 0x1B80, 0x720015A5, - 0x1B80, 0x720015A7, - 0x1B80, 0x710015B5, - 0x1B80, 0x710015B7, - 0x1B80, 0x550115C5, - 0x1B80, 0x550115C7, - 0x1B80, 0xE12315D5, - 0x1B80, 0xE12315D7, - 0x1B80, 0xE12715E5, - 0x1B80, 0xE12715E7, - 0x1B80, 0x548115F5, - 0x1B80, 0x548115F7, - 0x1B80, 0xE1231605, - 0x1B80, 0xE1231607, - 0x1B80, 0xE1271615, - 0x1B80, 0xE1271617, - 0x1B80, 0x54801625, - 0x1B80, 0x54801627, - 0x1B80, 0x002A1635, - 0x1B80, 0x002A1637, - 0x1B80, 0xE12B1645, - 0x1B80, 0xE12B1647, - 0x1B80, 0xE1231655, - 0x1B80, 0xE1231657, - 0x1B80, 0xE1271665, - 0x1B80, 0xE1271667, - 0x1B80, 0x54801675, - 0x1B80, 0x54801677, - 0x1B80, 0xE1721685, - 0x1B80, 0xE1721687, - 0x1B80, 0xBF031695, - 0x1B80, 0xBF031697, - 0x1B80, 0x000216A5, - 0x1B80, 0x000216A7, - 0x1B80, 0x302816B5, - 0x1B80, 0x302816B7, - 0x1B80, 0x54BF16C5, - 0x1B80, 0x54BF16C7, - 0x1B80, 0x54C516D5, - 0x1B80, 0x54C516D7, - 0x1B80, 0x050A16E5, - 0x1B80, 0x050A16E7, - 0x1B80, 0x071416F5, - 0x1B80, 0x071416F7, - 0x1B80, 0x54DF1705, - 0x1B80, 0x54DF1707, - 0x1B80, 0x00011715, - 0x1B80, 0x00011717, - 0x1B80, 0x54BF1725, - 0x1B80, 0x54BF1727, - 0x1B80, 0x54C01735, - 0x1B80, 0x54C01737, - 0x1B80, 0x54A31745, - 0x1B80, 0x54A31747, - 0x1B80, 0x54C11755, - 0x1B80, 0x54C11757, - 0x1B80, 0x54A41765, - 0x1B80, 0x54A41767, - 0x1B80, 0x4C831775, - 0x1B80, 0x4C831777, - 0x1B80, 0x4C031785, - 0x1B80, 0x4C031787, - 0x1B80, 0xBF0B1795, - 0x1B80, 0xBF0B1797, - 0x1B80, 0x54C217A5, - 0x1B80, 0x54C217A7, - 0x1B80, 0x54A417B5, - 0x1B80, 0x54A417B7, - 0x1B80, 0x4C8517C5, - 0x1B80, 0x4C8517C7, - 0x1B80, 0x4C0517D5, - 0x1B80, 0x4C0517D7, - 0x1B80, 0xBF0617E5, - 0x1B80, 0xBF0617E7, - 0x1B80, 0x54C117F5, - 0x1B80, 0x54C117F7, - 0x1B80, 0x54A31805, - 0x1B80, 0x54A31807, - 0x1B80, 0x4C861815, - 0x1B80, 0x4C861817, - 0x1B80, 0x4C061825, - 0x1B80, 0x4C061827, - 0x1B80, 0xBF011835, - 0x1B80, 0xBF011837, - 0x1B80, 0x54DF1845, - 0x1B80, 0x54DF1847, - 0x1B80, 0x00011855, - 0x1B80, 0x00011857, - 0x1B80, 0x00071865, - 0x1B80, 0x00071867, - 0x1B80, 0x54011875, - 0x1B80, 0x54011877, - 0x1B80, 0x00041885, - 0x1B80, 0x00041887, - 0x1B80, 0x56001895, - 0x1B80, 0x56001897, - 0x1B80, 0x5CF218A5, - 0x1B80, 0x5CF218A7, - 0x1B80, 0x630718B5, - 0x1B80, 0x630718B7, - 0x1B80, 0x620418C5, - 0x1B80, 0x620418C7, - 0x1B80, 0x610018D5, - 0x1B80, 0x610018D7, - 0x1B80, 0x670718E5, - 0x1B80, 0x670718E7, - 0x1B80, 0x660618F5, - 0x1B80, 0x660618F7, - 0x1B80, 0x6F201905, - 0x1B80, 0x6F201907, - 0x1B80, 0x6E001915, - 0x1B80, 0x6E001917, - 0x1B80, 0x6D001925, - 0x1B80, 0x6D001927, - 0x1B80, 0x6C031935, - 0x1B80, 0x6C031937, - 0x1B80, 0x73201945, - 0x1B80, 0x73201947, - 0x1B80, 0x72001955, - 0x1B80, 0x72001957, - 0x1B80, 0x71001965, - 0x1B80, 0x71001967, - 0x1B80, 0x7B201975, - 0x1B80, 0x7B201977, - 0x1B80, 0x7A001985, - 0x1B80, 0x7A001987, - 0x1B80, 0x79001995, - 0x1B80, 0x79001997, - 0x1B80, 0x7F2019A5, - 0x1B80, 0x7F2019A7, - 0x1B80, 0x7E0019B5, - 0x1B80, 0x7E0019B7, - 0x1B80, 0x7D0019C5, - 0x1B80, 0x7D0019C7, - 0x1B80, 0x090119D5, - 0x1B80, 0x090119D7, - 0x1B80, 0x0AC619E5, - 0x1B80, 0x0AC619E7, - 0x1B80, 0x0BA619F5, - 0x1B80, 0x0BA619F7, - 0x1B80, 0x0C011A05, - 0x1B80, 0x0C011A07, - 0x1B80, 0x0D021A15, - 0x1B80, 0x0D021A17, - 0x1B80, 0x0E041A25, - 0x1B80, 0x0E041A27, - 0x1B80, 0x0FFF1A35, - 0x1B80, 0x0FFF1A37, - 0x1B80, 0x4D041A45, - 0x1B80, 0x4D041A47, - 0x1B80, 0x28F81A55, - 0x1B80, 0x28F81A57, - 0x1B80, 0xE0001A65, - 0x1B80, 0xE0001A67, - 0x1B80, 0x4D001A75, - 0x1B80, 0x4D001A77, - 0x1B80, 0x00011A85, - 0x1B80, 0x00011A87, - 0x1B80, 0x4D041A95, - 0x1B80, 0x4D041A97, - 0x1B80, 0x2EF81AA5, - 0x1B80, 0x2EF81AA7, - 0x1B80, 0x00021AB5, - 0x1B80, 0x00021AB7, - 0x1B80, 0x23031AC5, - 0x1B80, 0x23031AC7, - 0x1B80, 0x00001AD5, - 0x1B80, 0x00001AD7, - 0x1B80, 0x23131AE5, - 0x1B80, 0x23131AE7, - 0x1B80, 0xE77F1AF5, - 0x1B80, 0xE77F1AF7, - 0x1B80, 0x232F1B05, - 0x1B80, 0x232F1B07, - 0x1B80, 0xEFBF1B15, - 0x1B80, 0xEFBF1B17, - 0x1B80, 0x2EF01B25, - 0x1B80, 0x2EF01B27, - 0x1B80, 0x00021B35, - 0x1B80, 0x00021B37, - 0x1B80, 0x4D001B45, - 0x1B80, 0x4D001B47, - 0x1B80, 0x00011B55, - 0x1B80, 0x00011B57, - 0x1B80, 0x4D041B65, - 0x1B80, 0x4D041B67, - 0x1B80, 0x2EF81B75, - 0x1B80, 0x2EF81B77, - 0x1B80, 0x00021B85, - 0x1B80, 0x00021B87, - 0x1B80, 0x23031B95, - 0x1B80, 0x23031B97, - 0x1B80, 0x00001BA5, - 0x1B80, 0x00001BA7, - 0x1B80, 0x23131BB5, - 0x1B80, 0x23131BB7, - 0x1B80, 0xE77F1BC5, - 0x1B80, 0xE77F1BC7, - 0x1B80, 0x232F1BD5, - 0x1B80, 0x232F1BD7, - 0x1B80, 0xE79F1BE5, - 0x1B80, 0xE79F1BE7, - 0x1B80, 0x2EF01BF5, - 0x1B80, 0x2EF01BF7, - 0x1B80, 0x00021C05, - 0x1B80, 0x00021C07, - 0x1B80, 0x28F81C15, - 0x1B80, 0x28F81C17, - 0x1B80, 0x80001C25, - 0x1B80, 0x80001C27, - 0x1B80, 0x4D001C35, - 0x1B80, 0x4D001C37, - 0x1B80, 0x00011C45, - 0x1B80, 0x00011C47, - 0x1B80, 0x00041C55, - 0x1B80, 0x00041C57, - 0x1B80, 0x6BC01C65, - 0x1B80, 0x6BC01C67, - 0x1B80, 0x4D041C75, - 0x1B80, 0x4D041C77, - 0x8000000c, 0x00000000, 0x40000000, 0x00000000, - 0x1B80, 0x68241C85, - 0x1B80, 0x68241C87, - 0x9000000f, 0x55555555, 0x40000000, 0x00000000, - 0x1B80, 0x68241C85, - 0x1B80, 0x68241C87, - 0x9000000f, 0x55ff5555, 0x40000000, 0x00000000, - 0x1B80, 0x68241C85, - 0x1B80, 0x68241C87, - 0x9000000f, 0xaaaaaaaa, 0x40000000, 0x00000000, - 0x1B80, 0x68241C85, - 0x1B80, 0x68241C87, - 0x9000000f, 0xaa00aaaa, 0x40000000, 0x00550000, - 0x1B80, 0x68241C85, - 0x1B80, 0x68241C87, - 0x90000004, 0x00000000, 0x40000000, 0x00000000, - 0x1B80, 0x68241C85, - 0x1B80, 0x68241C87, - 0xA0000000, 0x00000000, - 0x1B80, 0x68481C85, - 0x1B80, 0x68481C87, - 0xB0000000, 0x00000000, - 0x1B80, 0x66061C95, - 0x1B80, 0x66061C97, - 0x8000000c, 0x00000000, 0x40000000, 0x00000000, - 0x1B80, 0x650C1CA5, - 0x1B80, 0x650C1CA7, - 0x9000000f, 0x55555555, 0x40000000, 0x00000000, - 0x1B80, 0x650C1CA5, - 0x1B80, 0x650C1CA7, - 0x9000000f, 0x55ff5555, 0x40000000, 0x00000000, - 0x1B80, 0x650C1CA5, - 0x1B80, 0x650C1CA7, - 0x9000000f, 0xaaaaaaaa, 0x40000000, 0x00000000, - 0x1B80, 0x650C1CA5, - 0x1B80, 0x650C1CA7, - 0x9000000f, 0xaa00aaaa, 0x40000000, 0x00550000, - 0x1B80, 0x650C1CA5, - 0x1B80, 0x650C1CA7, - 0x90000004, 0x00000000, 0x40000000, 0x00000000, - 0x1B80, 0x650C1CA5, - 0x1B80, 0x650C1CA7, - 0xA0000000, 0x00000000, - 0x1B80, 0x65041CA5, - 0x1B80, 0x65041CA7, - 0xB0000000, 0x00000000, - 0x1B80, 0x64471CB5, - 0x1B80, 0x64471CB7, - 0x1B80, 0x23411CC5, - 0x1B80, 0x23411CC7, - 0x1B80, 0x100E1CD5, - 0x1B80, 0x100E1CD7, - 0x8000000c, 0x00000000, 0x40000000, 0x00000000, - 0x1B80, 0x60101CE5, - 0x1B80, 0x60101CE7, - 0x9000000f, 0x55555555, 0x40000000, 0x00000000, - 0x1B80, 0x60101CE5, - 0x1B80, 0x60101CE7, - 0x9000000f, 0x55ff5555, 0x40000000, 0x00000000, - 0x1B80, 0x60101CE5, - 0x1B80, 0x60101CE7, - 0x9000000f, 0xaaaaaaaa, 0x40000000, 0x00000000, - 0x1B80, 0x60101CE5, - 0x1B80, 0x60101CE7, - 0x9000000f, 0xaa00aaaa, 0x40000000, 0x00550000, - 0x1B80, 0x60101CE5, - 0x1B80, 0x60101CE7, - 0x90000004, 0x00000000, 0x40000000, 0x00000000, - 0x1B80, 0x60101CE5, - 0x1B80, 0x60101CE7, - 0xA0000000, 0x00000000, - 0x1B80, 0x60011CE5, - 0x1B80, 0x60011CE7, - 0xB0000000, 0x00000000, - 0x1B80, 0x23411CF5, - 0x1B80, 0x23411CF7, - 0x8000000c, 0x00000000, 0x40000000, 0x00000000, - 0x1B80, 0x60811D05, - 0x1B80, 0x60811D07, - 0x9000000f, 0x55555555, 0x40000000, 0x00000000, - 0x1B80, 0x60811D05, - 0x1B80, 0x60811D07, - 0x9000000f, 0x55ff5555, 0x40000000, 0x00000000, - 0x1B80, 0x60811D05, - 0x1B80, 0x60811D07, - 0x9000000f, 0xaaaaaaaa, 0x40000000, 0x00000000, - 0x1B80, 0x60811D05, - 0x1B80, 0x60811D07, - 0x9000000f, 0xaa00aaaa, 0x40000000, 0x00550000, - 0x1B80, 0x60811D05, - 0x1B80, 0x60811D07, - 0x90000004, 0x00000000, 0x40000000, 0x00000000, - 0x1B80, 0x60811D05, - 0x1B80, 0x60811D07, - 0xA0000000, 0x00000000, - 0x1B80, 0x60611D05, - 0x1B80, 0x60611D07, - 0xB0000000, 0x00000000, - 0x1B80, 0x23411D15, - 0x1B80, 0x23411D17, - 0x1B80, 0x70E11D25, - 0x1B80, 0x70E11D27, - 0x1B80, 0x4D001D35, - 0x1B80, 0x4D001D37, - 0x1B80, 0x00011D45, - 0x1B80, 0x00011D47, - 0x1B80, 0x00041D55, - 0x1B80, 0x00041D57, - 0x1B80, 0x6B401D65, - 0x1B80, 0x6B401D67, - 0x1B80, 0x4D041D75, - 0x1B80, 0x4D041D77, - 0x1B80, 0x68481D85, - 0x1B80, 0x68481D87, - 0x1B80, 0x66061D95, - 0x1B80, 0x66061D97, - 0x8000000c, 0x00000000, 0x40000000, 0x00000000, - 0x1B80, 0x65081DA5, - 0x1B80, 0x65081DA7, - 0x9000000f, 0x55555555, 0x40000000, 0x00000000, - 0x1B80, 0x65181DA5, - 0x1B80, 0x65181DA7, - 0x9000000f, 0x55ff5555, 0x40000000, 0x00000000, - 0x1B80, 0x65181DA5, - 0x1B80, 0x65181DA7, - 0x9000000f, 0xaaaaaaaa, 0x40000000, 0x00000000, - 0x1B80, 0x65181DA5, - 0x1B80, 0x65181DA7, - 0x9000000f, 0xaa00aaaa, 0x40000000, 0x00550000, - 0x1B80, 0x65181DA5, - 0x1B80, 0x65181DA7, - 0x90000004, 0x00000000, 0x40000000, 0x00000000, - 0x1B80, 0x65081DA5, - 0x1B80, 0x65081DA7, - 0xA0000000, 0x00000000, - 0x1B80, 0x65081DA5, - 0x1B80, 0x65081DA7, - 0xB0000000, 0x00000000, - 0x1B80, 0x64471DB5, - 0x1B80, 0x64471DB7, - 0x1B80, 0x23411DC5, - 0x1B80, 0x23411DC7, - 0x8000000c, 0x00000000, 0x40000000, 0x00000000, - 0x1B80, 0x11E41DD5, - 0x1B80, 0x11E41DD7, - 0x9000000f, 0x55555555, 0x40000000, 0x00000000, - 0x1B80, 0x11E81DD5, - 0x1B80, 0x11E81DD7, - 0x9000000f, 0x55ff5555, 0x40000000, 0x00000000, - 0x1B80, 0x11E81DD5, - 0x1B80, 0x11E81DD7, - 0x9000000f, 0xaaaaaaaa, 0x40000000, 0x00000000, - 0x1B80, 0x11E81DD5, - 0x1B80, 0x11E81DD7, - 0x9000000f, 0xaa00aaaa, 0x40000000, 0x00550000, - 0x1B80, 0x11E81DD5, - 0x1B80, 0x11E81DD7, - 0x90000004, 0x00000000, 0x40000000, 0x00000000, - 0x1B80, 0x11E41DD5, - 0x1B80, 0x11E41DD7, - 0xA0000000, 0x00000000, - 0x1B80, 0x11E41DD5, - 0x1B80, 0x11E41DD7, - 0xB0000000, 0x00000000, - 0x1B80, 0x60011DE5, - 0x1B80, 0x60011DE7, - 0x1B80, 0x23411DF5, - 0x1B80, 0x23411DF7, - 0x8000000c, 0x00000000, 0x40000000, 0x00000000, - 0x1B80, 0x60E11E05, - 0x1B80, 0x60E11E07, - 0x9000000f, 0x55555555, 0x40000000, 0x00000000, - 0x1B80, 0x61E11E05, - 0x1B80, 0x61E11E07, - 0x9000000f, 0x55ff5555, 0x40000000, 0x00000000, - 0x1B80, 0x61E11E05, - 0x1B80, 0x61E11E07, - 0x9000000f, 0xaaaaaaaa, 0x40000000, 0x00000000, - 0x1B80, 0x61E11E05, - 0x1B80, 0x61E11E07, - 0x9000000f, 0xaa00aaaa, 0x40000000, 0x00550000, - 0x1B80, 0x61E11E05, - 0x1B80, 0x61E11E07, - 0x90000004, 0x00000000, 0x40000000, 0x00000000, - 0x1B80, 0x60E11E05, - 0x1B80, 0x60E11E07, - 0xA0000000, 0x00000000, - 0x1B80, 0x60E11E05, - 0x1B80, 0x60E11E07, - 0xB0000000, 0x00000000, - 0x1B80, 0x23411E15, - 0x1B80, 0x23411E17, - 0x1B80, 0x70611E25, - 0x1B80, 0x70611E27, - 0x1B80, 0x4D001E35, - 0x1B80, 0x4D001E37, - 0x1B80, 0x00011E45, - 0x1B80, 0x00011E47, - 0x1B80, 0x00001E55, - 0x1B80, 0x00001E57, - 0x1B80, 0x00001E65, - 0x1B80, 0x00001E67, - 0x1B80, 0x00001E75, - 0x1B80, 0x00001E77, - 0x1B80, 0x00001E85, - 0x1B80, 0x00001E87, - 0x1B80, 0x00001E95, - 0x1B80, 0x00001E97, - 0x1B80, 0x00001EA5, - 0x1B80, 0x00001EA7, - 0x1B80, 0x00001EB5, - 0x1B80, 0x00001EB7, - 0x1B80, 0x00001EC5, - 0x1B80, 0x00001EC7, - 0x1B80, 0x00001ED5, - 0x1B80, 0x00001ED7, - 0x1B80, 0x00001EE5, - 0x1B80, 0x00001EE7, - 0x1B80, 0x00001EF5, - 0x1B80, 0x00001EF7, - 0x1B80, 0x00001F05, - 0x1B80, 0x00001F07, - 0x1B80, 0x00001F15, - 0x1B80, 0x00001F17, - 0x1B80, 0x00001F25, - 0x1B80, 0x00001F27, - 0x1B80, 0x00001F35, - 0x1B80, 0x00001F37, - 0x1B80, 0x00001F45, - 0x1B80, 0x00001F47, - 0x1B80, 0x00001F55, - 0x1B80, 0x00001F57, - 0x1B80, 0x00001F65, - 0x1B80, 0x00001F67, - 0x1B80, 0x00001F75, - 0x1B80, 0x00001F77, - 0x1B80, 0x00001F85, - 0x1B80, 0x00001F87, - 0x1B80, 0x00001F95, - 0x1B80, 0x00001F97, - 0x1B80, 0x00001FA5, - 0x1B80, 0x00001FA7, - 0x1B80, 0x00001FB5, - 0x1B80, 0x00001FB7, - 0x1B80, 0x00001FC5, - 0x1B80, 0x00001FC7, - 0x1B80, 0x00001FD5, - 0x1B80, 0x00001FD7, - 0x1B80, 0x00001FE5, - 0x1B80, 0x00001FE7, - 0x1B80, 0x00001FF5, - 0x1B80, 0x00001FF7, - 0x1B80, 0x00000006, - 0x1B80, 0x00000002, - -}; - -void -odm_read_and_config_mp_8814a_phy_reg( - struct dm_struct* pDM_Odm -) -{ - u32 i = 0; - u1Byte cCond; - BOOLEAN bMatched = TRUE, bSkipped = FALSE; - u32 ArrayLen = sizeof(Array_MP_8814A_PHY_REG)/sizeof(u32); - u32* Array = Array_MP_8814A_PHY_REG; - - u32 v1 = 0, v2 = 0, pre_v1 = 0, pre_v2 = 0; - - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_8814A_PHY_REG\n"); - - while ((i + 1) < ArrayLen) { - v1 = Array[i]; - v2 = Array[i + 1]; - - if (v1 & (BIT31 | BIT30)) {/*positive & negative condition*/ - if (v1 & BIT31) {/* positive condition*/ - cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28); - if (cCond == COND_ENDIF) {/*end*/ - bMatched = TRUE; - bSkipped = FALSE; - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "ENDIF\n"); - } else if (cCond == COND_ELSE) { /*else*/ - bMatched = bSkipped?FALSE:TRUE; - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "ELSE\n"); - } else {/*if , else if*/ - pre_v1 = v1; - pre_v2 = v2; - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "IF or ELSE IF\n"); - } - } else if (v1 & BIT30) { /*negative condition*/ - if (bSkipped == FALSE) { - if (CheckPositive(pDM_Odm, pre_v1, pre_v2, v1, v2)) { - bMatched = TRUE; - bSkipped = TRUE; - } else { - bMatched = FALSE; - bSkipped = FALSE; - } - } else - bMatched = FALSE; - } - } else { - if (bMatched) - odm_ConfigBB_PHY_8814A(pDM_Odm, v1, bMaskDWord, v2); - } - i = i + 2; - } -} - -u32 -ODM_GetVersion_MP_8814A_PHY_REG(void) -{ - return 85; -} - -/****************************************************************************** -* PHY_REG_MP.TXT -******************************************************************************/ - -u32 Array_MP_8814A_PHY_REG_MP[] = { - 0x8FC, 0x00000000, - 0x838, 0x86667641, - -}; - -void -odm_read_and_config_mp_8814a_phy_reg_mp( - struct dm_struct* pDM_Odm -) -{ - u32 i = 0; - u1Byte cCond; - BOOLEAN bMatched = TRUE, bSkipped = FALSE; - u32 ArrayLen = sizeof(Array_MP_8814A_PHY_REG_MP)/sizeof(u32); - u32* Array = Array_MP_8814A_PHY_REG_MP; - - u32 v1 = 0, v2 = 0, pre_v1 = 0, pre_v2 = 0; - - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_8814A_PHY_REG_MP\n"); - - while ((i + 1) < ArrayLen) { - v1 = Array[i]; - v2 = Array[i + 1]; - - if (v1 & (BIT31 | BIT30)) {/*positive & negative condition*/ - if (v1 & BIT31) {/* positive condition*/ - cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28); - if (cCond == COND_ENDIF) {/*end*/ - bMatched = TRUE; - bSkipped = FALSE; - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "ENDIF\n"); - } else if (cCond == COND_ELSE) { /*else*/ - bMatched = bSkipped?FALSE:TRUE; - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "ELSE\n"); - } else {/*if , else if*/ - pre_v1 = v1; - pre_v2 = v2; - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "IF or ELSE IF\n"); - } - } else if (v1 & BIT30) { /*negative condition*/ - if (bSkipped == FALSE) { - if (CheckPositive(pDM_Odm, pre_v1, pre_v2, v1, v2)) { - bMatched = TRUE; - bSkipped = TRUE; - } else { - bMatched = FALSE; - bSkipped = FALSE; - } - } else - bMatched = FALSE; - } - } else { - if (bMatched) - odm_ConfigBB_PHY_8814A(pDM_Odm, v1, bMaskDWord, v2); - } - i = i + 2; - } -} - -u32 -ODM_GetVersion_MP_8814A_PHY_REG_MP(void) -{ - return 85; -} - -/****************************************************************************** -* PHY_REG_PG.TXT -******************************************************************************/ - -u32 Array_MP_8814A_PHY_REG_PG[] = { - 0, 0, 0, 0x00000c20, 0xffffffff, 0x34363840, - 0, 0, 0, 0x00000c24, 0xffffffff, 0x42424444, - 0, 0, 0, 0x00000c28, 0xffffffff, 0x30323638, - 0, 0, 0, 0x00000c2c, 0xffffffff, 0x40424444, - 0, 0, 0, 0x00000c30, 0xffffffff, 0x28303236, - 0, 0, 1, 0x00000c34, 0xffffffff, 0x38404242, - 0, 0, 1, 0x00000c38, 0xffffffff, 0x26283034, - 0, 0, 2, 0x00000cd8, 0xffffffff, 0x36384040, - 0, 0, 2, 0x00000cdc, 0xffffffff, 0x24262832, - 0, 0, 0, 0x00000c3c, 0xffffffff, 0x40424444, - 0, 0, 0, 0x00000c40, 0xffffffff, 0x28303236, - 0, 0, 0, 0x00000c44, 0xffffffff, 0x42422426, - 0, 0, 1, 0x00000c48, 0xffffffff, 0x30343840, - 0, 0, 1, 0x00000c4c, 0xffffffff, 0x22242628, - 0, 0, 2, 0x00000ce0, 0xffffffff, 0x36384040, - 0, 0, 2, 0x00000ce4, 0xffffffff, 0x24262832, - 0, 0, 2, 0x00000ce8, 0x0000ffff, 0x20202022, - 0, 1, 0, 0x00000e20, 0xffffffff, 0x34363840, - 0, 1, 0, 0x00000e24, 0xffffffff, 0x42424444, - 0, 1, 0, 0x00000e28, 0xffffffff, 0x30323638, - 0, 1, 0, 0x00000e2c, 0xffffffff, 0x40424444, - 0, 1, 0, 0x00000e30, 0xffffffff, 0x28303236, - 0, 1, 1, 0x00000e34, 0xffffffff, 0x38404242, - 0, 1, 1, 0x00000e38, 0xffffffff, 0x26283034, - 0, 1, 2, 0x00000ed8, 0xffffffff, 0x36384040, - 0, 1, 2, 0x00000edc, 0xffffffff, 0x24262832, - 0, 1, 0, 0x00000e3c, 0xffffffff, 0x40424444, - 0, 1, 0, 0x00000e40, 0xffffffff, 0x28303236, - 0, 1, 0, 0x00000e44, 0xffffffff, 0x42422426, - 0, 1, 1, 0x00000e48, 0xffffffff, 0x30343840, - 0, 1, 1, 0x00000e4c, 0xffffffff, 0x22242628, - 0, 1, 2, 0x00000ee0, 0xffffffff, 0x36384040, - 0, 1, 2, 0x00000ee4, 0xffffffff, 0x24262832, - 0, 1, 2, 0x00000ee8, 0x0000ffff, 0x20202022, - 0, 2, 0, 0x00001820, 0xffffffff, 0x34363840, - 0, 2, 0, 0x00001824, 0xffffffff, 0x42424444, - 0, 2, 0, 0x00001828, 0xffffffff, 0x30323638, - 0, 2, 0, 0x0000182c, 0xffffffff, 0x40424444, - 0, 2, 0, 0x00001830, 0xffffffff, 0x28303236, - 0, 2, 1, 0x00001834, 0xffffffff, 0x38404242, - 0, 2, 1, 0x00001838, 0xffffffff, 0x26283034, - 0, 2, 2, 0x000018d8, 0xffffffff, 0x36384040, - 0, 2, 2, 0x000018dc, 0xffffffff, 0x24262832, - 0, 2, 0, 0x0000183c, 0xffffffff, 0x40424444, - 0, 2, 0, 0x00001840, 0xffffffff, 0x28303236, - 0, 2, 0, 0x00001844, 0xffffffff, 0x42422426, - 0, 2, 1, 0x00001848, 0xffffffff, 0x30343840, - 0, 2, 1, 0x0000184c, 0xffffffff, 0x22242628, - 0, 2, 2, 0x000018e0, 0xffffffff, 0x36384040, - 0, 2, 2, 0x000018e4, 0xffffffff, 0x24262832, - 0, 2, 2, 0x000018e8, 0x0000ffff, 0x20202022, - 0, 3, 0, 0x00001a20, 0xffffffff, 0x34363840, - 0, 3, 0, 0x00001a24, 0xffffffff, 0x42424444, - 0, 3, 0, 0x00001a28, 0xffffffff, 0x30323638, - 0, 3, 0, 0x00001a2c, 0xffffffff, 0x40424444, - 0, 3, 0, 0x00001a30, 0xffffffff, 0x28303236, - 0, 3, 1, 0x00001a34, 0xffffffff, 0x38404242, - 0, 3, 1, 0x00001a38, 0xffffffff, 0x26283034, - 0, 3, 2, 0x00001ad8, 0xffffffff, 0x36384040, - 0, 3, 2, 0x00001adc, 0xffffffff, 0x24262832, - 0, 3, 0, 0x00001a3c, 0xffffffff, 0x40424444, - 0, 3, 0, 0x00001a40, 0xffffffff, 0x28303236, - 0, 3, 0, 0x00001a44, 0xffffffff, 0x42422426, - 0, 3, 1, 0x00001a48, 0xffffffff, 0x30343840, - 0, 3, 1, 0x00001a4c, 0xffffffff, 0x22242628, - 0, 3, 2, 0x00001ae0, 0xffffffff, 0x36384040, - 0, 3, 2, 0x00001ae4, 0xffffffff, 0x24262832, - 0, 3, 2, 0x00001ae8, 0x0000ffff, 0x20202022, - 1, 0, 0, 0x00000c24, 0xffffffff, 0x42424444, - 1, 0, 0, 0x00000c28, 0xffffffff, 0x30323640, - 1, 0, 0, 0x00000c2c, 0xffffffff, 0x40424444, - 1, 0, 0, 0x00000c30, 0xffffffff, 0x28303236, - 1, 0, 1, 0x00000c34, 0xffffffff, 0x38404242, - 1, 0, 1, 0x00000c38, 0xffffffff, 0x26283034, - 1, 0, 2, 0x00000cd8, 0xffffffff, 0x36384040, - 1, 0, 2, 0x00000cdc, 0xffffffff, 0x24262832, - 1, 0, 0, 0x00000c3c, 0xffffffff, 0x40424444, - 1, 0, 0, 0x00000c40, 0xffffffff, 0x28303236, - 1, 0, 0, 0x00000c44, 0xffffffff, 0x42422426, - 1, 0, 1, 0x00000c48, 0xffffffff, 0x30343840, - 1, 0, 1, 0x00000c4c, 0xffffffff, 0x22242628, - 1, 0, 2, 0x00000ce0, 0xffffffff, 0x36384040, - 1, 0, 2, 0x00000ce4, 0xffffffff, 0x24262832, - 1, 0, 2, 0x00000ce8, 0x0000ffff, 0x20202022, - 1, 1, 0, 0x00000e24, 0xffffffff, 0x42424444, - 1, 1, 0, 0x00000e28, 0xffffffff, 0x30323640, - 1, 1, 0, 0x00000e2c, 0xffffffff, 0x40424444, - 1, 1, 0, 0x00000e30, 0xffffffff, 0x28303236, - 1, 1, 1, 0x00000e34, 0xffffffff, 0x38404242, - 1, 1, 1, 0x00000e38, 0xffffffff, 0x26283034, - 1, 1, 2, 0x00000ed8, 0xffffffff, 0x36384040, - 1, 1, 2, 0x00000edc, 0xffffffff, 0x24262832, - 1, 1, 0, 0x00000e3c, 0xffffffff, 0x40424444, - 1, 1, 0, 0x00000e40, 0xffffffff, 0x28303236, - 1, 1, 0, 0x00000e44, 0xffffffff, 0x42422426, - 1, 1, 1, 0x00000e48, 0xffffffff, 0x30343840, - 1, 1, 1, 0x00000e4c, 0xffffffff, 0x22242628, - 1, 1, 2, 0x00000ee0, 0xffffffff, 0x36384040, - 1, 1, 2, 0x00000ee4, 0xffffffff, 0x24262832, - 1, 1, 2, 0x00000ee8, 0x0000ffff, 0x20202022, - 1, 2, 0, 0x00001824, 0xffffffff, 0x42424444, - 1, 2, 0, 0x00001828, 0xffffffff, 0x30323640, - 1, 2, 0, 0x0000182c, 0xffffffff, 0x40424444, - 1, 2, 0, 0x00001830, 0xffffffff, 0x28303236, - 1, 2, 1, 0x00001834, 0xffffffff, 0x38404242, - 1, 2, 1, 0x00001838, 0xffffffff, 0x26283034, - 1, 2, 2, 0x000018d8, 0xffffffff, 0x36384040, - 1, 2, 2, 0x000018dc, 0xffffffff, 0x24262832, - 1, 2, 0, 0x0000183c, 0xffffffff, 0x40424444, - 1, 2, 0, 0x00001840, 0xffffffff, 0x28303236, - 1, 2, 0, 0x00001844, 0xffffffff, 0x42422426, - 1, 2, 1, 0x00001848, 0xffffffff, 0x30343840, - 1, 2, 1, 0x0000184c, 0xffffffff, 0x22242628, - 1, 2, 2, 0x000018e0, 0xffffffff, 0x36384040, - 1, 2, 2, 0x000018e4, 0xffffffff, 0x24262832, - 1, 2, 2, 0x000018e8, 0x0000ffff, 0x20202022, - 1, 3, 0, 0x00001a24, 0xffffffff, 0x42424444, - 1, 3, 0, 0x00001a28, 0xffffffff, 0x30323640, - 1, 3, 0, 0x00001a2c, 0xffffffff, 0x40424444, - 1, 3, 0, 0x00001a30, 0xffffffff, 0x28303236, - 1, 3, 1, 0x00001a34, 0xffffffff, 0x38404242, - 1, 3, 1, 0x00001a38, 0xffffffff, 0x26283034, - 1, 3, 2, 0x00001ad8, 0xffffffff, 0x36384040, - 1, 3, 2, 0x00001adc, 0xffffffff, 0x24262832, - 1, 3, 0, 0x00001a3c, 0xffffffff, 0x40424444, - 1, 3, 0, 0x00001a40, 0xffffffff, 0x28303236, - 1, 3, 0, 0x00001a44, 0xffffffff, 0x42422426, - 1, 3, 1, 0x00001a48, 0xffffffff, 0x30343840, - 1, 3, 1, 0x00001a4c, 0xffffffff, 0x22242628, - 1, 3, 2, 0x00001ae0, 0xffffffff, 0x36384040, - 1, 3, 2, 0x00001ae4, 0xffffffff, 0x24262832, - 1, 3, 2, 0x00001ae8, 0x0000ffff, 0x20202022 -}; - -void -odm_read_and_config_mp_8814a_phy_reg_pg( - struct dm_struct* pDM_Odm -) -{ - u32 i = 0; - u32 ArrayLen = sizeof(Array_MP_8814A_PHY_REG_PG)/sizeof(u32); - u32* Array = Array_MP_8814A_PHY_REG_PG; - -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - PADAPTER Adapter = pDM_Odm->Adapter; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - PlatformZeroMemory(pHalData->BufOfLinesPwrByRate, MAX_LINES_HWCONFIG_TXT*MAX_BYTES_LINE_HWCONFIG_TXT); - pHalData->nLinesReadPwrByRate = ArrayLen/6; -#endif - - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_8814A_PHY_REG_PG\n"); - - pDM_Odm->phy_reg_pg_version = 1; - pDM_Odm->phy_reg_pg_value_type = PHY_REG_PG_EXACT_VALUE; - - for (i = 0; i < ArrayLen; i += 6) { - u32 v1 = Array[i]; - u32 v2 = Array[i+1]; - u32 v3 = Array[i+2]; - u32 v4 = Array[i+3]; - u32 v5 = Array[i+4]; - u32 v6 = Array[i+5]; - - odm_ConfigBB_PHY_REG_PG_8814A(pDM_Odm, v1, v2, v3, v4, v5, v6); - -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - rsprintf((char *)pHalData->BufOfLinesPwrByRate[i/6], 100, "%s, %s, %s, 0x%X, 0x%08X, 0x%08X,", - (v1 == 0?"2.4G":" 5G"), (v2 == 0?"A":"B"), (v3 == 0?"1Tx":"2Tx"), v4, v5, v6); -#endif - } -} - - - -/****************************************************************************** -* PHY_REG_PG_Type2.TXT -******************************************************************************\ - -u32 Array_MP_8814A_PHY_REG_PG_Type2[] = { - 0, 0, 0, 0x00000c20, 0xffffffff, 0x36363636, - 0, 0, 0, 0x00000c24, 0xffffffff, 0x36363636, - 0, 0, 0, 0x00000c28, 0xffffffff, 0x30323436, - 0, 0, 0, 0x00000c2c, 0xffffffff, 0x36363636, - 0, 0, 0, 0x00000c30, 0xffffffff, 0x28303234, - 0, 0, 1, 0x00000c34, 0xffffffff, 0x34343434, - 0, 0, 1, 0x00000c38, 0xffffffff, 0x26283032, - 0, 0, 2, 0x00000cd8, 0xffffffff, 0x32323232, - 0, 0, 2, 0x00000cdc, 0xffffffff, 0x24262830, - 0, 0, 0, 0x00000c3c, 0xffffffff, 0x36363636, - 0, 0, 0, 0x00000c40, 0xffffffff, 0x28303234, - 0, 0, 0, 0x00000c44, 0xffffffff, 0x34342426, - 0, 0, 1, 0x00000c48, 0xffffffff, 0x30323434, - 0, 0, 1, 0x00000c4c, 0xffffffff, 0x22242628, - 0, 0, 2, 0x00000ce0, 0xffffffff, 0x32323232, - 0, 0, 2, 0x00000ce4, 0xffffffff, 0x24262830, - 0, 0, 2, 0x00000ce8, 0x0000ffff, 0x20202022, - 0, 1, 0, 0x00000e20, 0xffffffff, 0x36363636, - 0, 1, 0, 0x00000e24, 0xffffffff, 0x36363636, - 0, 1, 0, 0x00000e28, 0xffffffff, 0x30323436, - 0, 1, 0, 0x00000e2c, 0xffffffff, 0x36363636, - 0, 1, 0, 0x00000e30, 0xffffffff, 0x28303234, - 0, 1, 1, 0x00000e34, 0xffffffff, 0x34343434, - 0, 1, 1, 0x00000e38, 0xffffffff, 0x26283032, - 0, 1, 2, 0x00000ed8, 0xffffffff, 0x32323232, - 0, 1, 2, 0x00000edc, 0xffffffff, 0x24262830, - 0, 1, 0, 0x00000e3c, 0xffffffff, 0x36363636, - 0, 1, 0, 0x00000e40, 0xffffffff, 0x28303234, - 0, 1, 0, 0x00000e44, 0xffffffff, 0x34342426, - 0, 1, 1, 0x00000e48, 0xffffffff, 0x30323434, - 0, 1, 1, 0x00000e4c, 0xffffffff, 0x22242628, - 0, 1, 2, 0x00000ee0, 0xffffffff, 0x32323232, - 0, 1, 2, 0x00000ee4, 0xffffffff, 0x24262830, - 0, 1, 2, 0x00000ee8, 0x0000ffff, 0x20202022, - 0, 2, 0, 0x00001820, 0xffffffff, 0x36363636, - 0, 2, 0, 0x00001824, 0xffffffff, 0x36363636, - 0, 2, 0, 0x00001828, 0xffffffff, 0x30323436, - 0, 2, 0, 0x0000182c, 0xffffffff, 0x36363636, - 0, 2, 0, 0x00001830, 0xffffffff, 0x28303234, - 0, 2, 1, 0x00001834, 0xffffffff, 0x34343434, - 0, 2, 1, 0x00001838, 0xffffffff, 0x26283032, - 0, 2, 2, 0x000018d8, 0xffffffff, 0x32323232, - 0, 2, 2, 0x000018dc, 0xffffffff, 0x24262830, - 0, 2, 0, 0x0000183c, 0xffffffff, 0x36363636, - 0, 2, 0, 0x00001840, 0xffffffff, 0x28303234, - 0, 2, 0, 0x00001844, 0xffffffff, 0x34342426, - 0, 2, 1, 0x00001848, 0xffffffff, 0x30323434, - 0, 2, 1, 0x0000184c, 0xffffffff, 0x22242628, - 0, 2, 2, 0x000018e0, 0xffffffff, 0x32323232, - 0, 2, 2, 0x000018e4, 0xffffffff, 0x24262830, - 0, 2, 2, 0x000018e8, 0x0000ffff, 0x20202022, - 0, 3, 0, 0x00001a20, 0xffffffff, 0x36363636, - 0, 3, 0, 0x00001a24, 0xffffffff, 0x36363636, - 0, 3, 0, 0x00001a28, 0xffffffff, 0x30323436, - 0, 3, 0, 0x00001a2c, 0xffffffff, 0x36363636, - 0, 3, 0, 0x00001a30, 0xffffffff, 0x28303234, - 0, 3, 1, 0x00001a34, 0xffffffff, 0x34343434, - 0, 3, 1, 0x00001a38, 0xffffffff, 0x26283032, - 0, 3, 2, 0x00001ad8, 0xffffffff, 0x32323232, - 0, 3, 2, 0x00001adc, 0xffffffff, 0x24262830, - 0, 3, 0, 0x00001a3c, 0xffffffff, 0x36363636, - 0, 3, 0, 0x00001a40, 0xffffffff, 0x28303234, - 0, 3, 0, 0x00001a44, 0xffffffff, 0x34342426, - 0, 3, 1, 0x00001a48, 0xffffffff, 0x30323434, - 0, 3, 1, 0x00001a4c, 0xffffffff, 0x22242628, - 0, 3, 2, 0x00001ae0, 0xffffffff, 0x32323232, - 0, 3, 2, 0x00001ae4, 0xffffffff, 0x24262830, - 0, 3, 2, 0x00001ae8, 0x0000ffff, 0x20202022, - 1, 0, 0, 0x00000c24, 0xffffffff, 0x36363636, - 1, 0, 0, 0x00000c28, 0xffffffff, 0x30323436, - 1, 0, 0, 0x00000c2c, 0xffffffff, 0x36363636, - 1, 0, 0, 0x00000c30, 0xffffffff, 0x28303234, - 1, 0, 1, 0x00000c34, 0xffffffff, 0x34343434, - 1, 0, 1, 0x00000c38, 0xffffffff, 0x26283032, - 1, 0, 2, 0x00000cd8, 0xffffffff, 0x32323232, - 1, 0, 2, 0x00000cdc, 0xffffffff, 0x24262830, - 1, 0, 0, 0x00000c3c, 0xffffffff, 0x36363636, - 1, 0, 0, 0x00000c40, 0xffffffff, 0x28303234, - 1, 0, 0, 0x00000c44, 0xffffffff, 0x34342426, - 1, 0, 1, 0x00000c48, 0xffffffff, 0x30323434, - 1, 0, 1, 0x00000c4c, 0xffffffff, 0x22242628, - 1, 0, 2, 0x00000ce0, 0xffffffff, 0x32323232, - 1, 0, 2, 0x00000ce4, 0xffffffff, 0x24262830, - 1, 0, 2, 0x00000ce8, 0x0000ffff, 0x20202022, - 1, 1, 0, 0x00000e24, 0xffffffff, 0x36363636, - 1, 1, 0, 0x00000e28, 0xffffffff, 0x30323436, - 1, 1, 0, 0x00000e2c, 0xffffffff, 0x36363636, - 1, 1, 0, 0x00000e30, 0xffffffff, 0x28303234, - 1, 1, 1, 0x00000e34, 0xffffffff, 0x34343434, - 1, 1, 1, 0x00000e38, 0xffffffff, 0x26283032, - 1, 1, 2, 0x00000ed8, 0xffffffff, 0x32323232, - 1, 1, 2, 0x00000edc, 0xffffffff, 0x24262830, - 1, 1, 0, 0x00000e3c, 0xffffffff, 0x36363636, - 1, 1, 0, 0x00000e40, 0xffffffff, 0x28303234, - 1, 1, 0, 0x00000e44, 0xffffffff, 0x34342426, - 1, 1, 1, 0x00000e48, 0xffffffff, 0x30323434, - 1, 1, 1, 0x00000e4c, 0xffffffff, 0x22242628, - 1, 1, 2, 0x00000ee0, 0xffffffff, 0x32323232, - 1, 1, 2, 0x00000ee4, 0xffffffff, 0x24262830, - 1, 1, 2, 0x00000ee8, 0x0000ffff, 0x20202022, - 1, 2, 0, 0x00001824, 0xffffffff, 0x36363636, - 1, 2, 0, 0x00001828, 0xffffffff, 0x30323436, - 1, 2, 0, 0x0000182c, 0xffffffff, 0x36363636, - 1, 2, 0, 0x00001830, 0xffffffff, 0x28303234, - 1, 2, 1, 0x00001834, 0xffffffff, 0x34343434, - 1, 2, 1, 0x00001838, 0xffffffff, 0x26283032, - 1, 2, 2, 0x000018d8, 0xffffffff, 0x32323232, - 1, 2, 2, 0x000018dc, 0xffffffff, 0x24262830, - 1, 2, 0, 0x0000183c, 0xffffffff, 0x36363636, - 1, 2, 0, 0x00001840, 0xffffffff, 0x28303234, - 1, 2, 0, 0x00001844, 0xffffffff, 0x34342426, - 1, 2, 1, 0x00001848, 0xffffffff, 0x30323434, - 1, 2, 1, 0x0000184c, 0xffffffff, 0x22242628, - 1, 2, 2, 0x000018e0, 0xffffffff, 0x32323232, - 1, 2, 2, 0x000018e4, 0xffffffff, 0x24262830, - 1, 2, 2, 0x000018e8, 0x0000ffff, 0x20202022, - 1, 3, 0, 0x00001a24, 0xffffffff, 0x36363636, - 1, 3, 0, 0x00001a28, 0xffffffff, 0x30323436, - 1, 3, 0, 0x00001a2c, 0xffffffff, 0x36363636, - 1, 3, 0, 0x00001a30, 0xffffffff, 0x28303234, - 1, 3, 1, 0x00001a34, 0xffffffff, 0x34343434, - 1, 3, 1, 0x00001a38, 0xffffffff, 0x26283032, - 1, 3, 2, 0x00001ad8, 0xffffffff, 0x32323232, - 1, 3, 2, 0x00001adc, 0xffffffff, 0x24262830, - 1, 3, 0, 0x00001a3c, 0xffffffff, 0x36363636, - 1, 3, 0, 0x00001a40, 0xffffffff, 0x28303234, - 1, 3, 0, 0x00001a44, 0xffffffff, 0x34342426, - 1, 3, 1, 0x00001a48, 0xffffffff, 0x30323434, - 1, 3, 1, 0x00001a4c, 0xffffffff, 0x22242628, - 1, 3, 2, 0x00001ae0, 0xffffffff, 0x32323232, - 1, 3, 2, 0x00001ae4, 0xffffffff, 0x24262830, - 1, 3, 2, 0x00001ae8, 0x0000ffff, 0x20202022 -}; - -void -_odm_read_and_config_mp_8814a_phy_reg_pg_type2( - struct dm_struct* pDM_Odm -) -{ - u32 i = 0; - u32 ArrayLen = sizeof(Array_MP_8814A_PHY_REG_PG_Type2)/sizeof(u32); - u32* Array = Array_MP_8814A_PHY_REG_PG_Type2; - -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - PADAPTER Adapter = pDM_Odm->Adapter; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - PlatformZeroMemory(pHalData->BufOfLinesPwrByRate, MAX_LINES_HWCONFIG_TXT*MAX_BYTES_LINE_HWCONFIG_TXT); - pHalData->nLinesReadPwrByRate = ArrayLen/6; -#endif - - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_8814A_PHY_REG_PG_Type2\n"); - - pDM_Odm->phy_reg_pg_version = 1; - pDM_Odm->phy_reg_pg_value_type = PHY_REG_PG_EXACT_VALUE; - - for (i = 0; i < ArrayLen; i += 6) { - u32 v1 = Array[i]; - u32 v2 = Array[i+1]; - u32 v3 = Array[i+2]; - u32 v4 = Array[i+3]; - u32 v5 = Array[i+4]; - u32 v6 = Array[i+5]; - - odm_ConfigBB_PHY_REG_PG_8814A(pDM_Odm, v1, v2, v3, v4, v5, v6); - -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - rsprintf((char *)pHalData->BufOfLinesPwrByRate[i/6], 100, "%s, %s, %s, 0x%X, 0x%08X, 0x%08X,", - (v1 == 0?"2.4G":" 5G"), (v2 == 0?"A":"B"), (v3 == 0?"1Tx":"2Tx"), v4, v5, v6); -#endif - } -} - - -****************************************************************************** -* PHY_REG_PG_Type3.TXT -****************************************************************************** - -u32 Array_MP_8814A_PHY_REG_PG_Type3[] = { - 0, 0, 0, 0x00000c20, 0xffffffff, 0x48484848, - 0, 0, 0, 0x00000c24, 0xffffffff, 0x46464646, - 0, 0, 0, 0x00000c28, 0xffffffff, 0x44464646, - 0, 0, 0, 0x00000c2c, 0xffffffff, 0x46464646, - 0, 0, 0, 0x00000c30, 0xffffffff, 0x42444646, - 0, 0, 1, 0x00000c34, 0xffffffff, 0x44444444, - 0, 0, 1, 0x00000c38, 0xffffffff, 0x40424444, - 0, 0, 2, 0x00000cd8, 0xffffffff, 0x42424242, - 0, 0, 2, 0x00000cdc, 0xffffffff, 0x38404242, - 0, 0, 0, 0x00000c3c, 0xffffffff, 0x46464646, - 0, 0, 0, 0x00000c40, 0xffffffff, 0x42444646, - 0, 0, 0, 0x00000c44, 0xffffffff, 0x44444040, - 0, 0, 1, 0x00000c48, 0xffffffff, 0x44444444, - 0, 0, 1, 0x00000c4c, 0xffffffff, 0x38384042, - 0, 0, 2, 0x00000ce0, 0xffffffff, 0x42424242, - 0, 0, 2, 0x00000ce4, 0xffffffff, 0x38404242, - 0, 0, 2, 0x00000ce8, 0x0000ffff, 0x20203636, - 0, 1, 0, 0x00000e20, 0xffffffff, 0x48484848, - 0, 1, 0, 0x00000e24, 0xffffffff, 0x46464646, - 0, 1, 0, 0x00000e28, 0xffffffff, 0x44464646, - 0, 1, 0, 0x00000e2c, 0xffffffff, 0x46464646, - 0, 1, 0, 0x00000e30, 0xffffffff, 0x42444646, - 0, 1, 1, 0x00000e34, 0xffffffff, 0x44444444, - 0, 1, 1, 0x00000e38, 0xffffffff, 0x40424444, - 0, 1, 2, 0x00000ed8, 0xffffffff, 0x42424242, - 0, 1, 2, 0x00000edc, 0xffffffff, 0x38404242, - 0, 1, 0, 0x00000e3c, 0xffffffff, 0x46464646, - 0, 1, 0, 0x00000e40, 0xffffffff, 0x42444646, - 0, 1, 0, 0x00000e44, 0xffffffff, 0x44444040, - 0, 1, 1, 0x00000e48, 0xffffffff, 0x44444444, - 0, 1, 1, 0x00000e4c, 0xffffffff, 0x38384042, - 0, 1, 2, 0x00000ee0, 0xffffffff, 0x42424242, - 0, 1, 2, 0x00000ee4, 0xffffffff, 0x38404242, - 0, 1, 2, 0x00000ee8, 0x0000ffff, 0x20203636, - 0, 2, 0, 0x00001820, 0xffffffff, 0x48484848, - 0, 2, 0, 0x00001824, 0xffffffff, 0x46464646, - 0, 2, 0, 0x00001828, 0xffffffff, 0x44464646, - 0, 2, 0, 0x0000182c, 0xffffffff, 0x46464646, - 0, 2, 0, 0x00001830, 0xffffffff, 0x42444646, - 0, 2, 1, 0x00001834, 0xffffffff, 0x44444444, - 0, 2, 1, 0x00001838, 0xffffffff, 0x40424444, - 0, 2, 2, 0x000018d8, 0xffffffff, 0x42424242, - 0, 2, 2, 0x000018dc, 0xffffffff, 0x38404242, - 0, 2, 0, 0x0000183c, 0xffffffff, 0x46464646, - 0, 2, 0, 0x00001840, 0xffffffff, 0x42444646, - 0, 2, 0, 0x00001844, 0xffffffff, 0x44444040, - 0, 2, 1, 0x00001848, 0xffffffff, 0x44444444, - 0, 2, 1, 0x0000184c, 0xffffffff, 0x38384042, - 0, 2, 2, 0x000018e0, 0xffffffff, 0x42424242, - 0, 2, 2, 0x000018e4, 0xffffffff, 0x38404242, - 0, 2, 2, 0x000018e8, 0x0000ffff, 0x20203636, - 0, 3, 0, 0x00001a20, 0xffffffff, 0x48484848, - 0, 3, 0, 0x00001a24, 0xffffffff, 0x46464646, - 0, 3, 0, 0x00001a28, 0xffffffff, 0x44464646, - 0, 3, 0, 0x00001a2c, 0xffffffff, 0x46464646, - 0, 3, 0, 0x00001a30, 0xffffffff, 0x42444646, - 0, 3, 1, 0x00001a34, 0xffffffff, 0x44444444, - 0, 3, 1, 0x00001a38, 0xffffffff, 0x40424444, - 0, 3, 2, 0x00001ad8, 0xffffffff, 0x42424242, - 0, 3, 2, 0x00001adc, 0xffffffff, 0x38404242, - 0, 3, 0, 0x00001a3c, 0xffffffff, 0x46464646, - 0, 3, 0, 0x00001a40, 0xffffffff, 0x42444646, - 0, 3, 0, 0x00001a44, 0xffffffff, 0x44444040, - 0, 3, 1, 0x00001a48, 0xffffffff, 0x44444444, - 0, 3, 1, 0x00001a4c, 0xffffffff, 0x38384042, - 0, 3, 2, 0x00001ae0, 0xffffffff, 0x42424242, - 0, 3, 2, 0x00001ae4, 0xffffffff, 0x38404242, - 0, 3, 2, 0x00001ae8, 0x0000ffff, 0x20203636, - 1, 0, 0, 0x00000c24, 0xffffffff, 0x46464646, - 1, 0, 0, 0x00000c28, 0xffffffff, 0x44464646, - 1, 0, 0, 0x00000c2c, 0xffffffff, 0x46464646, - 1, 0, 0, 0x00000c30, 0xffffffff, 0x42444646, - 1, 0, 1, 0x00000c34, 0xffffffff, 0x44444444, - 1, 0, 1, 0x00000c38, 0xffffffff, 0x40424444, - 1, 0, 2, 0x00000cd8, 0xffffffff, 0x42424242, - 1, 0, 2, 0x00000cdc, 0xffffffff, 0x38404242, - 1, 0, 0, 0x00000c3c, 0xffffffff, 0x46464646, - 1, 0, 0, 0x00000c40, 0xffffffff, 0x42444646, - 1, 0, 0, 0x00000c44, 0xffffffff, 0x44443840, - 1, 0, 1, 0x00000c48, 0xffffffff, 0x44444444, - 1, 0, 1, 0x00000c4c, 0xffffffff, 0x36384042, - 1, 0, 2, 0x00000ce0, 0xffffffff, 0x42424242, - 1, 0, 2, 0x00000ce4, 0xffffffff, 0x38404242, - 1, 0, 2, 0x00000ce8, 0x0000ffff, 0x20203436, - 1, 1, 0, 0x00000e24, 0xffffffff, 0x46464646, - 1, 1, 0, 0x00000e28, 0xffffffff, 0x44464646, - 1, 1, 0, 0x00000e2c, 0xffffffff, 0x46464646, - 1, 1, 0, 0x00000e30, 0xffffffff, 0x42444646, - 1, 1, 1, 0x00000e34, 0xffffffff, 0x44444444, - 1, 1, 1, 0x00000e38, 0xffffffff, 0x40424444, - 1, 1, 2, 0x00000ed8, 0xffffffff, 0x42424242, - 1, 1, 2, 0x00000edc, 0xffffffff, 0x38404242, - 1, 1, 0, 0x00000e3c, 0xffffffff, 0x46464646, - 1, 1, 0, 0x00000e40, 0xffffffff, 0x42444646, - 1, 1, 0, 0x00000e44, 0xffffffff, 0x44443840, - 1, 1, 1, 0x00000e48, 0xffffffff, 0x44444444, - 1, 1, 1, 0x00000e4c, 0xffffffff, 0x36384042, - 1, 1, 2, 0x00000ee0, 0xffffffff, 0x42424242, - 1, 1, 2, 0x00000ee4, 0xffffffff, 0x38404242, - 1, 1, 2, 0x00000ee8, 0x0000ffff, 0x20203436, - 1, 2, 0, 0x00001824, 0xffffffff, 0x46464646, - 1, 2, 0, 0x00001828, 0xffffffff, 0x44464646, - 1, 2, 0, 0x0000182c, 0xffffffff, 0x46464646, - 1, 2, 0, 0x00001830, 0xffffffff, 0x42444646, - 1, 2, 1, 0x00001834, 0xffffffff, 0x44444444, - 1, 2, 1, 0x00001838, 0xffffffff, 0x40424444, - 1, 2, 2, 0x000018d8, 0xffffffff, 0x42424242, - 1, 2, 2, 0x000018dc, 0xffffffff, 0x38404242, - 1, 2, 0, 0x0000183c, 0xffffffff, 0x46464646, - 1, 2, 0, 0x00001840, 0xffffffff, 0x42444646, - 1, 2, 0, 0x00001844, 0xffffffff, 0x44443840, - 1, 2, 1, 0x00001848, 0xffffffff, 0x44444444, - 1, 2, 1, 0x0000184c, 0xffffffff, 0x36384042, - 1, 2, 2, 0x000018e0, 0xffffffff, 0x42424242, - 1, 2, 2, 0x000018e4, 0xffffffff, 0x38404242, - 1, 2, 2, 0x000018e8, 0x0000ffff, 0x20203436, - 1, 3, 0, 0x00001a24, 0xffffffff, 0x46464646, - 1, 3, 0, 0x00001a28, 0xffffffff, 0x44464646, - 1, 3, 0, 0x00001a2c, 0xffffffff, 0x46464646, - 1, 3, 0, 0x00001a30, 0xffffffff, 0x42444646, - 1, 3, 1, 0x00001a34, 0xffffffff, 0x44444444, - 1, 3, 1, 0x00001a38, 0xffffffff, 0x40424444, - 1, 3, 2, 0x00001ad8, 0xffffffff, 0x42424242, - 1, 3, 2, 0x00001adc, 0xffffffff, 0x38404242, - 1, 3, 0, 0x00001a3c, 0xffffffff, 0x46464646, - 1, 3, 0, 0x00001a40, 0xffffffff, 0x42444646, - 1, 3, 0, 0x00001a44, 0xffffffff, 0x44443840, - 1, 3, 1, 0x00001a48, 0xffffffff, 0x44444444, - 1, 3, 1, 0x00001a4c, 0xffffffff, 0x36384042, - 1, 3, 2, 0x00001ae0, 0xffffffff, 0x42424242, - 1, 3, 2, 0x00001ae4, 0xffffffff, 0x38404242, - 1, 3, 2, 0x00001ae8, 0x0000ffff, 0x20203436 -}; - -void -_odm_read_and_config_mp_8814a_phy_reg_pg_type3( - struct dm_struct* pDM_Odm -) -{ - u32 i = 0; - u32 ArrayLen = sizeof(Array_MP_8814A_PHY_REG_PG_Type3)/sizeof(u32); - u32* Array = Array_MP_8814A_PHY_REG_PG_Type3; - -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - PADAPTER Adapter = pDM_Odm->Adapter; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - PlatformZeroMemory(pHalData->BufOfLinesPwrByRate, MAX_LINES_HWCONFIG_TXT*MAX_BYTES_LINE_HWCONFIG_TXT); - pHalData->nLinesReadPwrByRate = ArrayLen/6; -#endif - - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_8814A_PHY_REG_PG_Type3\n"); - - pDM_Odm->phy_reg_pg_version = 1; - pDM_Odm->phy_reg_pg_value_type = PHY_REG_PG_EXACT_VALUE; - - for (i = 0; i < ArrayLen; i += 6) { - u32 v1 = Array[i]; - u32 v2 = Array[i+1]; - u32 v3 = Array[i+2]; - u32 v4 = Array[i+3]; - u32 v5 = Array[i+4]; - u32 v6 = Array[i+5]; - - odm_ConfigBB_PHY_REG_PG_8814A(pDM_Odm, v1, v2, v3, v4, v5, v6); - -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - rsprintf((char *)pHalData->BufOfLinesPwrByRate[i/6], 100, "%s, %s, %s, 0x%X, 0x%08X, 0x%08X,", - (v1 == 0?"2.4G":" 5G"), (v2 == 0?"A":"B"), (v3 == 0?"1Tx":"2Tx"), v4, v5, v6); -#endif - } -} -*/ - - -#endif /* end of HWIMG_SUPPORT*/ - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_bb.h b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_bb.h deleted file mode 100644 index 949b6f978f4585..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_bb.h +++ /dev/null @@ -1,99 +0,0 @@ -/****************************************************************************** -* -* Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., -* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA -* -* -******************************************************************************/ - -/*Image2HeaderVersion: 2.19*/ -#if (RTL8814A_SUPPORT == 1) -#ifndef __INC_MP_BB_HW_IMG_8814A_H -#define __INC_MP_BB_HW_IMG_8814A_H - - -/****************************************************************************** -* AGC_TAB.TXT -******************************************************************************/ - -void -odm_read_and_config_mp_8814a_agc_tab(/* TC: Test Chip, MP: MP Chip*/ - struct dm_struct * pDM_Odm -); -u4Byte ODM_GetVersion_MP_8814A_AGC_TAB(void); - -/****************************************************************************** -* PHY_REG.TXT -******************************************************************************/ - -void -odm_read_and_config_mp_8814a_phy_reg(/* TC: Test Chip, MP: MP Chip*/ - struct dm_struct * pDM_Odm -); -u4Byte ODM_GetVersion_MP_8814A_PHY_REG(void); - -/****************************************************************************** -* PHY_REG_MP.TXT -******************************************************************************/ - -void -odm_read_and_config_mp_8814a_phy_reg_mp(/* TC: Test Chip, MP: MP Chip*/ - struct dm_struct * pDM_Odm -); -u4Byte ODM_GetVersion_MP_8814A_PHY_REG_MP(void); - -/****************************************************************************** -* PHY_REG_PG.TXT -******************************************************************************/ - -void -odm_read_and_config_mp_8814a_phy_reg_pg(/* TC: Test Chip, MP: MP Chip*/ - struct dm_struct * pDM_Odm -); -u4Byte ODM_GetVersion_MP_8814A_PHY_REG_PG(void); - -/****************************************************************************** -* PHY_REG_PG_Type2.TXT -******************************************************************************/ - -void -odm_read_and_config_mp_8814a_phy_reg_pg_type2(/* TC: Test Chip, MP: MP Chip*/ - struct dm_struct * pDM_Odm -); -u4Byte ODM_GetVersion_MP_8814A_PHY_REG_PG_Type2(void); - -/****************************************************************************** -* PHY_REG_PG_Type3.TXT -******************************************************************************/ - -void -odm_read_and_config_mp_8814a_phy_reg_pg_type3(/* TC: Test Chip, MP: MP Chip*/ - struct dm_struct * pDM_Odm -); -u4Byte ODM_GetVersion_MP_8814A_PHY_REG_PG_Type3(void); - -/****************************************************************************** -* PHY_REG_PG_Type5.TXT -******************************************************************************/ - -void -odm_read_and_config_mp_8814a_phy_reg_pg_type5(/* TC: Test Chip, MP: MP Chip*/ - struct dm_struct * pDM_Odm -); -u4Byte ODM_GetVersion_MP_8814A_PHY_REG_PG_Type5(void); - -#endif -#endif /* end of HWIMG_SUPPORT*/ - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_fw.h b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_fw.h deleted file mode 100644 index 3f8de123d2d2a9..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_fw.h +++ /dev/null @@ -1,56 +0,0 @@ -/****************************************************************************** -* -* Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., -* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA -* -* -******************************************************************************/ - -#if (RTL8814A_SUPPORT == 1) -#ifndef __INC_MP_FW_HW_IMG_8814A_H -#define __INC_MP_FW_HW_IMG_8814A_H - - -/****************************************************************************** -* FW_AP.TXT -******************************************************************************/ - -void -ODM_ReadFirmware_MP_8814A_FW_AP( - struct dm_struct *pDM_Odm, - u8 *pFirmware, - u32 *pFirmwareSize -); -u4Byte ODM_GetVersion_MP_8814A_FW_AP(void); -extern u32 array_length_mp_8814a_fw_ap; -extern u8 array_mp_8814a_fw_ap[]; - -/****************************************************************************** -* FW_NIC.TXT -******************************************************************************/ - -void -ODM_ReadFirmware_MP_8814A_FW_NIC( - struct dm_struct *pDM_Odm, - u8 *pFirmware, - u32 *pFirmwareSize -); -u4Byte ODM_GetVersion_MP_8814A_FW_NIC(void); -extern u32 array_length_mp_8814a_fw_nic; -extern u8 array_mp_8814a_fw_nic[]; - -#endif -#endif // end of HWIMG_SUPPORT - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_mac.c b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_mac.c deleted file mode 100644 index 0f2b4cf180aad4..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_mac.c +++ /dev/null @@ -1,316 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2017 Realtek Corporation. - * - * 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 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. - * - *****************************************************************************/ - -/*Image2HeaderVersion: 2.19*/ -#include "mp_precomp.h" -#include "../phydm_precomp.h" - -#if (RTL8814A_SUPPORT == 1) -static BOOLEAN -CheckPositive( - struct dm_struct *pDM_Odm, - u32 Condition1, - u32 Condition2, - u32 Condition3, - u32 Condition4 -) -{ - u1Byte _BoardType = ((pDM_Odm->board_type & BIT4) >> 4) << 0 | /* _GLNA*/ - ((pDM_Odm->board_type & BIT3) >> 3) << 1 | /* _GPA*/ - ((pDM_Odm->board_type & BIT7) >> 7) << 2 | /* _ALNA*/ - ((pDM_Odm->board_type & BIT6) >> 6) << 3 | /* _APA */ - ((pDM_Odm->board_type & BIT2) >> 2) << 4; /* _BT*/ - - u4Byte cond1 = Condition1, cond2 = Condition2, cond3 = Condition3, cond4 = Condition4; - u4Byte driver1 = pDM_Odm->cut_version << 24 | - (pDM_Odm->support_interface & 0xF0) << 16 | - pDM_Odm->support_platform << 16 | - pDM_Odm->package_type << 12 | - (pDM_Odm->support_interface & 0x0F) << 8 | - _BoardType; - - u4Byte driver2 = (pDM_Odm->type_glna & 0xFF) << 0 | - (pDM_Odm->type_gpa & 0xFF) << 8 | - (pDM_Odm->type_alna & 0xFF) << 16 | - (pDM_Odm->type_apa & 0xFF) << 24; - -u4Byte driver3 = 0; - - u4Byte driver4 = (pDM_Odm->type_glna & 0xFF00) >> 8 | - (pDM_Odm->type_gpa & 0xFF00) | - (pDM_Odm->type_alna & 0xFF00) << 8 | - (pDM_Odm->type_apa & 0xFF00) << 16; - - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, - "===> CheckPositive (cond1, cond2, cond3, cond4) = (0x%X 0x%X 0x%X 0x%X)\n", cond1, cond2, cond3, cond4); - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, - "===> CheckPositive (driver1, driver2, driver3, driver4) = (0x%X 0x%X 0x%X 0x%X)\n", driver1, driver2, driver3, driver4); - - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, - " (Platform, Interface) = (0x%X, 0x%X)\n", pDM_Odm->support_platform, pDM_Odm->support_interface); - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, - " (Board, Package) = (0x%X, 0x%X)\n", pDM_Odm->board_type, pDM_Odm->package_type); - - - /*============== Value Defined Check ===============*/ - /*QFN Type [15:12] and Cut Version [27:24] need to do value check*/ - - if (((cond1 & 0x0000F000) != 0) && ((cond1 & 0x0000F000) != (driver1 & 0x0000F000))) - return FALSE; - if (((cond1 & 0x0F000000) != 0) && ((cond1 & 0x0F000000) != (driver1 & 0x0F000000))) - return FALSE; - - /*=============== Bit Defined Check ================*/ - /* We don't care [31:28] */ - - cond1 &= 0x00FF0FFF; - driver1 &= 0x00FF0FFF; - - if ((cond1 & driver1) == cond1) { - u4Byte bitMask = 0; - - if ((cond1 & 0x0F) == 0) /* BoardType is DONTCARE*/ - return TRUE; - - if ((cond1 & BIT0) != 0) /*GLNA*/ - bitMask |= 0x000000FF; - if ((cond1 & BIT1) != 0) /*GPA*/ - bitMask |= 0x0000FF00; - if ((cond1 & BIT2) != 0) /*ALNA*/ - bitMask |= 0x00FF0000; - if ((cond1 & BIT3) != 0) /*APA*/ - bitMask |= 0xFF000000; - - if (((cond2 & bitMask) == (driver2 & bitMask)) && ((cond4 & bitMask) == (driver4 & bitMask))) /* BoardType of each RF path is matched*/ - return TRUE; - else - return FALSE; - } else - return FALSE; -} - -/****************************************************************************** -* MAC_REG.TXT -******************************************************************************/ - -u4Byte Array_MP_8814A_MAC_REG[] = { - 0x010, 0x0000007C, - 0x014, 0x000000DB, - 0x016, 0x00000002, - 0x073, 0x00000010, - 0x420, 0x00000080, - 0x421, 0x0000000F, - 0x428, 0x0000000A, - 0x429, 0x00000010, - 0x430, 0x00000000, - 0x431, 0x00000000, - 0x432, 0x00000000, - 0x433, 0x00000001, - 0x434, 0x00000004, - 0x435, 0x00000005, - 0x436, 0x00000007, - 0x437, 0x00000008, - 0x43C, 0x00000004, - 0x43D, 0x00000005, - 0x43E, 0x00000007, - 0x43F, 0x00000008, - 0x440, 0x0000005D, - 0x441, 0x00000001, - 0x442, 0x00000000, - 0x444, 0x00000010, - 0x445, 0x000000F0, - 0x446, 0x00000001, - 0x447, 0x000000FE, - 0x448, 0x00000000, - 0x449, 0x00000000, - 0x44A, 0x00000000, - 0x44B, 0x00000040, - 0x44C, 0x00000010, - 0x44D, 0x000000F0, - 0x44E, 0x0000003F, - 0x44F, 0x00000000, - 0x450, 0x00000000, - 0x451, 0x00000000, - 0x452, 0x00000000, - 0x453, 0x00000040, - 0x45E, 0x00000004, - 0x49C, 0x00000010, - 0x49D, 0x000000F0, - 0x49E, 0x00000000, - 0x49F, 0x00000006, - 0x4A0, 0x000000E0, - 0x4A1, 0x00000003, - 0x4A2, 0x00000000, - 0x4A3, 0x00000040, - 0x4A4, 0x00000015, - 0x4A5, 0x000000F0, - 0x4A6, 0x00000000, - 0x4A7, 0x00000006, - 0x4A8, 0x000000E0, - 0x4A9, 0x00000000, - 0x4AA, 0x00000000, - 0x4AB, 0x00000000, - 0x7DA, 0x00000008, - 0x1448, 0x00000006, - 0x144A, 0x00000006, - 0x144C, 0x00000006, - 0x144E, 0x00000006, - 0x4C8, 0x000000FF, - 0x4C9, 0x00000008, - 0x4CA, 0x0000003C, - 0x4CB, 0x0000003C, - 0x4CC, 0x000000FF, - 0x4CD, 0x000000FF, - 0x4CE, 0x00000001, - 0x4CF, 0x00000008, - 0x500, 0x00000026, - 0x501, 0x000000A2, - 0x502, 0x0000002F, - 0x503, 0x00000000, - 0x504, 0x00000028, - 0x505, 0x000000A3, - 0x506, 0x0000005E, - 0x507, 0x00000000, - 0x508, 0x0000002B, - 0x509, 0x000000A4, - 0x50A, 0x0000005E, - 0x50B, 0x00000000, - 0x50C, 0x0000004F, - 0x50D, 0x000000A4, - 0x50E, 0x00000000, - 0x50F, 0x00000000, - 0x512, 0x0000001C, - 0x514, 0x0000000A, - 0x516, 0x0000000A, - 0x521, 0x0000002F, - 0x525, 0x0000004F, - 0x550, 0x00000010, - 0x551, 0x00000010, - 0x559, 0x00000002, - 0x55C, 0x00000064, - 0x55D, 0x000000FF, - 0x577, 0x00000003, - 0x5BE, 0x00000064, - 0x604, 0x00000001, - 0x605, 0x00000030, - 0x607, 0x00000001, - 0x608, 0x0000000E, - 0x609, 0x0000002A, - 0x60A, 0x00000000, - 0x60C, 0x00000018, - 0x60D, 0x00000050, - 0x6A0, 0x000000FF, - 0x6A1, 0x000000FF, - 0x6A2, 0x000000FF, - 0x6A3, 0x000000FF, - 0x6A4, 0x000000FF, - 0x6A5, 0x000000FF, - 0x6DE, 0x00000084, - 0x620, 0x000000FF, - 0x621, 0x000000FF, - 0x622, 0x000000FF, - 0x623, 0x000000FF, - 0x624, 0x000000FF, - 0x625, 0x000000FF, - 0x626, 0x000000FF, - 0x627, 0x000000FF, - 0x638, 0x00000064, - 0x63C, 0x0000000A, - 0x63D, 0x0000000A, - 0x63E, 0x0000000E, - 0x63F, 0x0000000E, - 0x640, 0x00000040, - 0x642, 0x00000040, - 0x643, 0x00000000, - 0x652, 0x000000C8, - 0x66E, 0x00000005, - 0x700, 0x00000021, - 0x701, 0x00000043, - 0x702, 0x00000065, - 0x703, 0x00000087, - 0x708, 0x00000021, - 0x709, 0x00000043, - 0x70A, 0x00000065, - 0x70B, 0x00000087, - 0x718, 0x00000040, - 0x7D5, 0x000000BC, - 0x7D8, 0x00000028, - 0x7D9, 0x00000000, - 0x7DA, 0x0000000B, - -}; - -void -odm_read_and_config_mp_8814a_mac_reg( - struct dm_struct * pDM_Odm -) -{ - u4Byte i = 0; - u1Byte cCond; - BOOLEAN bMatched = TRUE, bSkipped = FALSE; - u4Byte ArrayLen = sizeof(Array_MP_8814A_MAC_REG)/sizeof(u4Byte); - pu4Byte Array = Array_MP_8814A_MAC_REG; - - u4Byte v1 = 0, v2 = 0, pre_v1 = 0, pre_v2 = 0; - - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_8814A_MAC_REG\n"); - - while ((i + 1) < ArrayLen) { - v1 = Array[i]; - v2 = Array[i + 1]; - - if (v1 & (BIT31 | BIT30)) {/*positive & negative condition*/ - if (v1 & BIT31) {/* positive condition*/ - cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28); - if (cCond == COND_ENDIF) {/*end*/ - bMatched = TRUE; - bSkipped = FALSE; - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "ENDIF\n"); - } else if (cCond == COND_ELSE) { /*else*/ - bMatched = bSkipped?FALSE:TRUE; - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "ELSE\n"); - } else {/*if , else if*/ - pre_v1 = v1; - pre_v2 = v2; - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "IF or ELSE IF\n"); - } - } else if (v1 & BIT30) { /*negative condition*/ - if (bSkipped == FALSE) { - if (CheckPositive(pDM_Odm, pre_v1, pre_v2, v1, v2)) { - bMatched = TRUE; - bSkipped = TRUE; - } else { - bMatched = FALSE; - bSkipped = FALSE; - } - } else - bMatched = FALSE; - } - } else { - if (bMatched) - odm_ConfigMAC_8814A(pDM_Odm, v1, (u1Byte)v2); - } - i = i + 2; - } -} - -u4Byte -odm_get_version_mp_8814a_mac_reg(void) -{ - return 85; -} - -#endif /* end of HWIMG_SUPPORT*/ - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_mac.h b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_mac.h deleted file mode 100644 index 94f6a2daf44ed1..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_mac.h +++ /dev/null @@ -1,39 +0,0 @@ -/****************************************************************************** -* -* Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., -* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA -* -* -******************************************************************************/ - -/*Image2HeaderVersion: 2.19*/ -#if (RTL8814A_SUPPORT == 1) -#ifndef __INC_MP_MAC_HW_IMG_8814A_H -#define __INC_MP_MAC_HW_IMG_8814A_H - - -/****************************************************************************** -* MAC_REG.TXT -******************************************************************************/ - -void -odm_read_and_config_mp_8814a_mac_reg(/* TC: Test Chip, MP: MP Chip*/ - struct dm_struct *pDM_Odm -); -u4Byte odm_get_version_mp_8814a_mac_reg(void); - -#endif -#endif /* end of HWIMG_SUPPORT*/ - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_rf.c b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_rf.c deleted file mode 100644 index 523d5cd0588b20..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_rf.c +++ /dev/null @@ -1,8829 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2017 Realtek Corporation. - * - * 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 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. - * - *****************************************************************************/ - -/*Image2HeaderVersion: 2.19*/ -#include "mp_precomp.h" -#include "../phydm_precomp.h" - -#if (RTL8814A_SUPPORT == 1) -static BOOLEAN -CheckPositive( - struct dm_struct *pDM_Odm, - u32 Condition1, - u32 Condition2, - u32 Condition3, - u32 Condition4 -) -{ - u1Byte _BoardType = ((pDM_Odm->board_type & BIT4) >> 4) << 0 | /* _GLNA*/ - ((pDM_Odm->board_type & BIT3) >> 3) << 1 | /* _GPA*/ - ((pDM_Odm->board_type & BIT7) >> 7) << 2 | /* _ALNA*/ - ((pDM_Odm->board_type & BIT6) >> 6) << 3 | /* _APA */ - ((pDM_Odm->board_type & BIT2) >> 2) << 4; /* _BT*/ - - u4Byte cond1 = Condition1, cond2 = Condition2, cond3 = Condition3, cond4 = Condition4; - u4Byte driver1 = pDM_Odm->cut_version << 24 | - (pDM_Odm->support_interface & 0xF0) << 16 | - pDM_Odm->support_platform << 16 | - pDM_Odm->package_type << 12 | - (pDM_Odm->support_interface & 0x0F) << 8 | - _BoardType; - - u4Byte driver2 = (pDM_Odm->type_glna & 0xFF) << 0 | - (pDM_Odm->type_gpa & 0xFF) << 8 | - (pDM_Odm->type_alna & 0xFF) << 16 | - (pDM_Odm->type_apa & 0xFF) << 24; - -u4Byte driver3 = 0; - - u4Byte driver4 = (pDM_Odm->type_glna & 0xFF00) >> 8 | - (pDM_Odm->type_gpa & 0xFF00) | - (pDM_Odm->type_alna & 0xFF00) << 8 | - (pDM_Odm->type_apa & 0xFF00) << 16; - - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, - "===> CheckPositive (cond1, cond2, cond3, cond4) = (0x%X 0x%X 0x%X 0x%X)\n", cond1, cond2, cond3, cond4); - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, - "===> CheckPositive (driver1, driver2, driver3, driver4) = (0x%X 0x%X 0x%X 0x%X)\n", driver1, driver2, driver3, driver4); - - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, - " (Platform, Interface) = (0x%X, 0x%X)\n", pDM_Odm->support_platform, pDM_Odm->support_interface); - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, - " (Board, Package) = (0x%X, 0x%X)\n", pDM_Odm->board_type, pDM_Odm->package_type); - - - /*============== Value Defined Check ===============*/ - /*QFN Type [15:12] and Cut Version [27:24] need to do value check*/ - - if (((cond1 & 0x0000F000) != 0) && ((cond1 & 0x0000F000) != (driver1 & 0x0000F000))) - return FALSE; - if (((cond1 & 0x0F000000) != 0) && ((cond1 & 0x0F000000) != (driver1 & 0x0F000000))) - return FALSE; - - /*=============== Bit Defined Check ================*/ - /* We don't care [31:28] */ - - cond1 &= 0x00FF0FFF; - driver1 &= 0x00FF0FFF; - - if ((cond1 & driver1) == cond1) { - u4Byte bitMask = 0; - - if ((cond1 & 0x0F) == 0) /* BoardType is DONTCARE*/ - return TRUE; - - if ((cond1 & BIT0) != 0) /*GLNA*/ - bitMask |= 0x000000FF; - if ((cond1 & BIT1) != 0) /*GPA*/ - bitMask |= 0x0000FF00; - if ((cond1 & BIT2) != 0) /*ALNA*/ - bitMask |= 0x00FF0000; - if ((cond1 & BIT3) != 0) /*APA*/ - bitMask |= 0xFF000000; - - if (((cond2 & bitMask) == (driver2 & bitMask)) && ((cond4 & bitMask) == (driver4 & bitMask))) /* BoardType of each RF path is matched*/ - return TRUE; - else - return FALSE; - } else - return FALSE; -} - -/****************************************************************************** -* RadioA.TXT -******************************************************************************/ - -u4Byte Array_MP_8814A_RadioA[] = { - 0x018, 0x00013124, - 0x040, 0x00000C00, - 0x058, 0x00000F98, - 0x07F, 0x00068004, - 0x0B0, 0x000FFFFE, - 0x0B1, 0x0003FF48, - 0x0B2, 0x0006AA3F, - 0x0B3, 0x000FFC9A, - 0x0B4, 0x0000A78F, - 0x0B5, 0x00000A3F, - 0x0B6, 0x0000C09C, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x0B7, 0x00030008, - 0x90000004, 0x00550000, 0x40000000, 0x00000000, - 0x0B7, 0x00030008, - 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x0B7, 0x00030008, - 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, - 0x0B7, 0x00030008, - 0x90000004, 0x00000000, 0x40000000, 0x00550000, - 0x0B7, 0x00030008, - 0xA0000000, 0x00000000, - 0x0B7, 0x0003000C, - 0xB0000000, 0x00000000, - 0x0B8, 0x0007400E, - 0x0B9, 0x00008250, - 0x0BA, 0x00050780, - 0x0BB, 0x00000000, - 0x0BC, 0x00040009, - 0x0BD, 0x00000000, - 0x0BE, 0x00000000, - 0x0BF, 0x00000000, - 0x0EF, 0x00020000, - 0x03E, 0x00000000, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x03F, 0x00030000, - 0xA0000000, 0x00000000, - 0x03F, 0x00030000, - 0xB0000000, 0x00000000, - 0x03E, 0x00020000, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x03F, 0x00040000, - 0xA0000000, 0x00000000, - 0x03F, 0x00040000, - 0xB0000000, 0x00000000, - 0x03E, 0x00040000, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x03F, 0x00030000, - 0xA0000000, 0x00000000, - 0x03F, 0x00030000, - 0xB0000000, 0x00000000, - 0x03E, 0x00060000, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x03F, 0x00030000, - 0xA0000000, 0x00000000, - 0x03F, 0x00030000, - 0xB0000000, 0x00000000, - 0x0EF, 0x00000000, - 0x0EF, 0x00010000, - 0x03E, 0x00000000, - 0x03F, 0x00006800, - 0x03E, 0x00000080, - 0x03F, 0x00006000, - 0x03E, 0x00000100, - 0x03F, 0x00004800, - 0x03E, 0x00000180, - 0x03F, 0x00004000, - 0x03E, 0x00000200, - 0x03F, 0x00004000, - 0x03E, 0x00000280, - 0x03F, 0x00002800, - 0x03E, 0x00000300, - 0x03F, 0x00002800, - 0x03E, 0x00000380, - 0x03F, 0x00002000, - 0x0EF, 0x00000000, - 0x0EF, 0x00040000, - 0x03E, 0x00000000, - 0x03F, 0x000000BC, - 0x03E, 0x00000040, - 0x03F, 0x00000053, - 0x03E, 0x00000050, - 0x03F, 0x00000050, - 0x03E, 0x00000060, - 0x03F, 0x00000050, - 0x0EF, 0x00000000, - 0x0EF, 0x00000400, - 0x03E, 0x00000006, - 0x041, 0x000EE080, - 0x03E, 0x00000008, - 0x041, 0x000EE0C0, - 0x03E, 0x0000000A, - 0x041, 0x000EE100, - 0x03E, 0x0000000C, - 0x041, 0x000EE100, - 0x0EF, 0x00000000, - 0x018, 0x00000006, - 0x80000001, 0x00000055, 0x40000000, 0x00000000, - 0x086, 0x000E335A, - 0x90000001, 0x000000aa, 0x40000000, 0x00000000, - 0x086, 0x000E335A, - 0xA0000000, 0x00000000, - 0x086, 0x000E4B58, - 0xB0000000, 0x00000000, - 0x80000004, 0x00550000, 0x40000000, 0x00000000, - 0x087, 0x00079F80, - 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x087, 0x00079F80, - 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, - 0x087, 0x00079F80, - 0x90000004, 0x00000000, 0x40000000, 0x00550000, - 0x087, 0x00079F80, - 0xA0000000, 0x00000000, - 0x087, 0x00049F80, - 0xB0000000, 0x00000000, - 0x0DF, 0x00000008, - 0x0EF, 0x00002000, - 0x80000001, 0x00000055, 0x40000000, 0x00000000, - 0x03B, 0x0003F19B, - 0x03B, 0x00037A5B, - 0x03B, 0x0002A433, - 0x03B, 0x00027BD3, - 0x03B, 0x0001F80B, - 0x03B, 0x000179C3, - 0x90000001, 0x000000aa, 0x40000000, 0x00000000, - 0x03B, 0x0003F19B, - 0x03B, 0x00037A5B, - 0x03B, 0x0002A433, - 0x03B, 0x00027BD3, - 0x03B, 0x0001F80B, - 0x03B, 0x000179C3, - 0xA0000000, 0x00000000, - 0x03B, 0x0003F258, - 0x03B, 0x00030A58, - 0x03B, 0x0002FA58, - 0x03B, 0x00022590, - 0x03B, 0x0001FA50, - 0x03B, 0x00010248, - 0x03B, 0x00008240, - 0xB0000000, 0x00000000, - 0x0EF, 0x00000100, - 0x80000002, 0x00005500, 0x40000000, 0x00000000, - 0x034, 0x0000A0D0, - 0x034, 0x000090CD, - 0x034, 0x000080CA, - 0x034, 0x0000704D, - 0x034, 0x0000604A, - 0x034, 0x00005047, - 0x034, 0x0000400A, - 0x034, 0x00003007, - 0x034, 0x00002004, - 0x034, 0x00001001, - 0x034, 0x00000001, - 0x90000002, 0x0000aa00, 0x40000000, 0x00000000, - 0x034, 0x0000A0D0, - 0x034, 0x000090CD, - 0x034, 0x000080CA, - 0x034, 0x0000704D, - 0x034, 0x0000604A, - 0x034, 0x00005047, - 0x034, 0x0000400A, - 0x034, 0x00003007, - 0x034, 0x00002004, - 0x034, 0x00001001, - 0x034, 0x00000001, - 0xA0000000, 0x00000000, - 0x034, 0x0000ADF6, - 0x034, 0x00009DF3, - 0x034, 0x00008DF0, - 0x034, 0x00007DED, - 0x034, 0x00006DEA, - 0x034, 0x00005CED, - 0x034, 0x00004CEA, - 0x034, 0x000034EA, - 0x034, 0x000024E7, - 0x034, 0x0000146A, - 0x034, 0x0000006B, - 0xB0000000, 0x00000000, - 0x80000002, 0x00005500, 0x40000000, 0x00000000, - 0x034, 0x0000A0D0, - 0x034, 0x000090CD, - 0x034, 0x000080CA, - 0x034, 0x0000704D, - 0x034, 0x0000604A, - 0x034, 0x00005047, - 0x034, 0x0000400A, - 0x034, 0x00003007, - 0x034, 0x00002004, - 0x034, 0x00001001, - 0x034, 0x00000001, - 0x90000002, 0x0000aa00, 0x40000000, 0x00000000, - 0x034, 0x0000A0D0, - 0x034, 0x000090CD, - 0x034, 0x000080CA, - 0x034, 0x0000704D, - 0x034, 0x0000604A, - 0x034, 0x00005047, - 0x034, 0x0000400A, - 0x034, 0x00003007, - 0x034, 0x00002004, - 0x034, 0x00001001, - 0x034, 0x00000001, - 0xA0000000, 0x00000000, - 0x034, 0x0008ADF6, - 0x034, 0x00089DF3, - 0x034, 0x00088DF0, - 0x034, 0x00087DED, - 0x034, 0x00086DEA, - 0x034, 0x00085CED, - 0x034, 0x00084CEA, - 0x034, 0x000834EA, - 0x034, 0x000824E7, - 0x034, 0x0008146A, - 0x034, 0x0008006B, - 0xB0000000, 0x00000000, - 0x0EF, 0x00000000, - 0x0EF, 0x000020A2, - 0x0DF, 0x00000080, - 0x035, 0x00000192, - 0x035, 0x00008192, - 0x035, 0x00010192, - 0x036, 0x00000024, - 0x036, 0x00008024, - 0x036, 0x00010024, - 0x036, 0x00018024, - 0x0EF, 0x00000000, - 0x051, 0x00000C21, - 0x052, 0x000006D9, - 0x053, 0x000FC649, - 0x054, 0x0000017E, - 0x018, 0x0001012A, - 0x081, 0x0007FC00, - 0x089, 0x00050110, - 0x08A, 0x00043E50, - 0x08B, 0x0002E180, - 0x08C, 0x00093C3C, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x085, 0x000F8000, - 0xA0000000, 0x00000000, - 0x085, 0x000F8000, - 0xB0000000, 0x00000000, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x08D, 0x000FFFF0, - 0x90000004, 0x00550000, 0x40000000, 0x00000000, - 0x08D, 0x000FFFF0, - 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x08D, 0x000FFFF0, - 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, - 0x08D, 0x000FFFF0, - 0x90000004, 0x00000000, 0x40000000, 0x00550000, - 0x08D, 0x000FFFF0, - 0xA0000000, 0x00000000, - 0x08D, 0x000FFFF0, - 0xB0000000, 0x00000000, - 0x0EF, 0x00001000, - 0x03A, 0x0000013C, - 0x03B, 0x00038023, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x03C, 0x00024000, - 0x90000004, 0x00550000, 0x40000000, 0x00000000, - 0x03C, 0x00024000, - 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x03C, 0x00000000, - 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, - 0x03C, 0x00088000, - 0x90000004, 0x00000000, 0x40000000, 0x00550000, - 0x03C, 0x00000000, - 0xA0000000, 0x00000000, - 0x03C, 0x00028000, - 0xB0000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00030023, - 0x03C, 0x00048000, - 0x03A, 0x0000013C, - 0x03B, 0x00028623, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00021633, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x0001C633, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00010293, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00009593, - 0x03C, 0x00000000, - 0x03A, 0x00000148, - 0x03B, 0x0000078B, - 0x03C, 0x00000000, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0x90000004, 0x00550000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0xA0000000, 0x00000000, - 0x03A, 0x0000013C, - 0xB0000000, 0x00000000, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x03B, 0x00078023, - 0x03C, 0x00024000, - 0x90000004, 0x00550000, 0x40000000, 0x00000000, - 0x03B, 0x00078023, - 0x03C, 0x000AC000, - 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x03B, 0x00078023, - 0x03C, 0x00024000, - 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, - 0x03B, 0x00078023, - 0x03C, 0x00088000, - 0x90000004, 0x00000000, 0x40000000, 0x00550000, - 0x03B, 0x00078023, - 0x03C, 0x00024000, - 0xA0000000, 0x00000000, - 0x03B, 0x00078023, - 0x03C, 0x0004C000, - 0xB0000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00070023, - 0x03C, 0x00048000, - 0x03A, 0x0000013C, - 0x03B, 0x00068623, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00061633, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x0005C633, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00050293, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00049593, - 0x03C, 0x00000000, - 0x03A, 0x00000148, - 0x03B, 0x0004078B, - 0x03C, 0x00000000, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0x90000004, 0x00550000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0xA0000000, 0x00000000, - 0x03A, 0x0000013C, - 0xB0000000, 0x00000000, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x03B, 0x000B8023, - 0x03C, 0x00084000, - 0x90000004, 0x00550000, 0x40000000, 0x00000000, - 0x03B, 0x000B8023, - 0x03C, 0x0008C000, - 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x03B, 0x000B8023, - 0x03C, 0x00000000, - 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, - 0x03B, 0x000B8023, - 0x03C, 0x00084000, - 0x90000004, 0x00000000, 0x40000000, 0x00550000, - 0x03B, 0x000B8023, - 0x03C, 0x00000000, - 0xA0000000, 0x00000000, - 0x03B, 0x000B8023, - 0x03C, 0x00004000, - 0xB0000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x000B0023, - 0x80000004, 0x00ff0000, 0x40000000, 0x00000000, - 0x03C, 0x00020000, - 0xA0000000, 0x00000000, - 0x03C, 0x00020000, - 0xB0000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x000A8623, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x000A1633, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x0009C633, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00090293, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00089593, - 0x03C, 0x00000000, - 0x03A, 0x00000148, - 0x03B, 0x0008078B, - 0x03C, 0x00000000, - 0x0EF, 0x00000000, - 0x0EF, 0x00000800, - 0x03B, 0x00000000, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x03A, 0x00000803, - 0x90000004, 0x00550000, 0x40000000, 0x00000000, - 0x03A, 0x00000801, - 0xA0000000, 0x00000000, - 0x03A, 0x00000803, - 0xB0000000, 0x00000000, - 0x03B, 0x00040000, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x03A, 0x00001000, - 0x90000004, 0x00550000, 0x40000000, 0x00000000, - 0x03A, 0x00001801, - 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x03A, 0x00000003, - 0x90000004, 0x00000000, 0x40000000, 0x00550000, - 0x03A, 0x00000003, - 0xA0000000, 0x00000000, - 0x03A, 0x00001000, - 0xB0000000, 0x00000000, - 0x03B, 0x00080000, - 0x03A, 0x00001802, - 0x0EF, 0x00000000, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x90000004, 0x00550000, 0x40000000, 0x00000000, - 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, - 0x90000004, 0x00000000, 0x40000000, 0x00550000, - 0xA0000000, 0x00000000, - 0x0EF, 0x00000008, - 0x03C, 0x00000000, - 0x03C, 0x00000400, - 0x03C, 0x00000800, - 0x0EF, 0x00000000, - 0xB0000000, 0x00000000, - 0x018, 0x00013124, - 0x0EF, 0x00000100, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x034, 0x0004A1AD, - 0x034, 0x000491AA, - 0x034, 0x000481A7, - 0x034, 0x000470AA, - 0x034, 0x000460A7, - 0x034, 0x00045049, - 0x034, 0x00044046, - 0x034, 0x00043026, - 0x034, 0x00042009, - 0x034, 0x00041006, - 0x034, 0x00040003, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x034, 0x0004A3EF, - 0x034, 0x000493AF, - 0x034, 0x000483AB, - 0x034, 0x0004718C, - 0x034, 0x00046189, - 0x034, 0x0004506D, - 0x034, 0x0004406A, - 0x034, 0x0004302C, - 0x034, 0x00042029, - 0x034, 0x00041026, - 0x034, 0x00040023, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x034, 0x0004A3EF, - 0x034, 0x000493AF, - 0x034, 0x000483AB, - 0x034, 0x0004718C, - 0x034, 0x00046189, - 0x034, 0x0004506D, - 0x034, 0x0004406A, - 0x034, 0x0004302C, - 0x034, 0x00042029, - 0x034, 0x00041026, - 0x034, 0x00040023, - 0xA0000000, 0x00000000, - 0x034, 0x0004AFF1, - 0x034, 0x00049FEE, - 0x034, 0x00048FEB, - 0x034, 0x00047FE8, - 0x034, 0x00046DEA, - 0x034, 0x00045DE7, - 0x034, 0x00044CEA, - 0x034, 0x00043CE7, - 0x034, 0x00042C69, - 0x034, 0x00041C66, - 0x034, 0x00040C28, - 0xB0000000, 0x00000000, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x034, 0x0002A1AD, - 0x034, 0x000291AA, - 0x034, 0x000281A7, - 0x034, 0x000270AA, - 0x034, 0x000260A7, - 0x034, 0x00025049, - 0x034, 0x00024046, - 0x034, 0x00023026, - 0x034, 0x00022009, - 0x034, 0x00021006, - 0x034, 0x00020003, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x034, 0x0002A3EF, - 0x034, 0x000293AC, - 0x034, 0x0002838A, - 0x034, 0x0002718C, - 0x034, 0x00026189, - 0x034, 0x0002506D, - 0x034, 0x0002406A, - 0x034, 0x0002302C, - 0x034, 0x00022029, - 0x034, 0x00021026, - 0x034, 0x00020023, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x034, 0x0002A3EF, - 0x034, 0x000293AC, - 0x034, 0x0002838A, - 0x034, 0x0002718C, - 0x034, 0x00026189, - 0x034, 0x0002506D, - 0x034, 0x0002406A, - 0x034, 0x0002302C, - 0x034, 0x00022029, - 0x034, 0x00021026, - 0x034, 0x00020023, - 0xA0000000, 0x00000000, - 0x034, 0x0002AFF1, - 0x034, 0x00029FEE, - 0x034, 0x00028FEB, - 0x034, 0x00027FE8, - 0x034, 0x00026DEA, - 0x034, 0x00025DE7, - 0x034, 0x00024CEA, - 0x034, 0x00023CE7, - 0x034, 0x00022C69, - 0x034, 0x00021C66, - 0x034, 0x00020C28, - 0xB0000000, 0x00000000, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x034, 0x0000A3EC, - 0x034, 0x0000938C, - 0x034, 0x000081AD, - 0x034, 0x000071AA, - 0x034, 0x000061A7, - 0x034, 0x000050AA, - 0x034, 0x000040A7, - 0x034, 0x0000302C, - 0x034, 0x00002029, - 0x034, 0x0000100C, - 0x034, 0x00000009, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x034, 0x0000A3EE, - 0x034, 0x000093AC, - 0x034, 0x0000838A, - 0x034, 0x0000718C, - 0x034, 0x00006189, - 0x034, 0x0000506D, - 0x034, 0x0000406A, - 0x034, 0x0000302C, - 0x034, 0x00002029, - 0x034, 0x00001026, - 0x034, 0x00000023, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x034, 0x0000A3EE, - 0x034, 0x000093AC, - 0x034, 0x0000838A, - 0x034, 0x0000718C, - 0x034, 0x00006189, - 0x034, 0x0000506D, - 0x034, 0x0000406A, - 0x034, 0x0000302C, - 0x034, 0x00002029, - 0x034, 0x00001026, - 0x034, 0x00000023, - 0xA0000000, 0x00000000, - 0x034, 0x0000AFF1, - 0x034, 0x00009FEE, - 0x034, 0x00008FEB, - 0x034, 0x00007FE8, - 0x034, 0x00006DEA, - 0x034, 0x00005DE7, - 0x034, 0x00004CEA, - 0x034, 0x00003CE7, - 0x034, 0x00002C69, - 0x034, 0x00001C66, - 0x034, 0x00000C28, - 0xB0000000, 0x00000000, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x034, 0x000CA1AD, - 0x034, 0x000C91AA, - 0x034, 0x000C81A7, - 0x034, 0x000C70AA, - 0x034, 0x000C60A7, - 0x034, 0x000C5049, - 0x034, 0x000C4046, - 0x034, 0x000C3026, - 0x034, 0x000C2009, - 0x034, 0x000C1006, - 0x034, 0x000C0003, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x034, 0x000CA3EF, - 0x034, 0x000C93AF, - 0x034, 0x000C83AB, - 0x034, 0x000C718C, - 0x034, 0x000C6189, - 0x034, 0x000C506D, - 0x034, 0x000C406A, - 0x034, 0x000C302C, - 0x034, 0x000C2029, - 0x034, 0x000C1026, - 0x034, 0x000C0023, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x034, 0x000CA3EF, - 0x034, 0x000C93AF, - 0x034, 0x000C83AB, - 0x034, 0x000C718C, - 0x034, 0x000C6189, - 0x034, 0x000C506D, - 0x034, 0x000C406A, - 0x034, 0x000C302C, - 0x034, 0x000C2029, - 0x034, 0x000C1026, - 0x034, 0x000C0023, - 0xA0000000, 0x00000000, - 0x034, 0x000CA794, - 0x034, 0x000C9791, - 0x034, 0x000C878E, - 0x034, 0x000C778B, - 0x034, 0x000C658D, - 0x034, 0x000C558A, - 0x034, 0x000C448D, - 0x034, 0x000C348A, - 0x034, 0x000C244C, - 0x034, 0x000C1449, - 0x034, 0x000C042B, - 0xB0000000, 0x00000000, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x034, 0x000AA1AD, - 0x034, 0x000A91AA, - 0x034, 0x000A81A7, - 0x034, 0x000A70AA, - 0x034, 0x000A60A7, - 0x034, 0x000A5049, - 0x034, 0x000A4046, - 0x034, 0x000A3026, - 0x034, 0x000A2009, - 0x034, 0x000A1006, - 0x034, 0x000A0003, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x034, 0x000AA3EF, - 0x034, 0x000A93AC, - 0x034, 0x000A838A, - 0x034, 0x000A718C, - 0x034, 0x000A6189, - 0x034, 0x000A506D, - 0x034, 0x000A406A, - 0x034, 0x000A302C, - 0x034, 0x000A2029, - 0x034, 0x000A1026, - 0x034, 0x000A0023, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x034, 0x000AA3EF, - 0x034, 0x000A93AC, - 0x034, 0x000A838A, - 0x034, 0x000A718C, - 0x034, 0x000A6189, - 0x034, 0x000A506D, - 0x034, 0x000A406A, - 0x034, 0x000A302C, - 0x034, 0x000A2029, - 0x034, 0x000A1026, - 0x034, 0x000A0023, - 0xA0000000, 0x00000000, - 0x034, 0x000AA794, - 0x034, 0x000A9791, - 0x034, 0x000A878E, - 0x034, 0x000A778B, - 0x034, 0x000A658D, - 0x034, 0x000A558A, - 0x034, 0x000A448D, - 0x034, 0x000A348A, - 0x034, 0x000A244C, - 0x034, 0x000A1449, - 0x034, 0x000A042B, - 0xB0000000, 0x00000000, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x034, 0x0008A3EC, - 0x034, 0x0008938C, - 0x034, 0x000881AD, - 0x034, 0x000871AA, - 0x034, 0x000861A7, - 0x034, 0x000850AA, - 0x034, 0x000840A7, - 0x034, 0x0008302C, - 0x034, 0x00082029, - 0x034, 0x0008100C, - 0x034, 0x00080009, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x034, 0x0008A3EE, - 0x034, 0x000893AC, - 0x034, 0x0008838A, - 0x034, 0x0008718C, - 0x034, 0x00086189, - 0x034, 0x0008506D, - 0x034, 0x0008406A, - 0x034, 0x0008302C, - 0x034, 0x00082029, - 0x034, 0x00081026, - 0x034, 0x00080023, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x034, 0x0008A3EE, - 0x034, 0x000893AC, - 0x034, 0x0008838A, - 0x034, 0x0008718C, - 0x034, 0x00086189, - 0x034, 0x0008506D, - 0x034, 0x0008406A, - 0x034, 0x0008302C, - 0x034, 0x00082029, - 0x034, 0x00081026, - 0x034, 0x00080023, - 0xA0000000, 0x00000000, - 0x034, 0x0008A794, - 0x034, 0x00089791, - 0x034, 0x0008878E, - 0x034, 0x0008778B, - 0x034, 0x0008658D, - 0x034, 0x0008558A, - 0x034, 0x0008448D, - 0x034, 0x0008348A, - 0x034, 0x0008244C, - 0x034, 0x00081449, - 0x034, 0x0008042B, - 0xB0000000, 0x00000000, - 0x0EF, 0x00000000, - 0x0DF, 0x00000001, - 0x018, 0x0001712A, - 0x0EF, 0x00000040, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x035, 0x000006CC, - 0x035, 0x000086CC, - 0x035, 0x000106CC, - 0x035, 0x000206CC, - 0x035, 0x000286CC, - 0x035, 0x000306CC, - 0x035, 0x000406CC, - 0x035, 0x000486CC, - 0x035, 0x000506CC, - 0x035, 0x000806CC, - 0x035, 0x000886CC, - 0x035, 0x000906CC, - 0x035, 0x000A06CC, - 0x035, 0x000A86CC, - 0x035, 0x000B06CC, - 0x035, 0x000C06CC, - 0x035, 0x000C86CC, - 0x035, 0x000D06CC, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x035, 0x000006CC, - 0x035, 0x000086CC, - 0x035, 0x000106CC, - 0x035, 0x000206CC, - 0x035, 0x000286CC, - 0x035, 0x000306CC, - 0x035, 0x000406CC, - 0x035, 0x000486CC, - 0x035, 0x000506CC, - 0x035, 0x000806CC, - 0x035, 0x000886CC, - 0x035, 0x000906CC, - 0x035, 0x000A06CC, - 0x035, 0x000A86CC, - 0x035, 0x000B06CC, - 0x035, 0x000C06CC, - 0x035, 0x000C86CC, - 0x035, 0x000D06CC, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x035, 0x000006CC, - 0x035, 0x000086CC, - 0x035, 0x000106CC, - 0x035, 0x000206CC, - 0x035, 0x000286CC, - 0x035, 0x000306CC, - 0x035, 0x000406CC, - 0x035, 0x000486CC, - 0x035, 0x000506CC, - 0x035, 0x000806CC, - 0x035, 0x000886CC, - 0x035, 0x000906CC, - 0x035, 0x000A06CC, - 0x035, 0x000A86CC, - 0x035, 0x000B06CC, - 0x035, 0x000C06CC, - 0x035, 0x000C86CC, - 0x035, 0x000D06CC, - 0xA0000000, 0x00000000, - 0x035, 0x00000747, - 0x035, 0x00008747, - 0x035, 0x00010747, - 0x035, 0x00020747, - 0x035, 0x00028747, - 0x035, 0x00030747, - 0x035, 0x00040747, - 0x035, 0x00048747, - 0x035, 0x00050747, - 0x035, 0x000805FB, - 0x035, 0x000885FB, - 0x035, 0x000905FB, - 0x035, 0x000A05FB, - 0x035, 0x000A85FB, - 0x035, 0x000B05FB, - 0x035, 0x000C05FB, - 0x035, 0x000C85FB, - 0x035, 0x000D05FB, - 0xB0000000, 0x00000000, - 0x0EF, 0x00000000, - 0x0DF, 0x00000001, - 0x018, 0x0001712A, - 0x0EF, 0x00000010, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x036, 0x00000473, - 0x036, 0x00008473, - 0x036, 0x00010473, - 0x036, 0x00020473, - 0x036, 0x00028473, - 0x036, 0x00030473, - 0x036, 0x00040473, - 0x036, 0x00048473, - 0x036, 0x00050473, - 0x036, 0x00080473, - 0x036, 0x00088473, - 0x036, 0x00090473, - 0x036, 0x000A0473, - 0x036, 0x000A8473, - 0x036, 0x000B0473, - 0x036, 0x000C0473, - 0x036, 0x000C8473, - 0x036, 0x000D0473, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x036, 0x00000475, - 0x036, 0x00008475, - 0x036, 0x00010475, - 0x036, 0x00020475, - 0x036, 0x00028475, - 0x036, 0x00030475, - 0x036, 0x00040475, - 0x036, 0x00048475, - 0x036, 0x00050475, - 0x036, 0x00080475, - 0x036, 0x00088475, - 0x036, 0x00090475, - 0x036, 0x000A0475, - 0x036, 0x000A8475, - 0x036, 0x000B0475, - 0x036, 0x000C0475, - 0x036, 0x000C8475, - 0x036, 0x000D0475, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x036, 0x00000475, - 0x036, 0x00008475, - 0x036, 0x00010475, - 0x036, 0x00020475, - 0x036, 0x00028475, - 0x036, 0x00030475, - 0x036, 0x00040475, - 0x036, 0x00048475, - 0x036, 0x00050475, - 0x036, 0x00080475, - 0x036, 0x00088475, - 0x036, 0x00090475, - 0x036, 0x000A0475, - 0x036, 0x000A8475, - 0x036, 0x000B0475, - 0x036, 0x000C0475, - 0x036, 0x000C8475, - 0x036, 0x000D0475, - 0xA0000000, 0x00000000, - 0x036, 0x00000473, - 0x036, 0x00008473, - 0x036, 0x00010473, - 0x036, 0x00020473, - 0x036, 0x00028473, - 0x036, 0x00030473, - 0x036, 0x00040473, - 0x036, 0x00048473, - 0x036, 0x00050473, - 0x036, 0x00080473, - 0x036, 0x00088473, - 0x036, 0x00090473, - 0x036, 0x000A0473, - 0x036, 0x000A8473, - 0x036, 0x000B0473, - 0x036, 0x000C0473, - 0x036, 0x000C8473, - 0x036, 0x000D0473, - 0xB0000000, 0x00000000, - 0x0EF, 0x00000000, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0xA0000000, 0x00000000, - 0x0EF, 0x00000004, - 0x037, 0x00000000, - 0x038, 0x00005146, - 0x037, 0x00004000, - 0x038, 0x00005146, - 0x037, 0x00008000, - 0x038, 0x00005146, - 0x037, 0x00010000, - 0x038, 0x00005146, - 0x037, 0x00014000, - 0x038, 0x00005146, - 0x037, 0x00018000, - 0x038, 0x00004D4E, - 0x037, 0x0001C000, - 0x038, 0x00004D4E, - 0x037, 0x00020000, - 0x038, 0x00004D4E, - 0x037, 0x00024000, - 0x038, 0x000071C6, - 0x037, 0x00028000, - 0x038, 0x000071C6, - 0x037, 0x0002C000, - 0x038, 0x000071C6, - 0x037, 0x00030000, - 0x038, 0x000071CE, - 0x037, 0x00034000, - 0x038, 0x000071CE, - 0x037, 0x00038000, - 0x038, 0x00005126, - 0x037, 0x0003C000, - 0x038, 0x00005126, - 0x037, 0x00040000, - 0x038, 0x00005126, - 0x037, 0x00044000, - 0x038, 0x00005126, - 0x037, 0x00048000, - 0x038, 0x00005126, - 0x037, 0x00080000, - 0x038, 0x00005ECE, - 0x037, 0x00084000, - 0x038, 0x00005ECE, - 0x037, 0x00088000, - 0x038, 0x00005ECE, - 0x037, 0x00090000, - 0x038, 0x00005ECE, - 0x037, 0x00094000, - 0x038, 0x00005ECE, - 0x037, 0x00098000, - 0x038, 0x00005ECE, - 0x037, 0x0009C000, - 0x038, 0x00005ECE, - 0x037, 0x000A0000, - 0x038, 0x00005ECE, - 0x037, 0x000A4000, - 0x038, 0x00005ECE, - 0x037, 0x000A8000, - 0x038, 0x00005ECE, - 0x037, 0x000AC000, - 0x038, 0x00005ECE, - 0x037, 0x000B0000, - 0x038, 0x00005ECE, - 0x037, 0x000B4000, - 0x038, 0x00005ECE, - 0x037, 0x000B8000, - 0x038, 0x00005ECE, - 0x037, 0x000BC000, - 0x038, 0x00005ECE, - 0x037, 0x000C0000, - 0x038, 0x00005ECE, - 0x037, 0x000C4000, - 0x038, 0x00005ECE, - 0x037, 0x000C8000, - 0x038, 0x00005ECE, - 0x0EF, 0x00000000, - 0xB0000000, 0x00000000, - 0x0EF, 0x00000008, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0xA0000000, 0x00000000, - 0x03C, 0x0000007D, - 0x03C, 0x0000047D, - 0x03C, 0x0000087D, - 0x03C, 0x0000107D, - 0x03C, 0x0000147D, - 0x03C, 0x0000187D, - 0xB0000000, 0x00000000, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x03C, 0x0000027D, - 0x03C, 0x0000054A, - 0x03C, 0x00000821, - 0x03C, 0x0000127D, - 0x03C, 0x0000154A, - 0x03C, 0x00001821, - 0x03C, 0x0000227D, - 0x03C, 0x0000254A, - 0x03C, 0x00002821, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x03C, 0x0000027D, - 0x03C, 0x0000054A, - 0x03C, 0x00000821, - 0x03C, 0x0000127D, - 0x03C, 0x0000154A, - 0x03C, 0x00001821, - 0x03C, 0x0000227D, - 0x03C, 0x0000254A, - 0x03C, 0x00002821, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x03C, 0x0000027D, - 0x03C, 0x0000054A, - 0x03C, 0x00000821, - 0x03C, 0x0000127D, - 0x03C, 0x0000154A, - 0x03C, 0x00001821, - 0x03C, 0x0000227D, - 0x03C, 0x0000254A, - 0x03C, 0x00002821, - 0xA0000000, 0x00000000, - 0x03C, 0x0000037E, - 0x03C, 0x00000575, - 0x03C, 0x00000971, - 0x03C, 0x0000127E, - 0x03C, 0x00001575, - 0x03C, 0x00001871, - 0x03C, 0x0000217E, - 0x03C, 0x00002575, - 0x03C, 0x00002871, - 0xB0000000, 0x00000000, - 0x0EF, 0x00000000, - 0x061, 0x000C0D47, - 0x062, 0x0000133C, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x063, 0x000750E7, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x063, 0x000750E7, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x063, 0x000750E7, - 0xA0000000, 0x00000000, - 0x063, 0x0007D0E7, - 0xB0000000, 0x00000000, - 0x064, 0x00014FEC, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x065, 0x000920D0, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x065, 0x000920D0, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x065, 0x000920D0, - 0xA0000000, 0x00000000, - 0x065, 0x000933FF, - 0xB0000000, 0x00000000, - 0x066, 0x00000040, - 0x057, 0x00050000, - 0x056, 0x00051DF0, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x055, 0x00082061, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x055, 0x00082061, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x055, 0x00082061, - 0xA0000000, 0x00000000, - 0x055, 0x00082060, - 0xB0000000, 0x00000000, - 0x01C, 0x000739D2, - 0x01F, 0x0002295C, - 0x018, 0x0001B126, - 0xFFE, 0x00000000, - 0xFFE, 0x00000000, - 0xFFE, 0x00000000, - 0x018, 0x00013126, - 0x018, 0x00013124, - -}; - -void -odm_read_and_config_mp_8814a_radioa( - struct dm_struct * pDM_Odm -) -{ - u4Byte i = 0; - u1Byte cCond; - BOOLEAN bMatched = TRUE, bSkipped = FALSE; - u4Byte ArrayLen = sizeof(Array_MP_8814A_RadioA)/sizeof(u4Byte); - pu4Byte Array = Array_MP_8814A_RadioA; - - u4Byte v1 = 0, v2 = 0, pre_v1 = 0, pre_v2 = 0; - - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_8814A_RadioA\n"); - - while ((i + 1) < ArrayLen) { - v1 = Array[i]; - v2 = Array[i + 1]; - - if (v1 & (BIT31 | BIT30)) {/*positive & negative condition*/ - if (v1 & BIT31) {/* positive condition*/ - cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28); - if (cCond == COND_ENDIF) {/*end*/ - bMatched = TRUE; - bSkipped = FALSE; - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "ENDIF\n"); - } else if (cCond == COND_ELSE) { /*else*/ - bMatched = bSkipped?FALSE:TRUE; - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "ELSE\n"); - } else {/*if , else if*/ - pre_v1 = v1; - pre_v2 = v2; - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "IF or ELSE IF\n"); - } - } else if (v1 & BIT30) { /*negative condition*/ - if (bSkipped == FALSE) { - if (CheckPositive(pDM_Odm, pre_v1, pre_v2, v1, v2)) { - bMatched = TRUE; - bSkipped = TRUE; - } else { - bMatched = FALSE; - bSkipped = FALSE; - } - } else - bMatched = FALSE; - } - } else { - if (bMatched) - odm_ConfigRF_RadioA_8814A(pDM_Odm, v1, v2); - } - i = i + 2; - } -} - -u4Byte -ODM_GetVersion_MP_8814A_RadioA(void) -{ - return 85; -} - -/****************************************************************************** -* RadioB.TXT -******************************************************************************/ - -u4Byte Array_MP_8814A_RadioB[] = { - 0x018, 0x00013124, - 0x040, 0x00000C00, - 0x058, 0x00000F98, - 0x07F, 0x00068004, - 0x018, 0x00000006, - 0x80000001, 0x00000055, 0x40000000, 0x00000000, - 0x086, 0x000E335A, - 0x90000001, 0x000000aa, 0x40000000, 0x00000000, - 0x086, 0x000E335A, - 0xA0000000, 0x00000000, - 0x086, 0x000E4B58, - 0xB0000000, 0x00000000, - 0x80000004, 0x00550000, 0x40000000, 0x00000000, - 0x087, 0x00079F80, - 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x087, 0x00079F80, - 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, - 0x087, 0x00079F80, - 0x90000004, 0x00000000, 0x40000000, 0x00550000, - 0x087, 0x00079F80, - 0xA0000000, 0x00000000, - 0x087, 0x00049F80, - 0xB0000000, 0x00000000, - 0x0DF, 0x00000008, - 0x0EF, 0x00002000, - 0x80000001, 0x00000055, 0x40000000, 0x00000000, - 0x03B, 0x0003F19B, - 0x03B, 0x00037A5B, - 0x03B, 0x0002A433, - 0x03B, 0x00027BD3, - 0x03B, 0x0001F80B, - 0x03B, 0x00017BC3, - 0x90000001, 0x000000aa, 0x40000000, 0x00000000, - 0x03B, 0x0003F39B, - 0x03B, 0x00037A5B, - 0x03B, 0x0002A433, - 0x03B, 0x00027BD3, - 0x03B, 0x0001F80B, - 0x03B, 0x00017BC3, - 0xA0000000, 0x00000000, - 0x03B, 0x0003F258, - 0x03B, 0x00030A58, - 0x03B, 0x0002FA58, - 0x03B, 0x00022590, - 0x03B, 0x0001FA50, - 0x03B, 0x00010248, - 0x03B, 0x00008240, - 0xB0000000, 0x00000000, - 0x0EF, 0x00000100, - 0x80000002, 0x00005500, 0x40000000, 0x00000000, - 0x034, 0x0000A0D0, - 0x034, 0x000090CD, - 0x034, 0x000080CA, - 0x034, 0x0000704D, - 0x034, 0x0000604A, - 0x034, 0x00005047, - 0x034, 0x0000400A, - 0x034, 0x00003007, - 0x034, 0x00002004, - 0x034, 0x00001001, - 0x034, 0x00000001, - 0x90000002, 0x0000aa00, 0x40000000, 0x00000000, - 0x034, 0x0000A0D0, - 0x034, 0x000090CD, - 0x034, 0x000080CA, - 0x034, 0x0000704D, - 0x034, 0x0000604A, - 0x034, 0x00005047, - 0x034, 0x0000400A, - 0x034, 0x00003007, - 0x034, 0x00002004, - 0x034, 0x00001001, - 0x034, 0x00000001, - 0xA0000000, 0x00000000, - 0x034, 0x0000ADF6, - 0x034, 0x00009DF3, - 0x034, 0x00008DF0, - 0x034, 0x00007DED, - 0x034, 0x00006DEA, - 0x034, 0x00005CED, - 0x034, 0x00004CEA, - 0x034, 0x000034EA, - 0x034, 0x000024E7, - 0x034, 0x0000146A, - 0x034, 0x0000006B, - 0xB0000000, 0x00000000, - 0x80000002, 0x00005500, 0x40000000, 0x00000000, - 0x034, 0x0000A0D0, - 0x034, 0x000090CD, - 0x034, 0x000080CA, - 0x034, 0x0000704D, - 0x034, 0x0000604A, - 0x034, 0x00005047, - 0x034, 0x0000400A, - 0x034, 0x00003007, - 0x034, 0x00002004, - 0x034, 0x00001001, - 0x034, 0x00000001, - 0x90000002, 0x0000aa00, 0x40000000, 0x00000000, - 0x034, 0x0000A0D0, - 0x034, 0x000090CD, - 0x034, 0x000080CA, - 0x034, 0x0000704D, - 0x034, 0x0000604A, - 0x034, 0x00005047, - 0x034, 0x0000400A, - 0x034, 0x00003007, - 0x034, 0x00002004, - 0x034, 0x00001001, - 0x034, 0x00000001, - 0xA0000000, 0x00000000, - 0x034, 0x0008ADF6, - 0x034, 0x00089DF3, - 0x034, 0x00088DF0, - 0x034, 0x00087DED, - 0x034, 0x00086DEA, - 0x034, 0x00085CED, - 0x034, 0x00084CEA, - 0x034, 0x000834EA, - 0x034, 0x000824E7, - 0x034, 0x0008146A, - 0x034, 0x0008006B, - 0xB0000000, 0x00000000, - 0x0EF, 0x00000000, - 0x0EF, 0x000020A2, - 0x0DF, 0x00000080, - 0x035, 0x00000192, - 0x035, 0x00008192, - 0x035, 0x00010192, - 0x036, 0x00000024, - 0x036, 0x00008024, - 0x036, 0x00010024, - 0x036, 0x00018024, - 0x0EF, 0x00000000, - 0x051, 0x00000C21, - 0x052, 0x000006D9, - 0x053, 0x000FC649, - 0x054, 0x0000017E, - 0x018, 0x0001012A, - 0x081, 0x0007FC00, - 0x089, 0x00050110, - 0x08A, 0x00043E50, - 0x08B, 0x0002E180, - 0x08C, 0x00093C3C, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x085, 0x000F8000, - 0xA0000000, 0x00000000, - 0x085, 0x000F8000, - 0xB0000000, 0x00000000, - 0x80000001, 0x00000055, 0x40000000, 0x00000000, - 0x90000004, 0x00000000, 0x40000000, 0x00000000, - 0x08D, 0x000FFFF0, - 0x90000004, 0x00550000, 0x40000000, 0x00000000, - 0x08D, 0x000FFFF0, - 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x08D, 0x000FFFF0, - 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, - 0x08D, 0x000FFFF0, - 0x90000004, 0x00000000, 0x40000000, 0x00550000, - 0x08D, 0x000FFFF0, - 0xA0000000, 0x00000000, - 0x08D, 0x000FFFF0, - 0xB0000000, 0x00000000, - 0x0EF, 0x00001000, - 0x03A, 0x0000013C, - 0x03B, 0x00038023, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x03C, 0x00088000, - 0x90000004, 0x00550000, 0x40000000, 0x00000000, - 0x03C, 0x00084000, - 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x03C, 0x00000000, - 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, - 0x03C, 0x00088000, - 0x90000004, 0x00000000, 0x40000000, 0x00550000, - 0x03C, 0x00000000, - 0xA0000000, 0x00000000, - 0x03C, 0x00040000, - 0xB0000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00030023, - 0x03C, 0x00048000, - 0x03A, 0x0000013C, - 0x03B, 0x00028623, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00021633, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x0001C633, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00010293, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00009593, - 0x03C, 0x00000000, - 0x03A, 0x00000148, - 0x03B, 0x0000078B, - 0x03C, 0x00000000, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00078023, - 0x03C, 0x00020000, - 0x90000004, 0x00550000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00078023, - 0x03C, 0x00060000, - 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00078023, - 0x03C, 0x00000000, - 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00078023, - 0x03C, 0x00048000, - 0x90000004, 0x00000000, 0x40000000, 0x00550000, - 0x03A, 0x0000013C, - 0x03B, 0x00078023, - 0x03C, 0x00048000, - 0xA0000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00078023, - 0x03C, 0x00020000, - 0xB0000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00070023, - 0x03C, 0x00048000, - 0x03A, 0x0000013C, - 0x03B, 0x00068623, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00061633, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x0005C633, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00050293, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00049593, - 0x03C, 0x00000000, - 0x03A, 0x00000148, - 0x03B, 0x0004078B, - 0x03C, 0x00000000, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x000B8023, - 0x03C, 0x00048000, - 0x90000004, 0x00550000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x000B8023, - 0x03C, 0x00060000, - 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x000B8023, - 0x03C, 0x0004C000, - 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x000B8023, - 0x03C, 0x00044000, - 0x90000004, 0x00000000, 0x40000000, 0x00550000, - 0x03A, 0x0000013C, - 0x03B, 0x000B8023, - 0x03C, 0x0004C000, - 0xA0000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x000B8023, - 0x03C, 0x00020000, - 0xB0000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x000B0023, - 0x80000004, 0x00ff0000, 0x40000000, 0x00000000, - 0x03C, 0x00020000, - 0xA0000000, 0x00000000, - 0x03C, 0x00020000, - 0xB0000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x000A8623, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x000A1633, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x0009C633, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00090293, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00089593, - 0x03C, 0x00000000, - 0x03A, 0x00000148, - 0x03B, 0x0008078B, - 0x03C, 0x00000000, - 0x0EF, 0x00000000, - 0x0EF, 0x00000800, - 0x03B, 0x00000000, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x03A, 0x00000803, - 0xA0000000, 0x00000000, - 0x03A, 0x00000803, - 0xB0000000, 0x00000000, - 0x03B, 0x00040000, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x03A, 0x00001000, - 0x90000004, 0x00550000, 0x40000000, 0x00000000, - 0x03A, 0x00001001, - 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x03A, 0x00000803, - 0x90000004, 0x00000000, 0x40000000, 0x00550000, - 0x03A, 0x00001003, - 0xA0000000, 0x00000000, - 0x03A, 0x00001000, - 0xB0000000, 0x00000000, - 0x03B, 0x00080000, - 0x80000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x03A, 0x00000000, - 0x90000004, 0x00000000, 0x40000000, 0x00550000, - 0x03A, 0x00000000, - 0xA0000000, 0x00000000, - 0x03A, 0x00001802, - 0xB0000000, 0x00000000, - 0x0EF, 0x00000000, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x90000004, 0x00550000, 0x40000000, 0x00000000, - 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, - 0x90000004, 0x00000000, 0x40000000, 0x00550000, - 0xA0000000, 0x00000000, - 0x0EF, 0x00000008, - 0x03C, 0x00000000, - 0x03C, 0x00000400, - 0x03C, 0x00000800, - 0x0EF, 0x00000000, - 0xB0000000, 0x00000000, - 0x018, 0x00013124, - 0x0EF, 0x00000100, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x034, 0x0004A38C, - 0x034, 0x000491AD, - 0x034, 0x000481AA, - 0x034, 0x000471A7, - 0x034, 0x000460AA, - 0x034, 0x000450A7, - 0x034, 0x0004402C, - 0x034, 0x00043029, - 0x034, 0x0004200C, - 0x034, 0x00041009, - 0x034, 0x00040006, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x034, 0x0004A38C, - 0x034, 0x00049389, - 0x034, 0x0004816D, - 0x034, 0x0004716A, - 0x034, 0x0004606D, - 0x034, 0x0004506A, - 0x034, 0x0004402C, - 0x034, 0x00043029, - 0x034, 0x00042026, - 0x034, 0x00041009, - 0x034, 0x00040006, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x034, 0x0004A38B, - 0x034, 0x00049388, - 0x034, 0x0004818B, - 0x034, 0x00047188, - 0x034, 0x0004606D, - 0x034, 0x0004506A, - 0x034, 0x0004402C, - 0x034, 0x00043029, - 0x034, 0x00042026, - 0x034, 0x00041009, - 0x034, 0x00040006, - 0xA0000000, 0x00000000, - 0x034, 0x0004AFF4, - 0x034, 0x00049FF1, - 0x034, 0x00048FEE, - 0x034, 0x00047FEB, - 0x034, 0x00046FE8, - 0x034, 0x00045DEA, - 0x034, 0x00044CED, - 0x034, 0x00043CEA, - 0x034, 0x00042C6C, - 0x034, 0x00041C69, - 0x034, 0x00040C2B, - 0xB0000000, 0x00000000, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x034, 0x0002A38C, - 0x034, 0x000291AD, - 0x034, 0x000281AA, - 0x034, 0x000271A7, - 0x034, 0x000260AA, - 0x034, 0x000250A7, - 0x034, 0x0002402C, - 0x034, 0x00023029, - 0x034, 0x0002200C, - 0x034, 0x00021009, - 0x034, 0x00020006, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x034, 0x0002A3EE, - 0x034, 0x000293AC, - 0x034, 0x00028389, - 0x034, 0x0002716D, - 0x034, 0x0002616A, - 0x034, 0x0002506D, - 0x034, 0x0002406A, - 0x034, 0x0002302C, - 0x034, 0x00022029, - 0x034, 0x00021026, - 0x034, 0x00020023, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x034, 0x0002A3EF, - 0x034, 0x000293AD, - 0x034, 0x0002838A, - 0x034, 0x0002718C, - 0x034, 0x00026189, - 0x034, 0x0002506D, - 0x034, 0x0002406A, - 0x034, 0x0002302C, - 0x034, 0x00022029, - 0x034, 0x00021026, - 0x034, 0x00020023, - 0xA0000000, 0x00000000, - 0x034, 0x0002AFF4, - 0x034, 0x00029FF1, - 0x034, 0x00028FEE, - 0x034, 0x00027FEB, - 0x034, 0x00026FE8, - 0x034, 0x00025DEA, - 0x034, 0x00024CED, - 0x034, 0x00023CEA, - 0x034, 0x00022C6C, - 0x034, 0x00021C69, - 0x034, 0x00020C2B, - 0xB0000000, 0x00000000, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x034, 0x0000A38C, - 0x034, 0x000091AD, - 0x034, 0x000081AA, - 0x034, 0x000071A7, - 0x034, 0x000060AA, - 0x034, 0x000050A7, - 0x034, 0x0000402C, - 0x034, 0x00003029, - 0x034, 0x00002026, - 0x034, 0x00001009, - 0x034, 0x00000006, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x034, 0x0000A3EC, - 0x034, 0x000093AC, - 0x034, 0x000081EC, - 0x034, 0x0000716D, - 0x034, 0x0000616A, - 0x034, 0x0000506D, - 0x034, 0x0000404C, - 0x034, 0x0000302C, - 0x034, 0x00002029, - 0x034, 0x00001026, - 0x034, 0x00000023, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x034, 0x0000A3EF, - 0x034, 0x000093AD, - 0x034, 0x0000838A, - 0x034, 0x0000718C, - 0x034, 0x00006189, - 0x034, 0x0000506D, - 0x034, 0x0000406A, - 0x034, 0x0000302C, - 0x034, 0x00002029, - 0x034, 0x00001026, - 0x034, 0x00000023, - 0xA0000000, 0x00000000, - 0x034, 0x0000AFF4, - 0x034, 0x00009FF1, - 0x034, 0x00008FEE, - 0x034, 0x00007FEB, - 0x034, 0x00006FE8, - 0x034, 0x00005DEA, - 0x034, 0x00004CED, - 0x034, 0x00003CEA, - 0x034, 0x00002C6C, - 0x034, 0x00001C69, - 0x034, 0x00000C2B, - 0xB0000000, 0x00000000, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x034, 0x000CA38C, - 0x034, 0x000C91AD, - 0x034, 0x000C81AA, - 0x034, 0x000C71A7, - 0x034, 0x000C60AA, - 0x034, 0x000C50A7, - 0x034, 0x000C402C, - 0x034, 0x000C3029, - 0x034, 0x000C200C, - 0x034, 0x000C1009, - 0x034, 0x000C0006, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x034, 0x000CA38C, - 0x034, 0x000C9389, - 0x034, 0x000C816D, - 0x034, 0x000C716A, - 0x034, 0x000C606D, - 0x034, 0x000C506A, - 0x034, 0x000C402C, - 0x034, 0x000C3029, - 0x034, 0x000C2026, - 0x034, 0x000C1009, - 0x034, 0x000C0006, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x034, 0x000CA38B, - 0x034, 0x000C9388, - 0x034, 0x000C818B, - 0x034, 0x000C7188, - 0x034, 0x000C606D, - 0x034, 0x000C506A, - 0x034, 0x000C402C, - 0x034, 0x000C3029, - 0x034, 0x000C2026, - 0x034, 0x000C1009, - 0x034, 0x000C0006, - 0xA0000000, 0x00000000, - 0x034, 0x000CA794, - 0x034, 0x000C9791, - 0x034, 0x000C878E, - 0x034, 0x000C778B, - 0x034, 0x000C658D, - 0x034, 0x000C558A, - 0x034, 0x000C448D, - 0x034, 0x000C348A, - 0x034, 0x000C244C, - 0x034, 0x000C1449, - 0x034, 0x000C042B, - 0xB0000000, 0x00000000, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x034, 0x000AA38C, - 0x034, 0x000A91AD, - 0x034, 0x000A81AA, - 0x034, 0x000A71A7, - 0x034, 0x000A60AA, - 0x034, 0x000A50A7, - 0x034, 0x000A402C, - 0x034, 0x000A3029, - 0x034, 0x000A200C, - 0x034, 0x000A1009, - 0x034, 0x000A0006, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x034, 0x000AA3EE, - 0x034, 0x000A93AC, - 0x034, 0x000A8389, - 0x034, 0x000A716D, - 0x034, 0x000A616A, - 0x034, 0x000A506D, - 0x034, 0x000A406A, - 0x034, 0x000A302C, - 0x034, 0x000A2029, - 0x034, 0x000A1026, - 0x034, 0x000A0023, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x034, 0x000AA3EF, - 0x034, 0x000A93AD, - 0x034, 0x000A838A, - 0x034, 0x000A718C, - 0x034, 0x000A6189, - 0x034, 0x000A506D, - 0x034, 0x000A406A, - 0x034, 0x000A302C, - 0x034, 0x000A2029, - 0x034, 0x000A1026, - 0x034, 0x000A0023, - 0xA0000000, 0x00000000, - 0x034, 0x000AA794, - 0x034, 0x000A9791, - 0x034, 0x000A878E, - 0x034, 0x000A778B, - 0x034, 0x000A658D, - 0x034, 0x000A558A, - 0x034, 0x000A448D, - 0x034, 0x000A348A, - 0x034, 0x000A244C, - 0x034, 0x000A1449, - 0x034, 0x000A042B, - 0xB0000000, 0x00000000, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x034, 0x0008A38C, - 0x034, 0x000891AD, - 0x034, 0x000881AA, - 0x034, 0x000871A7, - 0x034, 0x000860AA, - 0x034, 0x000850A7, - 0x034, 0x0008402C, - 0x034, 0x00083029, - 0x034, 0x00082026, - 0x034, 0x00081009, - 0x034, 0x00080006, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x034, 0x0008A3EC, - 0x034, 0x000893AC, - 0x034, 0x000881EC, - 0x034, 0x0008716D, - 0x034, 0x0008616A, - 0x034, 0x0008506D, - 0x034, 0x0008404C, - 0x034, 0x0008302C, - 0x034, 0x00082029, - 0x034, 0x00081026, - 0x034, 0x00080023, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x034, 0x0008A3EF, - 0x034, 0x000893AD, - 0x034, 0x0008838A, - 0x034, 0x0008718C, - 0x034, 0x00086189, - 0x034, 0x0008506D, - 0x034, 0x0008406A, - 0x034, 0x0008302C, - 0x034, 0x00082029, - 0x034, 0x00081026, - 0x034, 0x00080023, - 0xA0000000, 0x00000000, - 0x034, 0x0008A794, - 0x034, 0x00089791, - 0x034, 0x0008878E, - 0x034, 0x0008778B, - 0x034, 0x0008658D, - 0x034, 0x0008558A, - 0x034, 0x0008448D, - 0x034, 0x0008348A, - 0x034, 0x0008244C, - 0x034, 0x00081449, - 0x034, 0x0008042B, - 0xB0000000, 0x00000000, - 0x0EF, 0x00000000, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x0DF, 0x00000001, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x0DF, 0x00000001, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x0DF, 0x00000001, - 0xA0000000, 0x00000000, - 0x0DF, 0x00000000, - 0xB0000000, 0x00000000, - 0x018, 0x0001712A, - 0x0EF, 0x00000040, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x035, 0x000006CC, - 0x035, 0x000086CC, - 0x035, 0x000106CC, - 0x035, 0x000206CC, - 0x035, 0x000286CC, - 0x035, 0x000306CC, - 0x035, 0x000406CC, - 0x035, 0x000486CC, - 0x035, 0x000506CC, - 0x035, 0x000806CC, - 0x035, 0x000886CC, - 0x035, 0x000906CC, - 0x035, 0x000A06CC, - 0x035, 0x000A86CC, - 0x035, 0x000B06CC, - 0x035, 0x000C06CC, - 0x035, 0x000C86CC, - 0x035, 0x000D06CC, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x035, 0x000006CC, - 0x035, 0x000086CC, - 0x035, 0x000106CC, - 0x035, 0x000206CC, - 0x035, 0x000286CC, - 0x035, 0x000306CC, - 0x035, 0x000406CC, - 0x035, 0x000486CC, - 0x035, 0x000506CC, - 0x035, 0x000806CC, - 0x035, 0x000886CC, - 0x035, 0x000906CC, - 0x035, 0x000A06CC, - 0x035, 0x000A86CC, - 0x035, 0x000B06CC, - 0x035, 0x000C06CC, - 0x035, 0x000C86CC, - 0x035, 0x000D06CC, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x035, 0x000006CC, - 0x035, 0x000086CC, - 0x035, 0x000106CC, - 0x035, 0x000206CC, - 0x035, 0x000286CC, - 0x035, 0x000306CC, - 0x035, 0x000406CC, - 0x035, 0x000486CC, - 0x035, 0x000506CC, - 0x035, 0x000806CC, - 0x035, 0x000886CC, - 0x035, 0x000906CC, - 0x035, 0x000A06CC, - 0x035, 0x000A86CC, - 0x035, 0x000B06CC, - 0x035, 0x000C06CC, - 0x035, 0x000C86CC, - 0x035, 0x000D06CC, - 0xA0000000, 0x00000000, - 0x035, 0x00000484, - 0x035, 0x00008484, - 0x035, 0x00010484, - 0x035, 0x00020584, - 0x035, 0x00028584, - 0x035, 0x00030584, - 0x035, 0x00040584, - 0x035, 0x00048584, - 0x035, 0x00050584, - 0x035, 0x000805FB, - 0x035, 0x000885FB, - 0x035, 0x000905FB, - 0x035, 0x000A05FB, - 0x035, 0x000A85FB, - 0x035, 0x000B05FB, - 0x035, 0x000C05FB, - 0x035, 0x000C85FB, - 0x035, 0x000D05FB, - 0xB0000000, 0x00000000, - 0x0EF, 0x00000000, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x0DF, 0x00000001, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x0DF, 0x00000001, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x0DF, 0x00000001, - 0xA0000000, 0x00000000, - 0x0DF, 0x00000000, - 0xB0000000, 0x00000000, - 0x018, 0x0001712A, - 0x0EF, 0x00000010, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x036, 0x00000473, - 0x036, 0x00008473, - 0x036, 0x00010473, - 0x036, 0x00020473, - 0x036, 0x00028473, - 0x036, 0x00030473, - 0x036, 0x00040473, - 0x036, 0x00048473, - 0x036, 0x00050473, - 0x036, 0x00080473, - 0x036, 0x00088473, - 0x036, 0x00090473, - 0x036, 0x000A0473, - 0x036, 0x000A8473, - 0x036, 0x000B0473, - 0x036, 0x000C0473, - 0x036, 0x000C8473, - 0x036, 0x000D0473, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x036, 0x00000475, - 0x036, 0x00008475, - 0x036, 0x00010475, - 0x036, 0x00020475, - 0x036, 0x00028475, - 0x036, 0x00030475, - 0x036, 0x00040475, - 0x036, 0x00048475, - 0x036, 0x00050475, - 0x036, 0x00080475, - 0x036, 0x00088475, - 0x036, 0x00090475, - 0x036, 0x000A0475, - 0x036, 0x000A8475, - 0x036, 0x000B0475, - 0x036, 0x000C0475, - 0x036, 0x000C8475, - 0x036, 0x000D0475, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x036, 0x00000475, - 0x036, 0x00008475, - 0x036, 0x00010475, - 0x036, 0x00020475, - 0x036, 0x00028475, - 0x036, 0x00030475, - 0x036, 0x00040475, - 0x036, 0x00048475, - 0x036, 0x00050475, - 0x036, 0x00080475, - 0x036, 0x00088475, - 0x036, 0x00090475, - 0x036, 0x000A0475, - 0x036, 0x000A8475, - 0x036, 0x000B0475, - 0x036, 0x000C0475, - 0x036, 0x000C8475, - 0x036, 0x000D0475, - 0xA0000000, 0x00000000, - 0x036, 0x00000474, - 0x036, 0x00008474, - 0x036, 0x00010474, - 0x036, 0x00020474, - 0x036, 0x00028474, - 0x036, 0x00030474, - 0x036, 0x00040474, - 0x036, 0x00048474, - 0x036, 0x00050474, - 0x036, 0x00080474, - 0x036, 0x00088474, - 0x036, 0x00090474, - 0x036, 0x000A0474, - 0x036, 0x000A8474, - 0x036, 0x000B0474, - 0x036, 0x000C0474, - 0x036, 0x000C8474, - 0x036, 0x000D0474, - 0xB0000000, 0x00000000, - 0x0EF, 0x00000000, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0xA0000000, 0x00000000, - 0x0EF, 0x00000004, - 0x037, 0x00000000, - 0x038, 0x0000514E, - 0x037, 0x00004000, - 0x038, 0x0000514E, - 0x037, 0x00008000, - 0x038, 0x0000514E, - 0x037, 0x00010000, - 0x038, 0x0000514E, - 0x037, 0x00014000, - 0x038, 0x0000514E, - 0x037, 0x00018000, - 0x038, 0x0000514E, - 0x037, 0x0001C000, - 0x038, 0x0000514E, - 0x037, 0x00020000, - 0x038, 0x0000514E, - 0x037, 0x00024000, - 0x038, 0x0000514E, - 0x037, 0x00028000, - 0x038, 0x0000514E, - 0x037, 0x0002C000, - 0x038, 0x0000714E, - 0x037, 0x00030000, - 0x038, 0x0000514E, - 0x037, 0x00034000, - 0x038, 0x0000514E, - 0x037, 0x00038000, - 0x038, 0x0000514E, - 0x037, 0x0003C000, - 0x038, 0x0000514E, - 0x037, 0x00040000, - 0x038, 0x0000514E, - 0x037, 0x00044000, - 0x038, 0x0000514E, - 0x037, 0x00048000, - 0x038, 0x0000514E, - 0x037, 0x00080000, - 0x038, 0x00005ECE, - 0x037, 0x00084000, - 0x038, 0x00005ECE, - 0x037, 0x00088000, - 0x038, 0x00005ECE, - 0x037, 0x00090000, - 0x038, 0x00005ECE, - 0x037, 0x00094000, - 0x038, 0x00005ECE, - 0x037, 0x00098000, - 0x038, 0x00005ECE, - 0x037, 0x0009C000, - 0x038, 0x00005ECE, - 0x037, 0x000A0000, - 0x038, 0x00005ECE, - 0x037, 0x000A4000, - 0x038, 0x00005ECE, - 0x037, 0x000A8000, - 0x038, 0x00005ECE, - 0x037, 0x000AC000, - 0x038, 0x00005ECE, - 0x037, 0x000B0000, - 0x038, 0x00005ECE, - 0x037, 0x000B4000, - 0x038, 0x00005ECE, - 0x037, 0x000B8000, - 0x038, 0x00005ECE, - 0x037, 0x000BC000, - 0x038, 0x00005ECE, - 0x037, 0x000C0000, - 0x038, 0x00005ECE, - 0x037, 0x000C4000, - 0x038, 0x00005ECE, - 0x037, 0x000C8000, - 0x038, 0x00005ECE, - 0x0EF, 0x00000000, - 0xB0000000, 0x00000000, - 0x0EF, 0x00000008, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0xA0000000, 0x00000000, - 0x03C, 0x0000007D, - 0x03C, 0x0000047D, - 0x03C, 0x0000087D, - 0x03C, 0x0000107D, - 0x03C, 0x0000147D, - 0x03C, 0x0000187D, - 0xB0000000, 0x00000000, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x03C, 0x0000027E, - 0x03C, 0x00000546, - 0x03C, 0x00000821, - 0x03C, 0x0000127E, - 0x03C, 0x00001546, - 0x03C, 0x00001821, - 0x03C, 0x0000227E, - 0x03C, 0x00002546, - 0x03C, 0x00002821, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x03C, 0x0000027E, - 0x03C, 0x00000546, - 0x03C, 0x00000821, - 0x03C, 0x0000127E, - 0x03C, 0x00001546, - 0x03C, 0x00001821, - 0x03C, 0x0000227E, - 0x03C, 0x00002546, - 0x03C, 0x00002821, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x03C, 0x0000027E, - 0x03C, 0x00000546, - 0x03C, 0x00000821, - 0x03C, 0x0000127E, - 0x03C, 0x00001546, - 0x03C, 0x00001821, - 0x03C, 0x0000227E, - 0x03C, 0x00002546, - 0x03C, 0x00002821, - 0xA0000000, 0x00000000, - 0x03C, 0x0000037E, - 0x03C, 0x00000575, - 0x03C, 0x00000971, - 0x03C, 0x0000127E, - 0x03C, 0x00001575, - 0x03C, 0x00001871, - 0x03C, 0x0000217E, - 0x03C, 0x00002575, - 0x03C, 0x00002871, - 0xB0000000, 0x00000000, - 0x0EF, 0x00000000, - 0x061, 0x000C0D47, - 0x062, 0x0000133C, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x063, 0x000750E7, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x063, 0x000750E7, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x063, 0x000750E7, - 0xA0000000, 0x00000000, - 0x063, 0x0007D0E7, - 0xB0000000, 0x00000000, - 0x064, 0x00014FEC, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x065, 0x000920D0, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x065, 0x000920D0, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x065, 0x000920D0, - 0xA0000000, 0x00000000, - 0x065, 0x000923FF, - 0xB0000000, 0x00000000, - 0x066, 0x00000040, - 0x057, 0x00050000, - 0x056, 0x00051DF0, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0xA0000000, 0x00000000, - 0x055, 0x00082060, - 0xB0000000, 0x00000000, - -}; - -void -odm_read_and_config_mp_8814a_radiob( - struct dm_struct * pDM_Odm -) -{ - u4Byte i = 0; - u1Byte cCond; - BOOLEAN bMatched = TRUE, bSkipped = FALSE; - u4Byte ArrayLen = sizeof(Array_MP_8814A_RadioB)/sizeof(u4Byte); - pu4Byte Array = Array_MP_8814A_RadioB; - - u4Byte v1 = 0, v2 = 0, pre_v1 = 0, pre_v2 = 0; - - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_8814A_RadioB\n"); - - while ((i + 1) < ArrayLen) { - v1 = Array[i]; - v2 = Array[i + 1]; - - if (v1 & (BIT31 | BIT30)) {/*positive & negative condition*/ - if (v1 & BIT31) {/* positive condition*/ - cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28); - if (cCond == COND_ENDIF) {/*end*/ - bMatched = TRUE; - bSkipped = FALSE; - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "ENDIF\n"); - } else if (cCond == COND_ELSE) { /*else*/ - bMatched = bSkipped?FALSE:TRUE; - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "ELSE\n"); - } else {/*if , else if*/ - pre_v1 = v1; - pre_v2 = v2; - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "IF or ELSE IF\n"); - } - } else if (v1 & BIT30) { /*negative condition*/ - if (bSkipped == FALSE) { - if (CheckPositive(pDM_Odm, pre_v1, pre_v2, v1, v2)) { - bMatched = TRUE; - bSkipped = TRUE; - } else { - bMatched = FALSE; - bSkipped = FALSE; - } - } else - bMatched = FALSE; - } - } else { - if (bMatched) - odm_ConfigRF_RadioB_8814A(pDM_Odm, v1, v2); - } - i = i + 2; - } -} - -u4Byte -ODM_GetVersion_MP_8814A_RadioB(void) -{ - return 85; -} - -/****************************************************************************** -* RadioC.TXT -******************************************************************************/ - -u4Byte Array_MP_8814A_RadioC[] = { - 0x018, 0x00013124, - 0x040, 0x00000C00, - 0x058, 0x00000F98, - 0x07F, 0x00068004, - 0x018, 0x00000006, - 0x80000001, 0x00000055, 0x40000000, 0x00000000, - 0x086, 0x000E335A, - 0x087, 0x00079F80, - 0x90000001, 0x000000aa, 0x40000000, 0x00000000, - 0x086, 0x000E335A, - 0x087, 0x00079F80, - 0xA0000000, 0x00000000, - 0x086, 0x000E4B58, - 0x087, 0x00049F80, - 0xB0000000, 0x00000000, - 0x0DF, 0x00000008, - 0x0EF, 0x00002000, - 0x80000001, 0x00000055, 0x40000000, 0x00000000, - 0x03B, 0x0003F19B, - 0x03B, 0x00037A5B, - 0x03B, 0x0002A433, - 0x03B, 0x00027BD3, - 0x03B, 0x0001F80B, - 0x03B, 0x00017823, - 0x90000001, 0x000000aa, 0x40000000, 0x00000000, - 0x03B, 0x0003F19B, - 0x03B, 0x00037A5B, - 0x03B, 0x0002A433, - 0x03B, 0x00027BD3, - 0x03B, 0x0001F80B, - 0x03B, 0x00017823, - 0xA0000000, 0x00000000, - 0x03B, 0x0003F258, - 0x03B, 0x00030A58, - 0x03B, 0x0002FA58, - 0x03B, 0x00022590, - 0x03B, 0x0001FA50, - 0x03B, 0x00010248, - 0x03B, 0x00008240, - 0xB0000000, 0x00000000, - 0x0EF, 0x00000100, - 0x80000002, 0x00005500, 0x40000000, 0x00000000, - 0x034, 0x0000A0D0, - 0x034, 0x000090CD, - 0x034, 0x000080CA, - 0x034, 0x0000704D, - 0x034, 0x0000604A, - 0x034, 0x00005047, - 0x034, 0x0000400A, - 0x034, 0x00003007, - 0x034, 0x00002004, - 0x034, 0x00001001, - 0x034, 0x00000001, - 0x90000002, 0x0000aa00, 0x40000000, 0x00000000, - 0x034, 0x0000A0D0, - 0x034, 0x000090CD, - 0x034, 0x000080CA, - 0x034, 0x0000704D, - 0x034, 0x0000604A, - 0x034, 0x00005047, - 0x034, 0x0000400A, - 0x034, 0x00003007, - 0x034, 0x00002004, - 0x034, 0x00001001, - 0x034, 0x00000001, - 0xA0000000, 0x00000000, - 0x034, 0x0000ADF6, - 0x034, 0x00009DF3, - 0x034, 0x00008DF0, - 0x034, 0x00007DED, - 0x034, 0x00006DEA, - 0x034, 0x00005CED, - 0x034, 0x00004CEA, - 0x034, 0x000034EA, - 0x034, 0x000024E7, - 0x034, 0x0000146A, - 0x034, 0x0000006B, - 0xB0000000, 0x00000000, - 0x80000002, 0x00005500, 0x40000000, 0x00000000, - 0x034, 0x0000A0D0, - 0x034, 0x000090CD, - 0x034, 0x000080CA, - 0x034, 0x0000704D, - 0x034, 0x0000604A, - 0x034, 0x00005047, - 0x034, 0x0000400A, - 0x034, 0x00003007, - 0x034, 0x00002004, - 0x034, 0x00001001, - 0x034, 0x00000001, - 0x90000002, 0x0000aa00, 0x40000000, 0x00000000, - 0x034, 0x0000A0D0, - 0x034, 0x000090CD, - 0x034, 0x000080CA, - 0x034, 0x0000704D, - 0x034, 0x0000604A, - 0x034, 0x00005047, - 0x034, 0x0000400A, - 0x034, 0x00003007, - 0x034, 0x00002004, - 0x034, 0x00001001, - 0x034, 0x00000001, - 0xA0000000, 0x00000000, - 0x034, 0x0008ADF6, - 0x034, 0x00089DF3, - 0x034, 0x00088DF0, - 0x034, 0x00087DED, - 0x034, 0x00086DEA, - 0x034, 0x00085CED, - 0x034, 0x00084CEA, - 0x034, 0x000834EA, - 0x034, 0x000824E7, - 0x034, 0x0008146A, - 0x034, 0x0008006B, - 0xB0000000, 0x00000000, - 0x0EF, 0x00000000, - 0x0EF, 0x000020A2, - 0x0DF, 0x00000080, - 0x035, 0x00000192, - 0x035, 0x00008192, - 0x035, 0x00010192, - 0x036, 0x00000024, - 0x036, 0x00008024, - 0x036, 0x00010024, - 0x036, 0x00018024, - 0x0EF, 0x00000000, - 0x051, 0x00000C21, - 0x052, 0x000006D9, - 0x053, 0x000FC649, - 0x054, 0x0000017E, - 0x018, 0x0001012A, - 0x081, 0x0007FC00, - 0x089, 0x00050110, - 0x08A, 0x00043E50, - 0x08B, 0x0002E180, - 0x08C, 0x00093C3C, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x085, 0x000F8000, - 0xA0000000, 0x00000000, - 0x085, 0x000F8000, - 0xB0000000, 0x00000000, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x08D, 0x000FFFF0, - 0x90000004, 0x00550000, 0x40000000, 0x00000000, - 0x08D, 0x000FFFF0, - 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x08D, 0x000FFFF0, - 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, - 0x08D, 0x000FFFF0, - 0x90000004, 0x00000000, 0x40000000, 0x00550000, - 0x08D, 0x000FFFF0, - 0xA0000000, 0x00000000, - 0x08D, 0x000FFFF0, - 0xB0000000, 0x00000000, - 0x0EF, 0x00001000, - 0x03A, 0x0000013C, - 0x03B, 0x00038023, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x03C, 0x0006C000, - 0x90000004, 0x00550000, 0x40000000, 0x00000000, - 0x03C, 0x000D4000, - 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x03C, 0x00080000, - 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, - 0x03C, 0x00088000, - 0x90000004, 0x00000000, 0x40000000, 0x00550000, - 0x03C, 0x00000000, - 0xA0000000, 0x00000000, - 0x03C, 0x000A0000, - 0xB0000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00030023, - 0x03C, 0x00048000, - 0x03A, 0x0000013C, - 0x03B, 0x00028623, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00021633, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x0001C633, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00010293, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00009593, - 0x03C, 0x00000000, - 0x03A, 0x00000148, - 0x03B, 0x0000078B, - 0x03C, 0x00000000, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00078023, - 0x03C, 0x0004C000, - 0x90000004, 0x00550000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00078023, - 0x03C, 0x00084000, - 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00078023, - 0x03C, 0x00000000, - 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00078023, - 0x03C, 0x00080000, - 0x90000004, 0x00000000, 0x40000000, 0x00550000, - 0x03A, 0x0000013C, - 0x03B, 0x00078023, - 0x03C, 0x00000000, - 0xA0000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00078023, - 0x03C, 0x00028000, - 0xB0000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00070023, - 0x03C, 0x00048000, - 0x03A, 0x0000013C, - 0x03B, 0x00068623, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00061633, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x0005C633, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00050293, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00049593, - 0x03C, 0x00000000, - 0x03A, 0x00000148, - 0x03B, 0x0004078B, - 0x03C, 0x00000000, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x000B8023, - 0x03C, 0x00024000, - 0x90000004, 0x00550000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x000B8023, - 0x03C, 0x00060000, - 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x000B8023, - 0x03C, 0x00080000, - 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x000B8023, - 0x03C, 0x00024000, - 0x90000004, 0x00000000, 0x40000000, 0x00550000, - 0x03A, 0x0000013C, - 0x03B, 0x000B8023, - 0x03C, 0x00000000, - 0xA0000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x000B8023, - 0x03C, 0x00020000, - 0xB0000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x000B0023, - 0x80000004, 0x00ff0000, 0x40000000, 0x00000000, - 0x03C, 0x00020000, - 0xA0000000, 0x00000000, - 0x03C, 0x00020000, - 0xB0000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x000A8623, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x000A1633, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x0009C633, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00090293, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00089593, - 0x03C, 0x00000000, - 0x03A, 0x00000148, - 0x03B, 0x0008078B, - 0x03C, 0x00000000, - 0x0EF, 0x00000000, - 0x0EF, 0x00000800, - 0x03B, 0x00000000, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x03A, 0x00000803, - 0x90000004, 0x00550000, 0x40000000, 0x00000000, - 0x03A, 0x00000000, - 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x03A, 0x00001803, - 0x90000004, 0x00000000, 0x40000000, 0x00550000, - 0x03A, 0x00001803, - 0xA0000000, 0x00000000, - 0x03A, 0x00000803, - 0xB0000000, 0x00000000, - 0x03B, 0x00040000, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x03A, 0x00001000, - 0x90000004, 0x00550000, 0x40000000, 0x00000000, - 0x03A, 0x00000800, - 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x03A, 0x00000803, - 0x90000004, 0x00000000, 0x40000000, 0x00550000, - 0x03A, 0x00000803, - 0xA0000000, 0x00000000, - 0x03A, 0x00001000, - 0xB0000000, 0x00000000, - 0x03B, 0x00080000, - 0x80000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x03A, 0x00000000, - 0x90000004, 0x00000000, 0x40000000, 0x00550000, - 0x03A, 0x00000000, - 0xA0000000, 0x00000000, - 0x03A, 0x00001802, - 0xB0000000, 0x00000000, - 0x0EF, 0x00000000, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x90000004, 0x00550000, 0x40000000, 0x00000000, - 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, - 0x90000004, 0x00000000, 0x40000000, 0x00550000, - 0xA0000000, 0x00000000, - 0x0EF, 0x00000008, - 0x03C, 0x00000000, - 0x03C, 0x00000400, - 0x03C, 0x00000800, - 0x0EF, 0x00000000, - 0xB0000000, 0x00000000, - 0x80000001, 0x00000055, 0x40000000, 0x00000000, - 0x018, 0x00013124, - 0x90000001, 0x000000aa, 0x40000000, 0x00000000, - 0x018, 0x00013124, - 0xA0000000, 0x00000000, - 0x018, 0x00013124, - 0xB0000000, 0x00000000, - 0x0EF, 0x00000100, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x034, 0x0004A38C, - 0x034, 0x000491AD, - 0x034, 0x000481AA, - 0x034, 0x000471A7, - 0x034, 0x000460AA, - 0x034, 0x000450A7, - 0x034, 0x0004402C, - 0x034, 0x00043029, - 0x034, 0x0004200C, - 0x034, 0x00041009, - 0x034, 0x00040006, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x034, 0x0004A3EF, - 0x034, 0x000493AD, - 0x034, 0x0004838A, - 0x034, 0x0004718C, - 0x034, 0x00046189, - 0x034, 0x0004506D, - 0x034, 0x0004404C, - 0x034, 0x0004302C, - 0x034, 0x00042029, - 0x034, 0x00041026, - 0x034, 0x00040023, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x034, 0x0004A3EF, - 0x034, 0x000493AD, - 0x034, 0x0004838A, - 0x034, 0x0004718C, - 0x034, 0x00046189, - 0x034, 0x0004506D, - 0x034, 0x0004404C, - 0x034, 0x0004302C, - 0x034, 0x00042029, - 0x034, 0x00041026, - 0x034, 0x00040023, - 0xA0000000, 0x00000000, - 0x034, 0x0004AFF4, - 0x034, 0x00049FF1, - 0x034, 0x00048FEE, - 0x034, 0x00047FEB, - 0x034, 0x00046FE8, - 0x034, 0x00045DEA, - 0x034, 0x00044CED, - 0x034, 0x00043CEA, - 0x034, 0x00042C6C, - 0x034, 0x00041C69, - 0x034, 0x00040C2B, - 0xB0000000, 0x00000000, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x034, 0x0002A3EC, - 0x034, 0x0002938C, - 0x034, 0x000281AD, - 0x034, 0x000271AA, - 0x034, 0x000261A7, - 0x034, 0x000250AA, - 0x034, 0x000240A7, - 0x034, 0x0002302C, - 0x034, 0x00022029, - 0x034, 0x0002100C, - 0x034, 0x00020009, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x034, 0x0002A3EC, - 0x034, 0x0002936D, - 0x034, 0x0002836A, - 0x034, 0x0002716D, - 0x034, 0x0002616A, - 0x034, 0x0002506D, - 0x034, 0x0002406A, - 0x034, 0x0002302C, - 0x034, 0x00022029, - 0x034, 0x00021026, - 0x034, 0x00020023, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x034, 0x0002A3EC, - 0x034, 0x000293AC, - 0x034, 0x0002838A, - 0x034, 0x0002718C, - 0x034, 0x00026189, - 0x034, 0x0002506D, - 0x034, 0x0002406A, - 0x034, 0x0002302C, - 0x034, 0x00022029, - 0x034, 0x00021026, - 0x034, 0x00020023, - 0xA0000000, 0x00000000, - 0x034, 0x0002AFF4, - 0x034, 0x00029FF1, - 0x034, 0x00028FEE, - 0x034, 0x00027FEB, - 0x034, 0x00026FE8, - 0x034, 0x00025DEA, - 0x034, 0x00024CED, - 0x034, 0x00023CEA, - 0x034, 0x00022C6C, - 0x034, 0x00021C69, - 0x034, 0x00020C2B, - 0xB0000000, 0x00000000, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x034, 0x0000A38C, - 0x034, 0x000091AD, - 0x034, 0x000081AA, - 0x034, 0x000071A7, - 0x034, 0x000060AA, - 0x034, 0x000050A7, - 0x034, 0x0000402C, - 0x034, 0x00003029, - 0x034, 0x0000200C, - 0x034, 0x00001009, - 0x034, 0x00000006, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x034, 0x0000A3EE, - 0x034, 0x000093AB, - 0x034, 0x00008389, - 0x034, 0x0000718C, - 0x034, 0x00006189, - 0x034, 0x0000506D, - 0x034, 0x0000406A, - 0x034, 0x0000302C, - 0x034, 0x00002029, - 0x034, 0x00001026, - 0x034, 0x00000023, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x034, 0x0000A3EE, - 0x034, 0x000093AB, - 0x034, 0x00008389, - 0x034, 0x0000718C, - 0x034, 0x00006189, - 0x034, 0x0000506D, - 0x034, 0x0000406A, - 0x034, 0x0000302C, - 0x034, 0x00002029, - 0x034, 0x00001026, - 0x034, 0x00000023, - 0xA0000000, 0x00000000, - 0x034, 0x0000AFF4, - 0x034, 0x00009FF1, - 0x034, 0x00008FEE, - 0x034, 0x00007FEB, - 0x034, 0x00006FE8, - 0x034, 0x00005DEA, - 0x034, 0x00004CED, - 0x034, 0x00003CEA, - 0x034, 0x00002C6C, - 0x034, 0x00001C69, - 0x034, 0x00000C2B, - 0xB0000000, 0x00000000, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x034, 0x000CA38C, - 0x034, 0x000C91AD, - 0x034, 0x000C81AA, - 0x034, 0x000C71A7, - 0x034, 0x000C60AA, - 0x034, 0x000C50A7, - 0x034, 0x000C402C, - 0x034, 0x000C3029, - 0x034, 0x000C200C, - 0x034, 0x000C1009, - 0x034, 0x000C0006, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x034, 0x000CA3EF, - 0x034, 0x000C93AD, - 0x034, 0x000C838A, - 0x034, 0x000C718C, - 0x034, 0x000C6189, - 0x034, 0x000C506D, - 0x034, 0x000C404C, - 0x034, 0x000C302C, - 0x034, 0x000C2029, - 0x034, 0x000C1026, - 0x034, 0x000C0023, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x034, 0x000CA3EF, - 0x034, 0x000C93AD, - 0x034, 0x000C838A, - 0x034, 0x000C718C, - 0x034, 0x000C6189, - 0x034, 0x000C506D, - 0x034, 0x000C404C, - 0x034, 0x000C302C, - 0x034, 0x000C2029, - 0x034, 0x000C1026, - 0x034, 0x000C0023, - 0xA0000000, 0x00000000, - 0x034, 0x000CA794, - 0x034, 0x000C9791, - 0x034, 0x000C878E, - 0x034, 0x000C778B, - 0x034, 0x000C658D, - 0x034, 0x000C558A, - 0x034, 0x000C448D, - 0x034, 0x000C348A, - 0x034, 0x000C244C, - 0x034, 0x000C1449, - 0x034, 0x000C042B, - 0xB0000000, 0x00000000, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x034, 0x000AA3EC, - 0x034, 0x000A938C, - 0x034, 0x000A81AD, - 0x034, 0x000A71AA, - 0x034, 0x000A61A7, - 0x034, 0x000A50AA, - 0x034, 0x000A40A7, - 0x034, 0x000A302C, - 0x034, 0x000A2029, - 0x034, 0x000A100C, - 0x034, 0x000A0009, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x034, 0x000AA3EC, - 0x034, 0x000A936D, - 0x034, 0x000A836A, - 0x034, 0x000A716D, - 0x034, 0x000A616A, - 0x034, 0x000A506D, - 0x034, 0x000A406A, - 0x034, 0x000A302C, - 0x034, 0x000A2029, - 0x034, 0x000A1026, - 0x034, 0x000A0023, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x034, 0x000AA3EC, - 0x034, 0x000A93AC, - 0x034, 0x000A838A, - 0x034, 0x000A718C, - 0x034, 0x000A6189, - 0x034, 0x000A506D, - 0x034, 0x000A406A, - 0x034, 0x000A302C, - 0x034, 0x000A2029, - 0x034, 0x000A1026, - 0x034, 0x000A0023, - 0xA0000000, 0x00000000, - 0x034, 0x000AA794, - 0x034, 0x000A9791, - 0x034, 0x000A878E, - 0x034, 0x000A778B, - 0x034, 0x000A658D, - 0x034, 0x000A558A, - 0x034, 0x000A448D, - 0x034, 0x000A348A, - 0x034, 0x000A244C, - 0x034, 0x000A1449, - 0x034, 0x000A042B, - 0xB0000000, 0x00000000, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x034, 0x0008A38C, - 0x034, 0x000891AD, - 0x034, 0x000881AA, - 0x034, 0x000871A7, - 0x034, 0x000860AA, - 0x034, 0x000850A7, - 0x034, 0x0008402C, - 0x034, 0x00083029, - 0x034, 0x0008200C, - 0x034, 0x00081009, - 0x034, 0x00000006, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x034, 0x0008A3EE, - 0x034, 0x000893AB, - 0x034, 0x00088389, - 0x034, 0x0008718C, - 0x034, 0x00086189, - 0x034, 0x0008506D, - 0x034, 0x0008406A, - 0x034, 0x0008302C, - 0x034, 0x00082029, - 0x034, 0x00081026, - 0x034, 0x00080023, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x034, 0x0008A3EE, - 0x034, 0x000893AB, - 0x034, 0x00088389, - 0x034, 0x0008718C, - 0x034, 0x00086189, - 0x034, 0x0008506D, - 0x034, 0x0008406A, - 0x034, 0x0008302C, - 0x034, 0x00082029, - 0x034, 0x00081026, - 0x034, 0x00080023, - 0xA0000000, 0x00000000, - 0x034, 0x0008A794, - 0x034, 0x00089791, - 0x034, 0x0008878E, - 0x034, 0x0008778B, - 0x034, 0x0008658D, - 0x034, 0x0008558A, - 0x034, 0x0008448D, - 0x034, 0x0008348A, - 0x034, 0x0008244C, - 0x034, 0x00081449, - 0x034, 0x0008042B, - 0xB0000000, 0x00000000, - 0x0EF, 0x00000000, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x0DF, 0x00000001, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x0DF, 0x00000001, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x0DF, 0x00000001, - 0xA0000000, 0x00000000, - 0x0DF, 0x00000000, - 0xB0000000, 0x00000000, - 0x018, 0x0001712A, - 0x0EF, 0x00000040, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x035, 0x000006CC, - 0x035, 0x000086CC, - 0x035, 0x000106CC, - 0x035, 0x000206CC, - 0x035, 0x000286CC, - 0x035, 0x000306CC, - 0x035, 0x000406CC, - 0x035, 0x000486CC, - 0x035, 0x000506CC, - 0x035, 0x000806CC, - 0x035, 0x000886CC, - 0x035, 0x000906CC, - 0x035, 0x000A06CC, - 0x035, 0x000A86CC, - 0x035, 0x000B06CC, - 0x035, 0x000C06CC, - 0x035, 0x000C86CC, - 0x035, 0x000D06CC, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x035, 0x000006CC, - 0x035, 0x000086CC, - 0x035, 0x000106CC, - 0x035, 0x000206CC, - 0x035, 0x000286CC, - 0x035, 0x000306CC, - 0x035, 0x000406CC, - 0x035, 0x000486CC, - 0x035, 0x000506CC, - 0x035, 0x000806CC, - 0x035, 0x000886CC, - 0x035, 0x000906CC, - 0x035, 0x000A06CC, - 0x035, 0x000A86CC, - 0x035, 0x000B06CC, - 0x035, 0x000C06CC, - 0x035, 0x000C86CC, - 0x035, 0x000D06CC, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x035, 0x000006CC, - 0x035, 0x000086CC, - 0x035, 0x000106CC, - 0x035, 0x000206CC, - 0x035, 0x000286CC, - 0x035, 0x000306CC, - 0x035, 0x000406CC, - 0x035, 0x000486CC, - 0x035, 0x000506CC, - 0x035, 0x000806CC, - 0x035, 0x000886CC, - 0x035, 0x000906CC, - 0x035, 0x000A06CC, - 0x035, 0x000A86CC, - 0x035, 0x000B06CC, - 0x035, 0x000C06CC, - 0x035, 0x000C86CC, - 0x035, 0x000D06CC, - 0xA0000000, 0x00000000, - 0x035, 0x00000484, - 0x035, 0x00008484, - 0x035, 0x00010484, - 0x035, 0x00020584, - 0x035, 0x00028584, - 0x035, 0x00030584, - 0x035, 0x00040584, - 0x035, 0x00048584, - 0x035, 0x00050584, - 0x035, 0x000805FB, - 0x035, 0x000885FB, - 0x035, 0x000905FB, - 0x035, 0x000A05FB, - 0x035, 0x000A85FB, - 0x035, 0x000B05FB, - 0x035, 0x000C05FB, - 0x035, 0x000C85FB, - 0x035, 0x000D05FB, - 0xB0000000, 0x00000000, - 0x0EF, 0x00000000, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x0DF, 0x00000001, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x0DF, 0x00000001, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x0DF, 0x00000001, - 0xA0000000, 0x00000000, - 0x0DF, 0x00000000, - 0xB0000000, 0x00000000, - 0x018, 0x0001712A, - 0x0EF, 0x00000010, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x036, 0x00000473, - 0x036, 0x00008473, - 0x036, 0x00010473, - 0x036, 0x00020473, - 0x036, 0x00028473, - 0x036, 0x00030473, - 0x036, 0x00040473, - 0x036, 0x00048473, - 0x036, 0x00050473, - 0x036, 0x00080473, - 0x036, 0x00088473, - 0x036, 0x00090473, - 0x036, 0x000A0473, - 0x036, 0x000A8473, - 0x036, 0x000B0473, - 0x036, 0x000C0473, - 0x036, 0x000C8473, - 0x036, 0x000D0473, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x036, 0x00000475, - 0x036, 0x00008475, - 0x036, 0x00010475, - 0x036, 0x00020475, - 0x036, 0x00028475, - 0x036, 0x00030475, - 0x036, 0x00040475, - 0x036, 0x00048475, - 0x036, 0x00050475, - 0x036, 0x00080475, - 0x036, 0x00088475, - 0x036, 0x00090475, - 0x036, 0x000A0475, - 0x036, 0x000A8475, - 0x036, 0x000B0475, - 0x036, 0x000C0475, - 0x036, 0x000C8475, - 0x036, 0x000D0475, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x036, 0x00000475, - 0x036, 0x00008475, - 0x036, 0x00010475, - 0x036, 0x00020475, - 0x036, 0x00028475, - 0x036, 0x00030475, - 0x036, 0x00040475, - 0x036, 0x00048475, - 0x036, 0x00050475, - 0x036, 0x00080475, - 0x036, 0x00088475, - 0x036, 0x00090475, - 0x036, 0x000A0475, - 0x036, 0x000A8475, - 0x036, 0x000B0475, - 0x036, 0x000C0475, - 0x036, 0x000C8475, - 0x036, 0x000D0475, - 0xA0000000, 0x00000000, - 0x036, 0x00000474, - 0x036, 0x00008474, - 0x036, 0x00010474, - 0x036, 0x00020474, - 0x036, 0x00028474, - 0x036, 0x00030474, - 0x036, 0x00040474, - 0x036, 0x00048474, - 0x036, 0x00050474, - 0x036, 0x00080474, - 0x036, 0x00088474, - 0x036, 0x00090474, - 0x036, 0x000A0474, - 0x036, 0x000A8474, - 0x036, 0x000B0474, - 0x036, 0x000C0474, - 0x036, 0x000C8474, - 0x036, 0x000D0474, - 0xB0000000, 0x00000000, - 0x0EF, 0x00000000, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0xA0000000, 0x00000000, - 0x0EF, 0x00000004, - 0x037, 0x00000000, - 0x038, 0x0000514E, - 0x037, 0x00004000, - 0x038, 0x0000514E, - 0x037, 0x00008000, - 0x038, 0x0000514E, - 0x037, 0x00010000, - 0x038, 0x0000514E, - 0x037, 0x00014000, - 0x038, 0x0000514E, - 0x037, 0x00018000, - 0x038, 0x0000514E, - 0x037, 0x0001C000, - 0x038, 0x0000514E, - 0x037, 0x00020000, - 0x038, 0x0000514E, - 0x037, 0x00024000, - 0x038, 0x0000514E, - 0x037, 0x00028000, - 0x038, 0x0000514E, - 0x037, 0x0002C000, - 0x038, 0x0000714E, - 0x037, 0x00030000, - 0x038, 0x0000514E, - 0x037, 0x00034000, - 0x038, 0x0000514E, - 0x037, 0x00038000, - 0x038, 0x0000514E, - 0x037, 0x0003C000, - 0x038, 0x0000514E, - 0x037, 0x00040000, - 0x038, 0x0000514E, - 0x037, 0x00044000, - 0x038, 0x0000514E, - 0x037, 0x00048000, - 0x038, 0x0000514E, - 0x037, 0x00080000, - 0x038, 0x00005ECE, - 0x037, 0x00084000, - 0x038, 0x00005ECE, - 0x037, 0x00088000, - 0x038, 0x00005ECE, - 0x037, 0x00090000, - 0x038, 0x00005ECE, - 0x037, 0x00094000, - 0x038, 0x00005ECE, - 0x037, 0x00098000, - 0x038, 0x00005ECE, - 0x037, 0x0009C000, - 0x038, 0x00005ECE, - 0x037, 0x000A0000, - 0x038, 0x00005ECE, - 0x037, 0x000A4000, - 0x038, 0x00005ECE, - 0x037, 0x000A8000, - 0x038, 0x00005ECE, - 0x037, 0x000AC000, - 0x038, 0x00005ECE, - 0x037, 0x000B0000, - 0x038, 0x00005ECE, - 0x037, 0x000B4000, - 0x038, 0x00005ECE, - 0x037, 0x000B8000, - 0x038, 0x00005ECE, - 0x037, 0x000BC000, - 0x038, 0x00005ECE, - 0x037, 0x000C0000, - 0x038, 0x00005ECE, - 0x037, 0x000C4000, - 0x038, 0x00005ECE, - 0x037, 0x000C8000, - 0x038, 0x00005ECE, - 0x0EF, 0x00000000, - 0xB0000000, 0x00000000, - 0x0EF, 0x00000008, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0xA0000000, 0x00000000, - 0x03C, 0x0000007D, - 0x03C, 0x0000047D, - 0x03C, 0x0000087D, - 0x03C, 0x0000107D, - 0x03C, 0x0000147D, - 0x03C, 0x0000187D, - 0xB0000000, 0x00000000, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x03C, 0x0000027D, - 0x03C, 0x00000541, - 0x03C, 0x00000821, - 0x03C, 0x0000127D, - 0x03C, 0x00001541, - 0x03C, 0x00001821, - 0x03C, 0x0000227D, - 0x03C, 0x00002541, - 0x03C, 0x00002821, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x03C, 0x0000027D, - 0x03C, 0x00000546, - 0x03C, 0x00000821, - 0x03C, 0x0000127D, - 0x03C, 0x00001546, - 0x03C, 0x00001821, - 0x03C, 0x0000227D, - 0x03C, 0x00002546, - 0x03C, 0x00002821, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x03C, 0x0000027D, - 0x03C, 0x00000546, - 0x03C, 0x00000821, - 0x03C, 0x0000127D, - 0x03C, 0x00001546, - 0x03C, 0x00001821, - 0x03C, 0x0000227D, - 0x03C, 0x00002546, - 0x03C, 0x00002821, - 0xA0000000, 0x00000000, - 0x03C, 0x0000037E, - 0x03C, 0x00000575, - 0x03C, 0x00000971, - 0x03C, 0x0000127E, - 0x03C, 0x00001575, - 0x03C, 0x00001871, - 0x03C, 0x0000217E, - 0x03C, 0x00002575, - 0x03C, 0x00002871, - 0xB0000000, 0x00000000, - 0x0EF, 0x00000000, - 0x061, 0x000C0D47, - 0x062, 0x0000133C, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x063, 0x000750E7, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x063, 0x000750E7, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x063, 0x000750E7, - 0xA0000000, 0x00000000, - 0x063, 0x0007D0E7, - 0xB0000000, 0x00000000, - 0x064, 0x00014FEC, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x065, 0x000920D0, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x065, 0x000920D0, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x065, 0x000920D0, - 0xA0000000, 0x00000000, - 0x065, 0x000923FF, - 0xB0000000, 0x00000000, - 0x066, 0x00000040, - 0x057, 0x00050000, - 0x056, 0x00051DF0, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0xA0000000, 0x00000000, - 0x055, 0x00082060, - 0xB0000000, 0x00000000, - -}; - -void -odm_read_and_config_mp_8814a_radioc( - struct dm_struct * pDM_Odm -) -{ - u4Byte i = 0; - u1Byte cCond; - BOOLEAN bMatched = TRUE, bSkipped = FALSE; - u4Byte ArrayLen = sizeof(Array_MP_8814A_RadioC)/sizeof(u4Byte); - pu4Byte Array = Array_MP_8814A_RadioC; - - u4Byte v1 = 0, v2 = 0, pre_v1 = 0, pre_v2 = 0; - - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_8814A_RadioC\n"); - - while ((i + 1) < ArrayLen) { - v1 = Array[i]; - v2 = Array[i + 1]; - - if (v1 & (BIT31 | BIT30)) {/*positive & negative condition*/ - if (v1 & BIT31) {/* positive condition*/ - cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28); - if (cCond == COND_ENDIF) {/*end*/ - bMatched = TRUE; - bSkipped = FALSE; - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "ENDIF\n"); - } else if (cCond == COND_ELSE) { /*else*/ - bMatched = bSkipped?FALSE:TRUE; - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "ELSE\n"); - } else {/*if , else if*/ - pre_v1 = v1; - pre_v2 = v2; - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "IF or ELSE IF\n"); - } - } else if (v1 & BIT30) { /*negative condition*/ - if (bSkipped == FALSE) { - if (CheckPositive(pDM_Odm, pre_v1, pre_v2, v1, v2)) { - bMatched = TRUE; - bSkipped = TRUE; - } else { - bMatched = FALSE; - bSkipped = FALSE; - } - } else - bMatched = FALSE; - } - } else { - if (bMatched) - odm_ConfigRF_RadioC_8814A(pDM_Odm, v1, v2); - } - i = i + 2; - } -} - -u4Byte -ODM_GetVersion_MP_8814A_RadioC(void) -{ - return 85; -} - -/****************************************************************************** -* RadioD.TXT -******************************************************************************/ - -u4Byte Array_MP_8814A_RadioD[] = { - 0x018, 0x00013124, - 0x040, 0x00000C00, - 0x058, 0x00000F98, - 0x07F, 0x00068004, - 0x018, 0x00000006, - 0x80000001, 0x00000055, 0x40000000, 0x00000000, - 0x086, 0x000E335A, - 0x087, 0x00079F80, - 0x90000001, 0x000000aa, 0x40000000, 0x00000000, - 0x086, 0x000E335A, - 0x087, 0x00079F80, - 0xA0000000, 0x00000000, - 0x086, 0x000E4B58, - 0x087, 0x00049F80, - 0xB0000000, 0x00000000, - 0x0DF, 0x00000008, - 0x0EF, 0x00002000, - 0x80000001, 0x00000055, 0x40000000, 0x00000000, - 0x03B, 0x0003F19B, - 0x03B, 0x00037A5B, - 0x03B, 0x0002A433, - 0x03B, 0x00027BD3, - 0x03B, 0x0001F80B, - 0x03B, 0x00017803, - 0x90000001, 0x000000aa, 0x40000000, 0x00000000, - 0x03B, 0x0003F09B, - 0x03B, 0x00037A5B, - 0x03B, 0x0002A433, - 0x03B, 0x00027BD3, - 0x03B, 0x0001F80B, - 0x03B, 0x00017803, - 0xA0000000, 0x00000000, - 0x03B, 0x0003F258, - 0x03B, 0x00030A58, - 0x03B, 0x0002FA58, - 0x03B, 0x00022590, - 0x03B, 0x0001FA50, - 0x03B, 0x00010248, - 0x03B, 0x00008240, - 0xB0000000, 0x00000000, - 0x0EF, 0x00000100, - 0x80000002, 0x00005500, 0x40000000, 0x00000000, - 0x034, 0x0000A0D0, - 0x034, 0x000090CD, - 0x034, 0x000080CA, - 0x034, 0x0000704D, - 0x034, 0x0000604A, - 0x034, 0x00005047, - 0x034, 0x0000400A, - 0x034, 0x00003007, - 0x034, 0x00002004, - 0x034, 0x00001001, - 0x034, 0x00000001, - 0x90000002, 0x0000aa00, 0x40000000, 0x00000000, - 0x034, 0x0000A0D0, - 0x034, 0x000090CD, - 0x034, 0x000080CA, - 0x034, 0x0000704D, - 0x034, 0x0000604A, - 0x034, 0x00005047, - 0x034, 0x0000400A, - 0x034, 0x00003007, - 0x034, 0x00002004, - 0x034, 0x00001001, - 0x034, 0x00000001, - 0xA0000000, 0x00000000, - 0x034, 0x0000ADF6, - 0x034, 0x00009DF3, - 0x034, 0x00008DF0, - 0x034, 0x00007DED, - 0x034, 0x00006DEA, - 0x034, 0x00005CED, - 0x034, 0x00004CEA, - 0x034, 0x000034EA, - 0x034, 0x000024E7, - 0x034, 0x0000146A, - 0x034, 0x0000006B, - 0xB0000000, 0x00000000, - 0x80000002, 0x00005500, 0x40000000, 0x00000000, - 0x034, 0x0000A0D0, - 0x034, 0x000090CD, - 0x034, 0x000080CA, - 0x034, 0x0000704D, - 0x034, 0x0000604A, - 0x034, 0x00005047, - 0x034, 0x0000400A, - 0x034, 0x00003007, - 0x034, 0x00002004, - 0x034, 0x00001001, - 0x034, 0x00000001, - 0x90000002, 0x0000aa00, 0x40000000, 0x00000000, - 0x034, 0x0000A0D0, - 0x034, 0x000090CD, - 0x034, 0x000080CA, - 0x034, 0x0000704D, - 0x034, 0x0000604A, - 0x034, 0x00005047, - 0x034, 0x0000400A, - 0x034, 0x00003007, - 0x034, 0x00002004, - 0x034, 0x00001001, - 0x034, 0x00000001, - 0xA0000000, 0x00000000, - 0x034, 0x0008ADF6, - 0x034, 0x00089DF3, - 0x034, 0x00088DF0, - 0x034, 0x00087DED, - 0x034, 0x00086DEA, - 0x034, 0x00085CED, - 0x034, 0x00084CEA, - 0x034, 0x000834EA, - 0x034, 0x000824E7, - 0x034, 0x0008146A, - 0x034, 0x0008006B, - 0xB0000000, 0x00000000, - 0x0EF, 0x00000000, - 0x0EF, 0x000020A2, - 0x0DF, 0x00000080, - 0x035, 0x00000192, - 0x035, 0x00008192, - 0x035, 0x00010192, - 0x036, 0x00000024, - 0x036, 0x00008024, - 0x036, 0x00010024, - 0x036, 0x00018024, - 0x0EF, 0x00000000, - 0x051, 0x00000C21, - 0x052, 0x000006D9, - 0x053, 0x000FC649, - 0x054, 0x0000017E, - 0x018, 0x0001012A, - 0x081, 0x0007FC00, - 0x089, 0x00050110, - 0x08A, 0x00043E50, - 0x08B, 0x0002E180, - 0x08C, 0x00093C3C, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x085, 0x000F8000, - 0xA0000000, 0x00000000, - 0x085, 0x000F8000, - 0xB0000000, 0x00000000, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x08D, 0x000FFFF0, - 0x90000004, 0x00550000, 0x40000000, 0x00000000, - 0x08D, 0x000FFFF0, - 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x08D, 0x000FFFF0, - 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, - 0x08D, 0x000FFFF0, - 0x90000004, 0x00000000, 0x40000000, 0x00550000, - 0x08D, 0x000FFFF0, - 0xA0000000, 0x00000000, - 0x08D, 0x000FFFF0, - 0xB0000000, 0x00000000, - 0x0EF, 0x00001000, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00038023, - 0x03C, 0x00044000, - 0x90000004, 0x00550000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00038023, - 0x03C, 0x00048000, - 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00038023, - 0x03C, 0x00000000, - 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00038023, - 0x03C, 0x00088000, - 0x90000004, 0x00000000, 0x40000000, 0x00550000, - 0x03A, 0x0000013C, - 0x03B, 0x00038023, - 0x03C, 0x00000000, - 0xA0000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00038023, - 0x03C, 0x00048000, - 0xB0000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00030023, - 0x03C, 0x00048000, - 0x03A, 0x0000013C, - 0x03B, 0x00028623, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00021633, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x0001C633, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00010293, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00009593, - 0x03C, 0x00000000, - 0x03A, 0x00000148, - 0x03B, 0x0000078B, - 0x03C, 0x00000000, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00078023, - 0x03C, 0x00020000, - 0x90000004, 0x00550000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00078023, - 0x03C, 0x00020000, - 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00078023, - 0x03C, 0x00000000, - 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00078023, - 0x03C, 0x00044000, - 0x90000004, 0x00000000, 0x40000000, 0x00550000, - 0x03A, 0x0000013C, - 0x03B, 0x00078023, - 0x03C, 0x00000000, - 0xA0000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00078023, - 0x03C, 0x00024000, - 0xB0000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00070023, - 0x03C, 0x00048000, - 0x03A, 0x0000013C, - 0x03B, 0x00068623, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00061633, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x0005C633, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00050293, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00049593, - 0x03C, 0x00000000, - 0x03A, 0x00000148, - 0x03B, 0x0004078B, - 0x03C, 0x00000000, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x000B8023, - 0x03C, 0x00004000, - 0x90000004, 0x00550000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x000B8023, - 0x03C, 0x00060000, - 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x000B8023, - 0x03C, 0x00000000, - 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x000B8023, - 0x03C, 0x00024000, - 0x90000004, 0x00000000, 0x40000000, 0x00550000, - 0x03A, 0x0000013C, - 0x03B, 0x000B8023, - 0x03C, 0x00000000, - 0xA0000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x000B8023, - 0x03C, 0x00004000, - 0xB0000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x000B0023, - 0x80000004, 0x00ff0000, 0x40000000, 0x00000000, - 0x03C, 0x00020000, - 0xA0000000, 0x00000000, - 0x03C, 0x00020000, - 0xB0000000, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x000A8623, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x000A1633, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x0009C633, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00090293, - 0x03C, 0x00000000, - 0x03A, 0x0000013C, - 0x03B, 0x00089593, - 0x03C, 0x00000000, - 0x03A, 0x00000148, - 0x03B, 0x0008078B, - 0x03C, 0x00000000, - 0x0EF, 0x00000000, - 0x0EF, 0x00000800, - 0x03B, 0x00000000, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x03A, 0x00000803, - 0x90000004, 0x00550000, 0x40000000, 0x00000000, - 0x03A, 0x00000803, - 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x03A, 0x00000803, - 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, - 0x03A, 0x00000803, - 0x90000004, 0x00000000, 0x40000000, 0x00550000, - 0x03A, 0x00000803, - 0xA0000000, 0x00000000, - 0x03A, 0x00000803, - 0xB0000000, 0x00000000, - 0x03B, 0x00040000, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x03A, 0x00001000, - 0x90000004, 0x00550000, 0x40000000, 0x00000000, - 0x03A, 0x00001002, - 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x03A, 0x00000000, - 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, - 0x03A, 0x00001000, - 0x90000004, 0x00000000, 0x40000000, 0x00550000, - 0x03A, 0x00000001, - 0xA0000000, 0x00000000, - 0x03A, 0x00001000, - 0xB0000000, 0x00000000, - 0x03B, 0x00080000, - 0x03A, 0x00001802, - 0x0EF, 0x00000000, - 0x80000004, 0x00000000, 0x40000000, 0x00000000, - 0x90000004, 0x00550000, 0x40000000, 0x00000000, - 0x90000004, 0x00aa0000, 0x40000000, 0x00000000, - 0x90000004, 0x00ff0000, 0x40000000, 0x00000000, - 0x90000004, 0x00000000, 0x40000000, 0x00550000, - 0xA0000000, 0x00000000, - 0x0EF, 0x00000008, - 0x03C, 0x00000000, - 0x03C, 0x00000400, - 0x03C, 0x00000800, - 0x0EF, 0x00000000, - 0xB0000000, 0x00000000, - 0x018, 0x00013124, - 0x0EF, 0x00000100, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x034, 0x0004A3EB, - 0x034, 0x0004938B, - 0x034, 0x000481AC, - 0x034, 0x000471A9, - 0x034, 0x000460AC, - 0x034, 0x000450A9, - 0x034, 0x0004402E, - 0x034, 0x0004302B, - 0x034, 0x00042028, - 0x034, 0x0004100B, - 0x034, 0x00040008, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x034, 0x0004A3AD, - 0x034, 0x0004938A, - 0x034, 0x0004818C, - 0x034, 0x00047189, - 0x034, 0x0004606D, - 0x034, 0x0004506A, - 0x034, 0x0004402C, - 0x034, 0x00043029, - 0x034, 0x00042026, - 0x034, 0x00041009, - 0x034, 0x00040006, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x034, 0x0004A3AD, - 0x034, 0x0004938A, - 0x034, 0x0004818C, - 0x034, 0x00047189, - 0x034, 0x0004606D, - 0x034, 0x0004506A, - 0x034, 0x0004402C, - 0x034, 0x00043029, - 0x034, 0x00042026, - 0x034, 0x00041009, - 0x034, 0x00040006, - 0xA0000000, 0x00000000, - 0x034, 0x0004AFF4, - 0x034, 0x00049FF1, - 0x034, 0x00048FEE, - 0x034, 0x00047FEB, - 0x034, 0x00046FE8, - 0x034, 0x00045DEA, - 0x034, 0x00044CED, - 0x034, 0x00043CEA, - 0x034, 0x00042C6C, - 0x034, 0x00041C69, - 0x034, 0x00040C2B, - 0xB0000000, 0x00000000, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x034, 0x0002A3EE, - 0x034, 0x000293EB, - 0x034, 0x0002838B, - 0x034, 0x000271AC, - 0x034, 0x000261A9, - 0x034, 0x000250AC, - 0x034, 0x000240A9, - 0x034, 0x000230A6, - 0x034, 0x0002202C, - 0x034, 0x00021029, - 0x034, 0x00020026, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x034, 0x0002A3AD, - 0x034, 0x0002938A, - 0x034, 0x0002818C, - 0x034, 0x00027189, - 0x034, 0x0002606D, - 0x034, 0x0002504C, - 0x034, 0x0002402C, - 0x034, 0x00023029, - 0x034, 0x00022026, - 0x034, 0x00021023, - 0x034, 0x00020006, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x034, 0x0002A3AD, - 0x034, 0x0002938A, - 0x034, 0x0002818C, - 0x034, 0x00027189, - 0x034, 0x0002606D, - 0x034, 0x0002504C, - 0x034, 0x0002402C, - 0x034, 0x00023029, - 0x034, 0x00022026, - 0x034, 0x00021023, - 0x034, 0x00020006, - 0xA0000000, 0x00000000, - 0x034, 0x0002AFF4, - 0x034, 0x00029FF1, - 0x034, 0x00028FEE, - 0x034, 0x00027FEB, - 0x034, 0x00026FE8, - 0x034, 0x00025DEA, - 0x034, 0x00024CED, - 0x034, 0x00023CEA, - 0x034, 0x00022C6C, - 0x034, 0x00021C69, - 0x034, 0x00020C2B, - 0xB0000000, 0x00000000, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x034, 0x0000A3EF, - 0x034, 0x000093EC, - 0x034, 0x0000838C, - 0x034, 0x000071AD, - 0x034, 0x000061AA, - 0x034, 0x000050AD, - 0x034, 0x000040AA, - 0x034, 0x0000306A, - 0x034, 0x0000202D, - 0x034, 0x0000102A, - 0x034, 0x00000027, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x034, 0x0000A3EE, - 0x034, 0x000093AC, - 0x034, 0x0000838A, - 0x034, 0x0000718C, - 0x034, 0x00006189, - 0x034, 0x0000506D, - 0x034, 0x0000406A, - 0x034, 0x0000302C, - 0x034, 0x00002029, - 0x034, 0x00001026, - 0x034, 0x00000023, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x034, 0x0000A3EE, - 0x034, 0x000093AC, - 0x034, 0x0000838A, - 0x034, 0x0000718C, - 0x034, 0x00006189, - 0x034, 0x0000506D, - 0x034, 0x0000406A, - 0x034, 0x0000302C, - 0x034, 0x00002029, - 0x034, 0x00001026, - 0x034, 0x00000023, - 0xA0000000, 0x00000000, - 0x034, 0x0000AFF4, - 0x034, 0x00009FF1, - 0x034, 0x00008FEE, - 0x034, 0x00007FEB, - 0x034, 0x00006FE8, - 0x034, 0x00005DEA, - 0x034, 0x00004CED, - 0x034, 0x00003CEA, - 0x034, 0x00002C6C, - 0x034, 0x00001C69, - 0x034, 0x00000C2B, - 0xB0000000, 0x00000000, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x034, 0x000CA3EB, - 0x034, 0x000C938B, - 0x034, 0x000C81AC, - 0x034, 0x000C71A9, - 0x034, 0x000C60AC, - 0x034, 0x000C50A9, - 0x034, 0x000C402E, - 0x034, 0x000C302B, - 0x034, 0x000C2028, - 0x034, 0x000C100B, - 0x034, 0x000C0008, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x034, 0x000CA3AD, - 0x034, 0x000C938A, - 0x034, 0x000C818C, - 0x034, 0x000C7189, - 0x034, 0x000C606D, - 0x034, 0x000C506A, - 0x034, 0x000C402C, - 0x034, 0x000C3029, - 0x034, 0x000C2026, - 0x034, 0x000C1009, - 0x034, 0x000C0006, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x034, 0x000CA3AD, - 0x034, 0x000C938A, - 0x034, 0x000C818C, - 0x034, 0x000C7189, - 0x034, 0x000C606D, - 0x034, 0x000C506A, - 0x034, 0x000C402C, - 0x034, 0x000C3029, - 0x034, 0x000C2026, - 0x034, 0x000C1009, - 0x034, 0x000C0006, - 0xA0000000, 0x00000000, - 0x034, 0x000CA794, - 0x034, 0x000C9791, - 0x034, 0x000C878E, - 0x034, 0x000C778B, - 0x034, 0x000C658D, - 0x034, 0x000C558A, - 0x034, 0x000C448D, - 0x034, 0x000C348A, - 0x034, 0x000C244C, - 0x034, 0x000C1449, - 0x034, 0x000C042B, - 0xB0000000, 0x00000000, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x034, 0x000AA3EE, - 0x034, 0x000A93EB, - 0x034, 0x000A838B, - 0x034, 0x000A71AC, - 0x034, 0x000A61A9, - 0x034, 0x000A50AC, - 0x034, 0x000A40A9, - 0x034, 0x000A30A6, - 0x034, 0x000A202C, - 0x034, 0x000A1029, - 0x034, 0x000A0026, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x034, 0x000AA3AD, - 0x034, 0x000A938A, - 0x034, 0x000A818C, - 0x034, 0x000A7189, - 0x034, 0x000A606D, - 0x034, 0x000A504C, - 0x034, 0x000A402C, - 0x034, 0x000A3029, - 0x034, 0x000A2026, - 0x034, 0x000A1023, - 0x034, 0x000A0006, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x034, 0x000AA3AD, - 0x034, 0x000A938A, - 0x034, 0x000A818C, - 0x034, 0x000A7189, - 0x034, 0x000A606D, - 0x034, 0x000A504C, - 0x034, 0x000A402C, - 0x034, 0x000A3029, - 0x034, 0x000A2026, - 0x034, 0x000A1023, - 0x034, 0x000A0006, - 0xA0000000, 0x00000000, - 0x034, 0x000AA794, - 0x034, 0x000A9791, - 0x034, 0x000A878E, - 0x034, 0x000A778B, - 0x034, 0x000A658D, - 0x034, 0x000A558A, - 0x034, 0x000A448D, - 0x034, 0x000A348A, - 0x034, 0x000A244C, - 0x034, 0x000A1449, - 0x034, 0x000A042B, - 0xB0000000, 0x00000000, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x034, 0x0008A3EF, - 0x034, 0x000893EC, - 0x034, 0x0008838C, - 0x034, 0x000871AD, - 0x034, 0x000861AA, - 0x034, 0x000850AD, - 0x034, 0x000840AA, - 0x034, 0x0008306A, - 0x034, 0x0008202D, - 0x034, 0x0008102A, - 0x034, 0x00080027, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x034, 0x0008A3EE, - 0x034, 0x000893AC, - 0x034, 0x0008838A, - 0x034, 0x0008718C, - 0x034, 0x00086189, - 0x034, 0x0008506D, - 0x034, 0x0008406A, - 0x034, 0x0008302C, - 0x034, 0x00082029, - 0x034, 0x00081026, - 0x034, 0x00080023, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x034, 0x0008A3EE, - 0x034, 0x000893AC, - 0x034, 0x0008838A, - 0x034, 0x0008718C, - 0x034, 0x00086189, - 0x034, 0x0008506D, - 0x034, 0x0008406A, - 0x034, 0x0008302C, - 0x034, 0x00082029, - 0x034, 0x00081026, - 0x034, 0x00080023, - 0xA0000000, 0x00000000, - 0x034, 0x0008A794, - 0x034, 0x00089791, - 0x034, 0x0008878E, - 0x034, 0x0008778B, - 0x034, 0x0008658D, - 0x034, 0x0008558A, - 0x034, 0x0008448D, - 0x034, 0x0008348A, - 0x034, 0x0008244C, - 0x034, 0x00081449, - 0x034, 0x0008042B, - 0xB0000000, 0x00000000, - 0x0EF, 0x00000000, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x0DF, 0x00000001, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x0DF, 0x00000001, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x0DF, 0x00000001, - 0xA0000000, 0x00000000, - 0x0DF, 0x00000000, - 0xB0000000, 0x00000000, - 0x018, 0x0001712A, - 0x0EF, 0x00000040, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x035, 0x000006CC, - 0x035, 0x000086CC, - 0x035, 0x000106CC, - 0x035, 0x000206CC, - 0x035, 0x000286CC, - 0x035, 0x000306CC, - 0x035, 0x000406CC, - 0x035, 0x000486CC, - 0x035, 0x000506CC, - 0x035, 0x000806CC, - 0x035, 0x000886CC, - 0x035, 0x000906CC, - 0x035, 0x000A06CC, - 0x035, 0x000A86CC, - 0x035, 0x000B06CC, - 0x035, 0x000C06CC, - 0x035, 0x000C86CC, - 0x035, 0x000D06CC, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x035, 0x000006CC, - 0x035, 0x000086CC, - 0x035, 0x000106CC, - 0x035, 0x000206CC, - 0x035, 0x000286CC, - 0x035, 0x000306CC, - 0x035, 0x000406CC, - 0x035, 0x000486CC, - 0x035, 0x000506CC, - 0x035, 0x000806CC, - 0x035, 0x000886CC, - 0x035, 0x000906CC, - 0x035, 0x000A06CC, - 0x035, 0x000A86CC, - 0x035, 0x000B06CC, - 0x035, 0x000C06CC, - 0x035, 0x000C86CC, - 0x035, 0x000D06CC, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x035, 0x000006CC, - 0x035, 0x000086CC, - 0x035, 0x000106CC, - 0x035, 0x000206CC, - 0x035, 0x000286CC, - 0x035, 0x000306CC, - 0x035, 0x000406CC, - 0x035, 0x000486CC, - 0x035, 0x000506CC, - 0x035, 0x000806CC, - 0x035, 0x000886CC, - 0x035, 0x000906CC, - 0x035, 0x000A06CC, - 0x035, 0x000A86CC, - 0x035, 0x000B06CC, - 0x035, 0x000C06CC, - 0x035, 0x000C86CC, - 0x035, 0x000D06CC, - 0xA0000000, 0x00000000, - 0x035, 0x00000484, - 0x035, 0x00008484, - 0x035, 0x00010484, - 0x035, 0x00020584, - 0x035, 0x00028584, - 0x035, 0x00030584, - 0x035, 0x00040584, - 0x035, 0x00048584, - 0x035, 0x00050584, - 0x035, 0x000805FB, - 0x035, 0x000885FB, - 0x035, 0x000905FB, - 0x035, 0x000A05FB, - 0x035, 0x000A85FB, - 0x035, 0x000B05FB, - 0x035, 0x000C05FB, - 0x035, 0x000C85FB, - 0x035, 0x000D05FB, - 0xB0000000, 0x00000000, - 0x0EF, 0x00000000, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x0DF, 0x00000001, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x0DF, 0x00000001, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x0DF, 0x00000001, - 0xA0000000, 0x00000000, - 0x0DF, 0x00000000, - 0xB0000000, 0x00000000, - 0x018, 0x0001712A, - 0x0EF, 0x00000010, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x036, 0x00000473, - 0x036, 0x00008473, - 0x036, 0x00010473, - 0x036, 0x00020473, - 0x036, 0x00028473, - 0x036, 0x00030473, - 0x036, 0x00040473, - 0x036, 0x00048473, - 0x036, 0x00050473, - 0x036, 0x00080473, - 0x036, 0x00088473, - 0x036, 0x00090473, - 0x036, 0x000A0473, - 0x036, 0x000A8473, - 0x036, 0x000B0473, - 0x036, 0x000C0473, - 0x036, 0x000C8473, - 0x036, 0x000D0473, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x036, 0x00000475, - 0x036, 0x00008475, - 0x036, 0x00010475, - 0x036, 0x00020475, - 0x036, 0x00028475, - 0x036, 0x00030475, - 0x036, 0x00040475, - 0x036, 0x00048475, - 0x036, 0x00050475, - 0x036, 0x00080475, - 0x036, 0x00088475, - 0x036, 0x00090475, - 0x036, 0x000A0475, - 0x036, 0x000A8475, - 0x036, 0x000B0475, - 0x036, 0x000C0475, - 0x036, 0x000C8475, - 0x036, 0x000D0475, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x036, 0x00000475, - 0x036, 0x00008475, - 0x036, 0x00010475, - 0x036, 0x00020475, - 0x036, 0x00028475, - 0x036, 0x00030475, - 0x036, 0x00040475, - 0x036, 0x00048475, - 0x036, 0x00050475, - 0x036, 0x00080475, - 0x036, 0x00088475, - 0x036, 0x00090475, - 0x036, 0x000A0475, - 0x036, 0x000A8475, - 0x036, 0x000B0475, - 0x036, 0x000C0475, - 0x036, 0x000C8475, - 0x036, 0x000D0475, - 0xA0000000, 0x00000000, - 0x036, 0x00000474, - 0x036, 0x00008474, - 0x036, 0x00010474, - 0x036, 0x00020474, - 0x036, 0x00028474, - 0x036, 0x00030474, - 0x036, 0x00040474, - 0x036, 0x00048474, - 0x036, 0x00050474, - 0x036, 0x00080474, - 0x036, 0x00088474, - 0x036, 0x00090474, - 0x036, 0x000A0474, - 0x036, 0x000A8474, - 0x036, 0x000B0474, - 0x036, 0x000C0474, - 0x036, 0x000C8474, - 0x036, 0x000D0474, - 0xB0000000, 0x00000000, - 0x0EF, 0x00000000, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0xA0000000, 0x00000000, - 0x0EF, 0x00000004, - 0x037, 0x00000000, - 0x038, 0x0000514E, - 0x037, 0x00004000, - 0x038, 0x0000514E, - 0x037, 0x00008000, - 0x038, 0x0000514E, - 0x037, 0x00010000, - 0x038, 0x0000514E, - 0x037, 0x00014000, - 0x038, 0x0000514E, - 0x037, 0x00018000, - 0x038, 0x0000514E, - 0x037, 0x0001C000, - 0x038, 0x0000514E, - 0x037, 0x00020000, - 0x038, 0x0000514E, - 0x037, 0x00024000, - 0x038, 0x0000514E, - 0x037, 0x00028000, - 0x038, 0x0000514E, - 0x037, 0x0002C000, - 0x038, 0x0000714E, - 0x037, 0x00030000, - 0x038, 0x0000514E, - 0x037, 0x00034000, - 0x038, 0x0000514E, - 0x037, 0x00038000, - 0x038, 0x0000514E, - 0x037, 0x0003C000, - 0x038, 0x0000514E, - 0x037, 0x00040000, - 0x038, 0x0000514E, - 0x037, 0x00044000, - 0x038, 0x0000514E, - 0x037, 0x00048000, - 0x038, 0x0000514E, - 0x037, 0x00080000, - 0x038, 0x00005ECE, - 0x037, 0x00084000, - 0x038, 0x00005ECE, - 0x037, 0x00088000, - 0x038, 0x00005ECE, - 0x037, 0x00090000, - 0x038, 0x00005ECE, - 0x037, 0x00094000, - 0x038, 0x00005ECE, - 0x037, 0x00098000, - 0x038, 0x00005ECE, - 0x037, 0x0009C000, - 0x038, 0x00005ECE, - 0x037, 0x000A0000, - 0x038, 0x00005ECE, - 0x037, 0x000A4000, - 0x038, 0x00005ECE, - 0x037, 0x000A8000, - 0x038, 0x00005ECE, - 0x037, 0x000AC000, - 0x038, 0x00005ECE, - 0x037, 0x000B0000, - 0x038, 0x00005ECE, - 0x037, 0x000B4000, - 0x038, 0x00005ECE, - 0x037, 0x000B8000, - 0x038, 0x00005ECE, - 0x037, 0x000BC000, - 0x038, 0x00005ECE, - 0x037, 0x000C0000, - 0x038, 0x00005ECE, - 0x037, 0x000C4000, - 0x038, 0x00005ECE, - 0x037, 0x000C8000, - 0x038, 0x00005ECE, - 0x0EF, 0x00000000, - 0xB0000000, 0x00000000, - 0x0EF, 0x00000008, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0xA0000000, 0x00000000, - 0x03C, 0x0000007D, - 0x03C, 0x0000047D, - 0x03C, 0x0000087D, - 0x03C, 0x0000107D, - 0x03C, 0x0000147D, - 0x03C, 0x0000187D, - 0xB0000000, 0x00000000, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x03C, 0x00000275, - 0x03C, 0x00000542, - 0x03C, 0x00000821, - 0x03C, 0x00001275, - 0x03C, 0x00001542, - 0x03C, 0x00001821, - 0x03C, 0x00002275, - 0x03C, 0x00002542, - 0x03C, 0x00002821, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x03C, 0x0000027F, - 0x03C, 0x00000542, - 0x03C, 0x00000821, - 0x03C, 0x0000127F, - 0x03C, 0x00001542, - 0x03C, 0x00001821, - 0x03C, 0x0000227F, - 0x03C, 0x00002542, - 0x03C, 0x00002821, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x03C, 0x0000027F, - 0x03C, 0x00000542, - 0x03C, 0x00000821, - 0x03C, 0x0000127F, - 0x03C, 0x00001542, - 0x03C, 0x00001821, - 0x03C, 0x0000227F, - 0x03C, 0x00002542, - 0x03C, 0x00002821, - 0xA0000000, 0x00000000, - 0x03C, 0x0000037E, - 0x03C, 0x00000575, - 0x03C, 0x00000971, - 0x03C, 0x0000127E, - 0x03C, 0x00001575, - 0x03C, 0x00001871, - 0x03C, 0x0000217E, - 0x03C, 0x00002575, - 0x03C, 0x00002871, - 0xB0000000, 0x00000000, - 0x0EF, 0x00000000, - 0x061, 0x000C0D47, - 0x062, 0x0000133C, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x063, 0x000750E7, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x063, 0x000750E7, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x063, 0x000750E7, - 0xA0000000, 0x00000000, - 0x063, 0x0007D0E7, - 0xB0000000, 0x00000000, - 0x064, 0x00014FEC, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x065, 0x000920D0, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x065, 0x000920D0, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0x065, 0x000920D0, - 0xA0000000, 0x00000000, - 0x065, 0x000923FF, - 0xB0000000, 0x00000000, - 0x066, 0x00000040, - 0x057, 0x00050000, - 0x056, 0x00051DF0, - 0x80000008, 0x00000000, 0x40000000, 0x00000000, - 0x90000008, 0x55000000, 0x40000000, 0x00000000, - 0x90000008, 0xaa000000, 0x40000000, 0x00000000, - 0xA0000000, 0x00000000, - 0x055, 0x00082060, - 0xB0000000, 0x00000000, - -}; - -void -odm_read_and_config_mp_8814a_radiod( - struct dm_struct * pDM_Odm -) -{ - u4Byte i = 0; - u1Byte cCond; - BOOLEAN bMatched = TRUE, bSkipped = FALSE; - u4Byte ArrayLen = sizeof(Array_MP_8814A_RadioD)/sizeof(u4Byte); - pu4Byte Array = Array_MP_8814A_RadioD; - - u4Byte v1 = 0, v2 = 0, pre_v1 = 0, pre_v2 = 0; - - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_8814A_RadioD\n"); - - while ((i + 1) < ArrayLen) { - v1 = Array[i]; - v2 = Array[i + 1]; - - if (v1 & (BIT31 | BIT30)) {/*positive & negative condition*/ - if (v1 & BIT31) {/* positive condition*/ - cCond = (u1Byte)((v1 & (BIT29|BIT28)) >> 28); - if (cCond == COND_ENDIF) {/*end*/ - bMatched = TRUE; - bSkipped = FALSE; - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "ENDIF\n"); - } else if (cCond == COND_ELSE) { /*else*/ - bMatched = bSkipped?FALSE:TRUE; - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "ELSE\n"); - } else {/*if , else if*/ - pre_v1 = v1; - pre_v2 = v2; - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "IF or ELSE IF\n"); - } - } else if (v1 & BIT30) { /*negative condition*/ - if (bSkipped == FALSE) { - if (CheckPositive(pDM_Odm, pre_v1, pre_v2, v1, v2)) { - bMatched = TRUE; - bSkipped = TRUE; - } else { - bMatched = FALSE; - bSkipped = FALSE; - } - } else - bMatched = FALSE; - } - } else { - if (bMatched) - odm_ConfigRF_RadioD_8814A(pDM_Odm, v1, v2); - } - i = i + 2; - } -} - -u4Byte -ODM_GetVersion_MP_8814A_RadioD(void) -{ - return 85; -} - -/****************************************************************************** -* TxPowerTrack.TXT -******************************************************************************/ - -u1Byte gDeltaSwingTableIdx_MP_5GD_N_TxPowerTrack_8814A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 9, 9, 10, 11, 11, 12, 13, 13, 14, 15, 15, 16, 17, 17, 18, 19, 19}, - {0, 1, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 7, 8, 9, 9, 10, 10, 11, 12, 12, 13, 13, 14, 15, 15, 16, 17, 17, 18}, - {0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 12, 12, 13, 14, 14, 15, 16, 16, 17, 17, 18, 19}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GD_P_TxPowerTrack_8814A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 25, 25, 25, 25}, - {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 21, 22, 23, 24, 25, 25, 25, 25}, - {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 21, 22, 23, 24, 25, 25, 25, 25}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GC_N_TxPowerTrack_8814A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 10, 10, 11, 12, 13, 14, 15, 15, 15, 15, 16, 16, 17, 18}, - {0, 1, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 17, 18, 19, 19, 20}, - {0, 1, 1, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 13, 14, 14, 15, 16, 17, 18, 18, 19, 20, 20}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GC_P_TxPowerTrack_8814A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 17, 18, 19, 20, 21, 21, 22, 23, 24, 25, 25}, - {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 21, 22, 23, 24, 24, 25, 25, 25}, - {0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 25}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_8814A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 10, 10, 11, 11, 12, 13, 13, 14, 14, 15, 15, 16, 17, 17}, - {0, 1, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 17, 18, 19, 19, 20}, - {0, 1, 1, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 13, 14, 14, 15, 16, 17, 18, 18, 19, 20, 20}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_8814A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 2, 3, 3, 4, 5, 6, 7, 8, 8, 9, 10, 11, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 22, 23, 23, 24}, - {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 18, 19, 20, 21, 22, 23, 24, 25, 25, 25, 25}, - {0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 17, 18, 19, 20, 20, 21, 22, 23, 24, 25, 25}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_8814A[][DELTA_SWINGIDX_SIZE] = { - {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 11, 11, 11, 12, 12, 13, 13, 14}, - {0, 1, 1, 2, 3, 4, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 11, 12, 13, 14, 14, 15, 16, 16, 17, 18, 19, 19, 20, 21}, - {0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 12, 12, 13, 14, 14, 15, 16, 16, 17, 17, 18, 19}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_8814A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 2, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10, 11, 12, 12, 13, 14, 15, 16, 16, 17, 18, 19, 20, 21, 21, 22, 23, 24}, - {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 25, 25, 25}, - {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 21, 22, 23, 24, 25, 25, 25, 25}, -}; -u1Byte gDeltaSwingTableIdx_MP_2GD_N_TxPowerTrack_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 12}; -u1Byte gDeltaSwingTableIdx_MP_2GD_P_TxPowerTrack_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13}; -u1Byte gDeltaSwingTableIdx_MP_2GC_N_TxPowerTrack_8814A[] = {0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 10, 11, 11, 12, 12}; -u1Byte gDeltaSwingTableIdx_MP_2GC_P_TxPowerTrack_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 13}; -u1Byte gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12}; -u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13}; -u1Byte gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 13}; -u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKD_N_TxPowerTrack_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 12, 12}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKD_P_TxPowerTrack_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKC_N_TxPowerTrack_8814A[] = {0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 12}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKC_P_TxPowerTrack_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 13}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_8814A[] = {0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 12}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14}; - -void -odm_read_and_config_mp_8814a_txpowertrack( - struct dm_struct * pDM_Odm -) -{ - struct dm_rf_calibration_struct * prf_calibrate_info = &(pDM_Odm->rf_calibrate_info); - - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_MP_8814A\n"); - - - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2ga_p, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2ga_n, gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gb_p, gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gb_n, gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gc_p, gDeltaSwingTableIdx_MP_2GC_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gc_n, gDeltaSwingTableIdx_MP_2GC_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gd_p, gDeltaSwingTableIdx_MP_2GD_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gd_n, gDeltaSwingTableIdx_MP_2GD_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE); - - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_a_p, gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_a_n, gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_b_p, gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_b_n, gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_c_p, gDeltaSwingTableIdx_MP_2GCCKC_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_c_n, gDeltaSwingTableIdx_MP_2GCCKC_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_d_p, gDeltaSwingTableIdx_MP_2GCCKD_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_d_n, gDeltaSwingTableIdx_MP_2GCCKD_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE); - - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5ga_p, gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE*3); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5ga_n, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE*3); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gb_p, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE*3); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gb_n, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE*3); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gc_p, gDeltaSwingTableIdx_MP_5GC_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE*3); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gc_n, gDeltaSwingTableIdx_MP_5GC_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE*3); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gd_p, gDeltaSwingTableIdx_MP_5GD_P_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE*3); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gd_n, gDeltaSwingTableIdx_MP_5GD_N_TxPowerTrack_8814A, DELTA_SWINGIDX_SIZE*3); -} - -/****************************************************************************** -* TxPowerTrack_Type0.TXT -******************************************************************************/ - -u1Byte gDeltaSwingTableIdx_MP_5GD_N_TxPowerTrack_Type0_8814A[][DELTA_SWINGIDX_SIZE] = { - {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, - {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, - {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GD_P_TxPowerTrack_Type0_8814A[][DELTA_SWINGIDX_SIZE] = { - {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, - {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, - {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GC_N_TxPowerTrack_Type0_8814A[][DELTA_SWINGIDX_SIZE] = { - {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, - {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, - {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GC_P_TxPowerTrack_Type0_8814A[][DELTA_SWINGIDX_SIZE] = { - {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, - {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, - {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_Type0_8814A[][DELTA_SWINGIDX_SIZE] = { - {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, - {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, - {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_Type0_8814A[][DELTA_SWINGIDX_SIZE] = { - {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, - {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, - {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_Type0_8814A[][DELTA_SWINGIDX_SIZE] = { - {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, - {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, - {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_Type0_8814A[][DELTA_SWINGIDX_SIZE] = { - {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, - {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, - {0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, -}; -u1Byte gDeltaSwingTableIdx_MP_2GD_N_TxPowerTrack_Type0_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_MP_2GD_P_TxPowerTrack_Type0_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_MP_2GC_N_TxPowerTrack_Type0_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_MP_2GC_P_TxPowerTrack_Type0_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_Type0_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_Type0_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_Type0_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_Type0_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKD_N_TxPowerTrack_Type0_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKD_P_TxPowerTrack_Type0_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKC_N_TxPowerTrack_Type0_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKC_P_TxPowerTrack_Type0_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_Type0_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_Type0_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_Type0_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_Type0_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; - -void -odm_read_and_config_mp_8814a_txpowertrack_type0( - struct dm_struct * pDM_Odm -) -{ - struct dm_rf_calibration_struct * prf_calibrate_info = &(pDM_Odm->rf_calibrate_info); - - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_MP_8814A\n"); - - - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2ga_p, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2ga_n, gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gb_p, gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gb_n, gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gc_p, gDeltaSwingTableIdx_MP_2GC_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gc_n, gDeltaSwingTableIdx_MP_2GC_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gd_p, gDeltaSwingTableIdx_MP_2GD_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gd_n, gDeltaSwingTableIdx_MP_2GD_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE); - - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_a_p, gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_a_n, gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_b_p, gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_b_n, gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_c_p, gDeltaSwingTableIdx_MP_2GCCKC_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_c_n, gDeltaSwingTableIdx_MP_2GCCKC_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_d_p, gDeltaSwingTableIdx_MP_2GCCKD_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_d_n, gDeltaSwingTableIdx_MP_2GCCKD_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE); - - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5ga_p, gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE*3); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5ga_n, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE*3); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gb_p, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE*3); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gb_n, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE*3); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gc_p, gDeltaSwingTableIdx_MP_5GC_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE*3); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gc_n, gDeltaSwingTableIdx_MP_5GC_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE*3); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gd_p, gDeltaSwingTableIdx_MP_5GD_P_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE*3); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gd_n, gDeltaSwingTableIdx_MP_5GD_N_TxPowerTrack_Type0_8814A, DELTA_SWINGIDX_SIZE*3); -} - -/****************************************************************************** -* TxPowerTrack_Type2.TXT -******************************************************************************/ - -u1Byte gDeltaSwingTableIdx_MP_5GD_N_TxPowerTrack_Type2_8814A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10, 10, 11, 11, 12, 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16}, - {0, 1, 2, 3, 4, 5, 5, 6, 6, 7, 8, 9, 9, 10, 10, 10, 10, 11, 11, 12, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16}, - {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 13, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GD_P_TxPowerTrack_Type2_8814A[][DELTA_SWINGIDX_SIZE] = { - {0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 22, 22, 22, 22, 22}, - {0, 1, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 22, 22, 22, 22, 22}, - {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 23, 23, 23, 23, 23}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GC_N_TxPowerTrack_Type2_8814A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 9, 10, 10, 11, 11, 12, 12, 13, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15}, - {0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 9, 10, 10, 11, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15}, - {0, 1, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 9, 10, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GC_P_TxPowerTrack_Type2_8814A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10, 11, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 21, 21, 21, 21, 21, 21}, - {0, 1, 2, 3, 4, 5, 6, 6, 7, 8, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 20, 20, 21, 21, 21, 21, 21}, - {0, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 21, 21, 21, 21, 21, 21}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_Type2_8814A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 11, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15}, - {0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 9, 10, 10, 11, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15}, - {0, 1, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 9, 10, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_Type2_8814A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 21, 21, 21, 21, 21, 21, 21}, - {0, 0, 1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 20, 20, 20, 20, 20, 20}, - {0, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 21, 21, 21, 21, 21, 21}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_Type2_8814A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 2, 3, 4, 5, 5, 6, 7, 7, 8, 9, 10, 10, 11, 11, 11, 12, 13, 13, 13, 13, 14, 15, 15, 15, 15, 15, 15, 15}, - {0, 1, 2, 3, 3, 4, 5, 6, 7, 8, 8, 9, 10, 10, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14}, - {0, 1, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 10, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_Type2_8814A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 19, 20, 20, 20, 20, 20}, - {0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 16, 17, 18, 19, 20, 20, 20, 20, 20, 20, 20}, - {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 12, 13, 14, 15, 15, 16, 17, 18, 19, 19, 20, 20, 20, 20, 20, 20, 20}, -}; -u1Byte gDeltaSwingTableIdx_MP_2GD_N_TxPowerTrack_Type2_8814A[] = {0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 8, 9, 10, 11, 11, 11, 11, 11, 11, 11}; -u1Byte gDeltaSwingTableIdx_MP_2GD_P_TxPowerTrack_Type2_8814A[] = {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 9, 9, 10, 10, 11, 12, 12, 13, 14, 14, 14, 14, 14, 14, 14}; -u1Byte gDeltaSwingTableIdx_MP_2GC_N_TxPowerTrack_Type2_8814A[] = {0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 6, 6, 7, 7, 8, 8, 9, 10, 10, 11, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14}; -u1Byte gDeltaSwingTableIdx_MP_2GC_P_TxPowerTrack_Type2_8814A[] = {0, 1, 1, 2, 3, 3, 4, 4, 4, 5, 5, 6, 7, 8, 8, 9, 10, 10, 11, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14}; -u1Byte gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_Type2_8814A[] = {0, 1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 13, 14, 14, 14}; -u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_Type2_8814A[] = {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 9, 10, 10, 11, 12, 12, 13, 13, 13, 13, 13, 14, 14, 14}; -u1Byte gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_Type2_8814A[] = {0, 0, 1, 2, 2, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 9, 9, 10, 11, 11, 12, 12, 13, 13, 13, 13, 13, 13, 13}; -u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_Type2_8814A[] = {0, 1, 1, 2, 3, 3, 4, 4, 4, 5, 6, 6, 7, 7, 8, 8, 9, 10, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKD_N_TxPowerTrack_Type2_8814A[] = {0, 1, 1, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 8, 9, 9, 9, 9, 9, 9, 10, 10, 11, 11, 12, 12, 12}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKD_P_TxPowerTrack_Type2_8814A[] = {0, 1, 1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10, 10, 11, 12, 12, 13, 14, 14, 14, 14, 14, 14, 14}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKC_N_TxPowerTrack_Type2_8814A[] = {0, 0, 1, 2, 2, 3, 4, 5, 5, 6, 6, 6, 6, 7, 8, 9, 9, 10, 10, 11, 11, 11, 12, 13, 13, 13, 13, 13, 13, 13}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKC_P_TxPowerTrack_Type2_8814A[] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 9, 9, 10, 10, 11, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_Type2_8814A[] = {0, 1, 1, 2, 2, 2, 3, 3, 4, 5, 6, 6, 7, 7, 8, 8, 9, 10, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_Type2_8814A[] = {0, 1, 1, 1, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_Type2_8814A[] = {0, 1, 2, 2, 3, 4, 4, 4, 5, 5, 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_Type2_8814A[] = {0, 0, 1, 2, 2, 3, 3, 4, 5, 5, 6, 7, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13}; - -void -odm_read_and_config_mp_8814a_txpowertrack_type2( - struct dm_struct * pDM_Odm -) -{ - struct dm_rf_calibration_struct * prf_calibrate_info = &(pDM_Odm->rf_calibrate_info); - - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_MP_8814A\n"); - - - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2ga_p, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2ga_n, gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gb_p, gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gb_n, gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gc_p, gDeltaSwingTableIdx_MP_2GC_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gc_n, gDeltaSwingTableIdx_MP_2GC_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gd_p, gDeltaSwingTableIdx_MP_2GD_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gd_n, gDeltaSwingTableIdx_MP_2GD_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE); - - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_a_p, gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_a_n, gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_b_p, gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_b_n, gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_c_p, gDeltaSwingTableIdx_MP_2GCCKC_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_c_n, gDeltaSwingTableIdx_MP_2GCCKC_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_d_p, gDeltaSwingTableIdx_MP_2GCCKD_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_d_n, gDeltaSwingTableIdx_MP_2GCCKD_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE); - - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5ga_p, gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE*3); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5ga_n, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE*3); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gb_p, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE*3); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gb_n, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE*3); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gc_p, gDeltaSwingTableIdx_MP_5GC_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE*3); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gc_n, gDeltaSwingTableIdx_MP_5GC_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE*3); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gd_p, gDeltaSwingTableIdx_MP_5GD_P_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE*3); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gd_n, gDeltaSwingTableIdx_MP_5GD_N_TxPowerTrack_Type2_8814A, DELTA_SWINGIDX_SIZE*3); -} - -/****************************************************************************** -* TxPowerTrack_Type5.TXT -******************************************************************************/ - -u1Byte gDeltaSwingTableIdx_MP_5GD_N_TxPowerTrack_Type5_8814A[][DELTA_SWINGIDX_SIZE] = { - {0, 3, 3, 3, 4, 6, 6, 7, 7, 8, 9, 10, 11, 12, 13, 13, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15}, - {0, 4, 5, 6, 7, 7, 8, 7, 8, 10, 11, 12, 12, 13, 13, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15}, - {0, 5, 5, 6, 7, 8, 9, 9, 10, 11, 12, 13, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GD_P_TxPowerTrack_Type5_8814A[][DELTA_SWINGIDX_SIZE] = { - {0, 0, 0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 9, 10, 10, 11, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13}, - {0, 0, 0, 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 11, 12, 12, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14}, - {0, 0, 0, 1, 1, 2, 2, 3, 5, 7, 8, 9, 10, 11, 12, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GC_N_TxPowerTrack_Type5_8814A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 3, 3, 4, 6, 7, 7, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12}, - {0, 1, 2, 3, 3, 7, 7, 8, 8, 9, 11, 12, 12, 13, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15}, - {0, 0, 1, 2, 3, 4, 5, 7, 8, 8, 10, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GC_P_TxPowerTrack_Type5_8814A[][DELTA_SWINGIDX_SIZE] = { - {0, 0, 0, 1, 1, 2, 2, 3, 4, 5, 6, 6, 7, 8, 9, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13}, - {0, 0, 1, 2, 3, 3, 5, 5, 6, 8, 8, 9, 10, 11, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14}, - {0, 0, 1, 2, 3, 4, 4, 5, 7, 8, 9, 9, 10, 11, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_Type5_8814A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 2, 2, 2, 3, 4, 5, 6, 7, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12}, - {0, 1, 2, 3, 3, 7, 7, 8, 8, 9, 11, 12, 12, 13, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15}, - {0, 0, 1, 2, 3, 4, 5, 7, 8, 8, 10, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_Type5_8814A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 1, 2, 2, 4, 5, 6, 6, 7, 8, 9, 10, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, - {0, 0, 0, 2, 3, 4, 5, 6, 8, 8, 9, 9, 11, 12, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14}, - {0, 0, 0, 1, 2, 3, 3, 4, 6, 7, 8, 9, 10, 11, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_Type5_8814A[][DELTA_SWINGIDX_SIZE] = { - {0, 0, 0, 1, 2, 3, 3, 3, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12}, - {0, 2, 3, 4, 5, 7, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18}, - {0, 1, 2, 3, 3, 4, 6, 7, 8, 8, 10, 11, 11, 12, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14}, -}; -u1Byte gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_Type5_8814A[][DELTA_SWINGIDX_SIZE] = { - {0, 1, 1, 3, 3, 3, 5, 5, 6, 6, 8, 8, 9, 10, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, - {0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 11, 12, 13, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15}, - {0, 0, 1, 3, 3, 4, 5, 5, 6, 7, 7, 8, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13}, -}; -u1Byte gDeltaSwingTableIdx_MP_2GD_N_TxPowerTrack_Type5_8814A[] = {0, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 7, 7, 8, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11}; -u1Byte gDeltaSwingTableIdx_MP_2GD_P_TxPowerTrack_Type5_8814A[] = {0, 1, 1, 2, 2, 2, 3, 4, 4, 5, 6, 6, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10}; -u1Byte gDeltaSwingTableIdx_MP_2GC_N_TxPowerTrack_Type5_8814A[] = {0, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12}; -u1Byte gDeltaSwingTableIdx_MP_2GC_P_TxPowerTrack_Type5_8814A[] = {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 8, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11}; -u1Byte gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_Type5_8814A[] = {0, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 7, 8, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12}; -u1Byte gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_Type5_8814A[] = {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11}; -u1Byte gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_Type5_8814A[] = {0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 10, 10, 10, 10, 11, 11, 11, 11, 111, 12, 12, 12, 12, 12, 12, 12}; -u1Byte gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_Type5_8814A[] = {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 7, 8, 8, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKD_N_TxPowerTrack_Type5_8814A[] = {0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 10, 11, 11, 11, 11}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKD_P_TxPowerTrack_Type5_8814A[] = {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKC_N_TxPowerTrack_Type5_8814A[] = {0, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 8, 8, 9, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKC_P_TxPowerTrack_Type5_8814A[] = {0, 0, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_Type5_8814A[] = {0, 2, 3, 4, 4, 5, 6, 6, 6, 7, 7, 8, 8, 9, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_Type5_8814A[] = {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_Type5_8814A[] = {0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10}; -u1Byte gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_Type5_8814A[] = {0, 1, 1, 2, 2, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10}; - -void -odm_read_and_config_mp_8814a_txpowertrack_type5( - struct dm_struct * pDM_Odm -) -{ - struct dm_rf_calibration_struct * prf_calibrate_info = &(pDM_Odm->rf_calibrate_info); - - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_MP_8814A\n"); - - - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2ga_p, gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2ga_n, gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gb_p, gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gb_n, gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gc_p, gDeltaSwingTableIdx_MP_2GC_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gc_n, gDeltaSwingTableIdx_MP_2GC_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gd_p, gDeltaSwingTableIdx_MP_2GD_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2gd_n, gDeltaSwingTableIdx_MP_2GD_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE); - - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_a_p, gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_a_n, gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_b_p, gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_b_n, gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_c_p, gDeltaSwingTableIdx_MP_2GCCKC_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_c_n, gDeltaSwingTableIdx_MP_2GCCKC_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_d_p, gDeltaSwingTableIdx_MP_2GCCKD_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_2g_cck_d_n, gDeltaSwingTableIdx_MP_2GCCKD_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE); - - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5ga_p, gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE*3); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5ga_n, gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE*3); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gb_p, gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE*3); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gb_n, gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE*3); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gc_p, gDeltaSwingTableIdx_MP_5GC_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE*3); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gc_n, gDeltaSwingTableIdx_MP_5GC_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE*3); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gd_p, gDeltaSwingTableIdx_MP_5GD_P_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE*3); - odm_move_memory(pDM_Odm, prf_calibrate_info->delta_swing_table_idx_5gd_n, gDeltaSwingTableIdx_MP_5GD_N_TxPowerTrack_Type5_8814A, DELTA_SWINGIDX_SIZE*3); -} - -/****************************************************************************** -* TXPWR_LMT.TXT -******************************************************************************/ - -const char *Array_MP_8814A_TXPWR_LMT[] = { - "FCC", "2.4G", "20M", "CCK", "1T", "01", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "01", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "01", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "02", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "02", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "02", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "03", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "03", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "03", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "04", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "04", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "04", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "05", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "05", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "05", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "06", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "06", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "06", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "07", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "07", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "07", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "08", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "08", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "08", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "09", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "09", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "09", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "10", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "10", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "10", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "11", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "11", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "11", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "12", "63", - "ETSI", "2.4G", "20M", "CCK", "1T", "12", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "12", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "13", "63", - "ETSI", "2.4G", "20M", "CCK", "1T", "13", "32", - "MKK", "2.4G", "20M", "CCK", "1T", "13", "32", - "FCC", "2.4G", "20M", "CCK", "1T", "14", "63", - "ETSI", "2.4G", "20M", "CCK", "1T", "14", "63", - "MKK", "2.4G", "20M", "CCK", "1T", "14", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "01", "34", - "ETSI", "2.4G", "20M", "OFDM", "1T", "01", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "01", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "02", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "02", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "02", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "03", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "03", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "03", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "04", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "04", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "04", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "05", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "05", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "05", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "06", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "06", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "06", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "07", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "07", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "07", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "08", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "08", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "08", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "09", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "09", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "09", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "10", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "10", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "10", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "11", "32", - "ETSI", "2.4G", "20M", "OFDM", "1T", "11", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "11", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "12", "63", - "ETSI", "2.4G", "20M", "OFDM", "1T", "12", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "12", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "13", "63", - "ETSI", "2.4G", "20M", "OFDM", "1T", "13", "32", - "MKK", "2.4G", "20M", "OFDM", "1T", "13", "32", - "FCC", "2.4G", "20M", "OFDM", "1T", "14", "63", - "ETSI", "2.4G", "20M", "OFDM", "1T", "14", "63", - "MKK", "2.4G", "20M", "OFDM", "1T", "14", "63", - "FCC", "2.4G", "20M", "HT", "1T", "01", "34", - "ETSI", "2.4G", "20M", "HT", "1T", "01", "32", - "MKK", "2.4G", "20M", "HT", "1T", "01", "32", - "FCC", "2.4G", "20M", "HT", "1T", "02", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "02", "32", - "MKK", "2.4G", "20M", "HT", "1T", "02", "32", - "FCC", "2.4G", "20M", "HT", "1T", "03", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "03", "32", - "MKK", "2.4G", "20M", "HT", "1T", "03", "32", - "FCC", "2.4G", "20M", "HT", "1T", "04", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "04", "32", - "MKK", "2.4G", "20M", "HT", "1T", "04", "32", - "FCC", "2.4G", "20M", "HT", "1T", "05", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "05", "32", - "MKK", "2.4G", "20M", "HT", "1T", "05", "32", - "FCC", "2.4G", "20M", "HT", "1T", "06", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "06", "32", - "MKK", "2.4G", "20M", "HT", "1T", "06", "32", - "FCC", "2.4G", "20M", "HT", "1T", "07", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "07", "32", - "MKK", "2.4G", "20M", "HT", "1T", "07", "32", - "FCC", "2.4G", "20M", "HT", "1T", "08", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "08", "32", - "MKK", "2.4G", "20M", "HT", "1T", "08", "32", - "FCC", "2.4G", "20M", "HT", "1T", "09", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "09", "32", - "MKK", "2.4G", "20M", "HT", "1T", "09", "32", - "FCC", "2.4G", "20M", "HT", "1T", "10", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "10", "32", - "MKK", "2.4G", "20M", "HT", "1T", "10", "32", - "FCC", "2.4G", "20M", "HT", "1T", "11", "32", - "ETSI", "2.4G", "20M", "HT", "1T", "11", "32", - "MKK", "2.4G", "20M", "HT", "1T", "11", "32", - "FCC", "2.4G", "20M", "HT", "1T", "12", "63", - "ETSI", "2.4G", "20M", "HT", "1T", "12", "32", - "MKK", "2.4G", "20M", "HT", "1T", "12", "32", - "FCC", "2.4G", "20M", "HT", "1T", "13", "63", - "ETSI", "2.4G", "20M", "HT", "1T", "13", "32", - "MKK", "2.4G", "20M", "HT", "1T", "13", "32", - "FCC", "2.4G", "20M", "HT", "1T", "14", "63", - "ETSI", "2.4G", "20M", "HT", "1T", "14", "63", - "MKK", "2.4G", "20M", "HT", "1T", "14", "63", - "FCC", "2.4G", "20M", "HT", "2T", "01", "32", - "ETSI", "2.4G", "20M", "HT", "2T", "01", "30", - "MKK", "2.4G", "20M", "HT", "2T", "01", "30", - "FCC", "2.4G", "20M", "HT", "2T", "02", "34", - "ETSI", "2.4G", "20M", "HT", "2T", "02", "30", - "MKK", "2.4G", "20M", "HT", "2T", "02", "30", - "FCC", "2.4G", "20M", "HT", "2T", "03", "34", - "ETSI", "2.4G", "20M", "HT", "2T", "03", "30", - "MKK", "2.4G", "20M", "HT", "2T", "03", "30", - "FCC", "2.4G", "20M", "HT", "2T", "04", "34", - "ETSI", "2.4G", "20M", "HT", "2T", "04", "30", - "MKK", "2.4G", "20M", "HT", "2T", "04", "30", - "FCC", "2.4G", "20M", "HT", "2T", "05", "34", - "ETSI", "2.4G", "20M", "HT", "2T", "05", "30", - "MKK", "2.4G", "20M", "HT", "2T", "05", "30", - "FCC", "2.4G", "20M", "HT", "2T", "06", "34", - "ETSI", "2.4G", "20M", "HT", "2T", "06", "30", - "MKK", "2.4G", "20M", "HT", "2T", "06", "30", - "FCC", "2.4G", "20M", "HT", "2T", "07", "34", - "ETSI", "2.4G", "20M", "HT", "2T", "07", "30", - "MKK", "2.4G", "20M", "HT", "2T", "07", "30", - "FCC", "2.4G", "20M", "HT", "2T", "08", "34", - "ETSI", "2.4G", "20M", "HT", "2T", "08", "30", - "MKK", "2.4G", "20M", "HT", "2T", "08", "30", - "FCC", "2.4G", "20M", "HT", "2T", "09", "34", - "ETSI", "2.4G", "20M", "HT", "2T", "09", "30", - "MKK", "2.4G", "20M", "HT", "2T", "09", "30", - "FCC", "2.4G", "20M", "HT", "2T", "10", "34", - "ETSI", "2.4G", "20M", "HT", "2T", "10", "30", - "MKK", "2.4G", "20M", "HT", "2T", "10", "30", - "FCC", "2.4G", "20M", "HT", "2T", "11", "30", - "ETSI", "2.4G", "20M", "HT", "2T", "11", "30", - "MKK", "2.4G", "20M", "HT", "2T", "11", "30", - "FCC", "2.4G", "20M", "HT", "2T", "12", "63", - "ETSI", "2.4G", "20M", "HT", "2T", "12", "30", - "MKK", "2.4G", "20M", "HT", "2T", "12", "30", - "FCC", "2.4G", "20M", "HT", "2T", "13", "63", - "ETSI", "2.4G", "20M", "HT", "2T", "13", "30", - "MKK", "2.4G", "20M", "HT", "2T", "13", "30", - "FCC", "2.4G", "20M", "HT", "2T", "14", "63", - "ETSI", "2.4G", "20M", "HT", "2T", "14", "63", - "MKK", "2.4G", "20M", "HT", "2T", "14", "63", - "FCC", "2.4G", "20M", "HT", "3T", "01", "30", - "ETSI", "2.4G", "20M", "HT", "3T", "01", "28", - "MKK", "2.4G", "20M", "HT", "3T", "01", "28", - "FCC", "2.4G", "20M", "HT", "3T", "02", "32", - "ETSI", "2.4G", "20M", "HT", "3T", "02", "28", - "MKK", "2.4G", "20M", "HT", "3T", "02", "28", - "FCC", "2.4G", "20M", "HT", "3T", "03", "32", - "ETSI", "2.4G", "20M", "HT", "3T", "03", "28", - "MKK", "2.4G", "20M", "HT", "3T", "03", "28", - "FCC", "2.4G", "20M", "HT", "3T", "04", "32", - "ETSI", "2.4G", "20M", "HT", "3T", "04", "28", - "MKK", "2.4G", "20M", "HT", "3T", "04", "28", - "FCC", "2.4G", "20M", "HT", "3T", "05", "32", - "ETSI", "2.4G", "20M", "HT", "3T", "05", "28", - "MKK", "2.4G", "20M", "HT", "3T", "05", "28", - "FCC", "2.4G", "20M", "HT", "3T", "06", "32", - "ETSI", "2.4G", "20M", "HT", "3T", "06", "28", - "MKK", "2.4G", "20M", "HT", "3T", "06", "28", - "FCC", "2.4G", "20M", "HT", "3T", "07", "32", - "ETSI", "2.4G", "20M", "HT", "3T", "07", "28", - "MKK", "2.4G", "20M", "HT", "3T", "07", "28", - "FCC", "2.4G", "20M", "HT", "3T", "08", "32", - "ETSI", "2.4G", "20M", "HT", "3T", "08", "28", - "MKK", "2.4G", "20M", "HT", "3T", "08", "28", - "FCC", "2.4G", "20M", "HT", "3T", "09", "32", - "ETSI", "2.4G", "20M", "HT", "3T", "09", "28", - "MKK", "2.4G", "20M", "HT", "3T", "09", "28", - "FCC", "2.4G", "20M", "HT", "3T", "10", "32", - "ETSI", "2.4G", "20M", "HT", "3T", "10", "28", - "MKK", "2.4G", "20M", "HT", "3T", "10", "28", - "FCC", "2.4G", "20M", "HT", "3T", "11", "28", - "ETSI", "2.4G", "20M", "HT", "3T", "11", "28", - "MKK", "2.4G", "20M", "HT", "3T", "11", "28", - "FCC", "2.4G", "20M", "HT", "3T", "12", "63", - "ETSI", "2.4G", "20M", "HT", "3T", "12", "28", - "MKK", "2.4G", "20M", "HT", "3T", "12", "28", - "FCC", "2.4G", "20M", "HT", "3T", "13", "63", - "ETSI", "2.4G", "20M", "HT", "3T", "13", "28", - "MKK", "2.4G", "20M", "HT", "3T", "13", "28", - "FCC", "2.4G", "20M", "HT", "3T", "14", "63", - "ETSI", "2.4G", "20M", "HT", "3T", "14", "63", - "MKK", "2.4G", "20M", "HT", "3T", "14", "63", - "FCC", "2.4G", "20M", "HT", "4T", "01", "28", - "ETSI", "2.4G", "20M", "HT", "4T", "01", "26", - "MKK", "2.4G", "20M", "HT", "4T", "01", "26", - "FCC", "2.4G", "20M", "HT", "4T", "02", "30", - "ETSI", "2.4G", "20M", "HT", "4T", "02", "26", - "MKK", "2.4G", "20M", "HT", "4T", "02", "26", - "FCC", "2.4G", "20M", "HT", "4T", "03", "30", - "ETSI", "2.4G", "20M", "HT", "4T", "03", "26", - "MKK", "2.4G", "20M", "HT", "4T", "03", "26", - "FCC", "2.4G", "20M", "HT", "4T", "04", "30", - "ETSI", "2.4G", "20M", "HT", "4T", "04", "26", - "MKK", "2.4G", "20M", "HT", "4T", "04", "26", - "FCC", "2.4G", "20M", "HT", "4T", "05", "30", - "ETSI", "2.4G", "20M", "HT", "4T", "05", "26", - "MKK", "2.4G", "20M", "HT", "4T", "05", "26", - "FCC", "2.4G", "20M", "HT", "4T", "06", "30", - "ETSI", "2.4G", "20M", "HT", "4T", "06", "26", - "MKK", "2.4G", "20M", "HT", "4T", "06", "26", - "FCC", "2.4G", "20M", "HT", "4T", "07", "30", - "ETSI", "2.4G", "20M", "HT", "4T", "07", "26", - "MKK", "2.4G", "20M", "HT", "4T", "07", "26", - "FCC", "2.4G", "20M", "HT", "4T", "08", "30", - "ETSI", "2.4G", "20M", "HT", "4T", "08", "26", - "MKK", "2.4G", "20M", "HT", "4T", "08", "26", - "FCC", "2.4G", "20M", "HT", "4T", "09", "30", - "ETSI", "2.4G", "20M", "HT", "4T", "09", "26", - "MKK", "2.4G", "20M", "HT", "4T", "09", "26", - "FCC", "2.4G", "20M", "HT", "4T", "10", "30", - "ETSI", "2.4G", "20M", "HT", "4T", "10", "26", - "MKK", "2.4G", "20M", "HT", "4T", "10", "26", - "FCC", "2.4G", "20M", "HT", "4T", "11", "26", - "ETSI", "2.4G", "20M", "HT", "4T", "11", "26", - "MKK", "2.4G", "20M", "HT", "4T", "11", "26", - "FCC", "2.4G", "20M", "HT", "4T", "12", "63", - "ETSI", "2.4G", "20M", "HT", "4T", "12", "26", - "MKK", "2.4G", "20M", "HT", "4T", "12", "26", - "FCC", "2.4G", "20M", "HT", "4T", "13", "63", - "ETSI", "2.4G", "20M", "HT", "4T", "13", "26", - "MKK", "2.4G", "20M", "HT", "4T", "13", "26", - "FCC", "2.4G", "20M", "HT", "4T", "14", "63", - "ETSI", "2.4G", "20M", "HT", "4T", "14", "63", - "MKK", "2.4G", "20M", "HT", "4T", "14", "63", - "FCC", "2.4G", "40M", "HT", "1T", "01", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "01", "63", - "MKK", "2.4G", "40M", "HT", "1T", "01", "63", - "FCC", "2.4G", "40M", "HT", "1T", "02", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "02", "63", - "MKK", "2.4G", "40M", "HT", "1T", "02", "63", - "FCC", "2.4G", "40M", "HT", "1T", "03", "32", - "ETSI", "2.4G", "40M", "HT", "1T", "03", "32", - "MKK", "2.4G", "40M", "HT", "1T", "03", "32", - "FCC", "2.4G", "40M", "HT", "1T", "04", "36", - "ETSI", "2.4G", "40M", "HT", "1T", "04", "32", - "MKK", "2.4G", "40M", "HT", "1T", "04", "32", - "FCC", "2.4G", "40M", "HT", "1T", "05", "36", - "ETSI", "2.4G", "40M", "HT", "1T", "05", "32", - "MKK", "2.4G", "40M", "HT", "1T", "05", "32", - "FCC", "2.4G", "40M", "HT", "1T", "06", "36", - "ETSI", "2.4G", "40M", "HT", "1T", "06", "32", - "MKK", "2.4G", "40M", "HT", "1T", "06", "32", - "FCC", "2.4G", "40M", "HT", "1T", "07", "36", - "ETSI", "2.4G", "40M", "HT", "1T", "07", "32", - "MKK", "2.4G", "40M", "HT", "1T", "07", "32", - "FCC", "2.4G", "40M", "HT", "1T", "08", "36", - "ETSI", "2.4G", "40M", "HT", "1T", "08", "32", - "MKK", "2.4G", "40M", "HT", "1T", "08", "32", - "FCC", "2.4G", "40M", "HT", "1T", "09", "36", - "ETSI", "2.4G", "40M", "HT", "1T", "09", "32", - "MKK", "2.4G", "40M", "HT", "1T", "09", "32", - "FCC", "2.4G", "40M", "HT", "1T", "10", "36", - "ETSI", "2.4G", "40M", "HT", "1T", "10", "32", - "MKK", "2.4G", "40M", "HT", "1T", "10", "32", - "FCC", "2.4G", "40M", "HT", "1T", "11", "32", - "ETSI", "2.4G", "40M", "HT", "1T", "11", "32", - "MKK", "2.4G", "40M", "HT", "1T", "11", "32", - "FCC", "2.4G", "40M", "HT", "1T", "12", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "12", "32", - "MKK", "2.4G", "40M", "HT", "1T", "12", "32", - "FCC", "2.4G", "40M", "HT", "1T", "13", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "13", "32", - "MKK", "2.4G", "40M", "HT", "1T", "13", "32", - "FCC", "2.4G", "40M", "HT", "1T", "14", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "14", "63", - "MKK", "2.4G", "40M", "HT", "1T", "14", "63", - "FCC", "2.4G", "40M", "HT", "2T", "01", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "01", "63", - "MKK", "2.4G", "40M", "HT", "2T", "01", "63", - "FCC", "2.4G", "40M", "HT", "2T", "02", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "02", "63", - "MKK", "2.4G", "40M", "HT", "2T", "02", "63", - "FCC", "2.4G", "40M", "HT", "2T", "03", "30", - "ETSI", "2.4G", "40M", "HT", "2T", "03", "30", - "MKK", "2.4G", "40M", "HT", "2T", "03", "30", - "FCC", "2.4G", "40M", "HT", "2T", "04", "34", - "ETSI", "2.4G", "40M", "HT", "2T", "04", "30", - "MKK", "2.4G", "40M", "HT", "2T", "04", "30", - "FCC", "2.4G", "40M", "HT", "2T", "05", "34", - "ETSI", "2.4G", "40M", "HT", "2T", "05", "30", - "MKK", "2.4G", "40M", "HT", "2T", "05", "30", - "FCC", "2.4G", "40M", "HT", "2T", "06", "34", - "ETSI", "2.4G", "40M", "HT", "2T", "06", "30", - "MKK", "2.4G", "40M", "HT", "2T", "06", "30", - "FCC", "2.4G", "40M", "HT", "2T", "07", "34", - "ETSI", "2.4G", "40M", "HT", "2T", "07", "30", - "MKK", "2.4G", "40M", "HT", "2T", "07", "30", - "FCC", "2.4G", "40M", "HT", "2T", "08", "34", - "ETSI", "2.4G", "40M", "HT", "2T", "08", "30", - "MKK", "2.4G", "40M", "HT", "2T", "08", "30", - "FCC", "2.4G", "40M", "HT", "2T", "09", "34", - "ETSI", "2.4G", "40M", "HT", "2T", "09", "30", - "MKK", "2.4G", "40M", "HT", "2T", "09", "30", - "FCC", "2.4G", "40M", "HT", "2T", "10", "34", - "ETSI", "2.4G", "40M", "HT", "2T", "10", "30", - "MKK", "2.4G", "40M", "HT", "2T", "10", "30", - "FCC", "2.4G", "40M", "HT", "2T", "11", "30", - "ETSI", "2.4G", "40M", "HT", "2T", "11", "30", - "MKK", "2.4G", "40M", "HT", "2T", "11", "30", - "FCC", "2.4G", "40M", "HT", "2T", "12", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "12", "30", - "MKK", "2.4G", "40M", "HT", "2T", "12", "30", - "FCC", "2.4G", "40M", "HT", "2T", "13", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "13", "30", - "MKK", "2.4G", "40M", "HT", "2T", "13", "30", - "FCC", "2.4G", "40M", "HT", "2T", "14", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "14", "63", - "MKK", "2.4G", "40M", "HT", "2T", "14", "63", - "FCC", "2.4G", "40M", "HT", "3T", "01", "63", - "ETSI", "2.4G", "40M", "HT", "3T", "01", "63", - "MKK", "2.4G", "40M", "HT", "3T", "01", "63", - "FCC", "2.4G", "40M", "HT", "3T", "02", "63", - "ETSI", "2.4G", "40M", "HT", "3T", "02", "63", - "MKK", "2.4G", "40M", "HT", "3T", "02", "63", - "FCC", "2.4G", "40M", "HT", "3T", "03", "28", - "ETSI", "2.4G", "40M", "HT", "3T", "03", "28", - "MKK", "2.4G", "40M", "HT", "3T", "03", "28", - "FCC", "2.4G", "40M", "HT", "3T", "04", "32", - "ETSI", "2.4G", "40M", "HT", "3T", "04", "28", - "MKK", "2.4G", "40M", "HT", "3T", "04", "28", - "FCC", "2.4G", "40M", "HT", "3T", "05", "32", - "ETSI", "2.4G", "40M", "HT", "3T", "05", "28", - "MKK", "2.4G", "40M", "HT", "3T", "05", "28", - "FCC", "2.4G", "40M", "HT", "3T", "06", "32", - "ETSI", "2.4G", "40M", "HT", "3T", "06", "28", - "MKK", "2.4G", "40M", "HT", "3T", "06", "28", - "FCC", "2.4G", "40M", "HT", "3T", "07", "32", - "ETSI", "2.4G", "40M", "HT", "3T", "07", "28", - "MKK", "2.4G", "40M", "HT", "3T", "07", "28", - "FCC", "2.4G", "40M", "HT", "3T", "08", "32", - "ETSI", "2.4G", "40M", "HT", "3T", "08", "28", - "MKK", "2.4G", "40M", "HT", "3T", "08", "28", - "FCC", "2.4G", "40M", "HT", "3T", "09", "32", - "ETSI", "2.4G", "40M", "HT", "3T", "09", "28", - "MKK", "2.4G", "40M", "HT", "3T", "09", "28", - "FCC", "2.4G", "40M", "HT", "3T", "10", "32", - "ETSI", "2.4G", "40M", "HT", "3T", "10", "28", - "MKK", "2.4G", "40M", "HT", "3T", "10", "28", - "FCC", "2.4G", "40M", "HT", "3T", "11", "28", - "ETSI", "2.4G", "40M", "HT", "3T", "11", "28", - "MKK", "2.4G", "40M", "HT", "3T", "11", "28", - "FCC", "2.4G", "40M", "HT", "3T", "12", "63", - "ETSI", "2.4G", "40M", "HT", "3T", "12", "28", - "MKK", "2.4G", "40M", "HT", "3T", "12", "28", - "FCC", "2.4G", "40M", "HT", "3T", "13", "63", - "ETSI", "2.4G", "40M", "HT", "3T", "13", "28", - "MKK", "2.4G", "40M", "HT", "3T", "13", "28", - "FCC", "2.4G", "40M", "HT", "3T", "14", "63", - "ETSI", "2.4G", "40M", "HT", "3T", "14", "63", - "MKK", "2.4G", "40M", "HT", "3T", "14", "63", - "FCC", "2.4G", "40M", "HT", "4T", "01", "63", - "ETSI", "2.4G", "40M", "HT", "4T", "01", "63", - "MKK", "2.4G", "40M", "HT", "4T", "01", "63", - "FCC", "2.4G", "40M", "HT", "4T", "02", "63", - "ETSI", "2.4G", "40M", "HT", "4T", "02", "63", - "MKK", "2.4G", "40M", "HT", "4T", "02", "63", - "FCC", "2.4G", "40M", "HT", "4T", "03", "26", - "ETSI", "2.4G", "40M", "HT", "4T", "03", "26", - "MKK", "2.4G", "40M", "HT", "4T", "03", "26", - "FCC", "2.4G", "40M", "HT", "4T", "04", "30", - "ETSI", "2.4G", "40M", "HT", "4T", "04", "26", - "MKK", "2.4G", "40M", "HT", "4T", "04", "26", - "FCC", "2.4G", "40M", "HT", "4T", "05", "30", - "ETSI", "2.4G", "40M", "HT", "4T", "05", "26", - "MKK", "2.4G", "40M", "HT", "4T", "05", "26", - "FCC", "2.4G", "40M", "HT", "4T", "06", "30", - "ETSI", "2.4G", "40M", "HT", "4T", "06", "26", - "MKK", "2.4G", "40M", "HT", "4T", "06", "26", - "FCC", "2.4G", "40M", "HT", "4T", "07", "30", - "ETSI", "2.4G", "40M", "HT", "4T", "07", "26", - "MKK", "2.4G", "40M", "HT", "4T", "07", "26", - "FCC", "2.4G", "40M", "HT", "4T", "08", "30", - "ETSI", "2.4G", "40M", "HT", "4T", "08", "26", - "MKK", "2.4G", "40M", "HT", "4T", "08", "26", - "FCC", "2.4G", "40M", "HT", "4T", "09", "30", - "ETSI", "2.4G", "40M", "HT", "4T", "09", "26", - "MKK", "2.4G", "40M", "HT", "4T", "09", "26", - "FCC", "2.4G", "40M", "HT", "4T", "10", "30", - "ETSI", "2.4G", "40M", "HT", "4T", "10", "26", - "MKK", "2.4G", "40M", "HT", "4T", "10", "26", - "FCC", "2.4G", "40M", "HT", "4T", "11", "26", - "ETSI", "2.4G", "40M", "HT", "4T", "11", "26", - "MKK", "2.4G", "40M", "HT", "4T", "11", "26", - "FCC", "2.4G", "40M", "HT", "4T", "12", "63", - "ETSI", "2.4G", "40M", "HT", "4T", "12", "26", - "MKK", "2.4G", "40M", "HT", "4T", "12", "26", - "FCC", "2.4G", "40M", "HT", "4T", "13", "63", - "ETSI", "2.4G", "40M", "HT", "4T", "13", "26", - "MKK", "2.4G", "40M", "HT", "4T", "13", "26", - "FCC", "2.4G", "40M", "HT", "4T", "14", "63", - "ETSI", "2.4G", "40M", "HT", "4T", "14", "63", - "MKK", "2.4G", "40M", "HT", "4T", "14", "63", - "FCC", "5G", "20M", "OFDM", "1T", "36", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "36", "32", - "MKK", "5G", "20M", "OFDM", "1T", "36", "32", - "FCC", "5G", "20M", "OFDM", "1T", "40", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "40", "32", - "MKK", "5G", "20M", "OFDM", "1T", "40", "32", - "FCC", "5G", "20M", "OFDM", "1T", "44", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "44", "32", - "MKK", "5G", "20M", "OFDM", "1T", "44", "32", - "FCC", "5G", "20M", "OFDM", "1T", "48", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "48", "32", - "MKK", "5G", "20M", "OFDM", "1T", "48", "32", - "FCC", "5G", "20M", "OFDM", "1T", "52", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "52", "32", - "MKK", "5G", "20M", "OFDM", "1T", "52", "32", - "FCC", "5G", "20M", "OFDM", "1T", "56", "34", - "ETSI", "5G", "20M", "OFDM", "1T", "56", "32", - "MKK", "5G", "20M", "OFDM", "1T", "56", "32", - "FCC", "5G", "20M", "OFDM", "1T", "60", "32", - "ETSI", "5G", "20M", "OFDM", "1T", "60", "32", - "MKK", "5G", "20M", "OFDM", "1T", "60", "32", - "FCC", "5G", "20M", "OFDM", "1T", "64", "28", - "ETSI", "5G", "20M", "OFDM", "1T", "64", "32", - "MKK", "5G", "20M", "OFDM", "1T", "64", "32", - "FCC", "5G", "20M", "OFDM", "1T", "100", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "100", "32", - "MKK", "5G", "20M", "OFDM", "1T", "100", "32", - "FCC", "5G", "20M", "OFDM", "1T", "104", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "104", "32", - "MKK", "5G", "20M", "OFDM", "1T", "104", "32", - "FCC", "5G", "20M", "OFDM", "1T", "108", "32", - "ETSI", "5G", "20M", "OFDM", "1T", "108", "32", - "MKK", "5G", "20M", "OFDM", "1T", "108", "32", - "FCC", "5G", "20M", "OFDM", "1T", "112", "34", - "ETSI", "5G", "20M", "OFDM", "1T", "112", "32", - "MKK", "5G", "20M", "OFDM", "1T", "112", "32", - "FCC", "5G", "20M", "OFDM", "1T", "116", "34", - "ETSI", "5G", "20M", "OFDM", "1T", "116", "32", - "MKK", "5G", "20M", "OFDM", "1T", "116", "32", - "FCC", "5G", "20M", "OFDM", "1T", "120", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "120", "32", - "MKK", "5G", "20M", "OFDM", "1T", "120", "32", - "FCC", "5G", "20M", "OFDM", "1T", "124", "34", - "ETSI", "5G", "20M", "OFDM", "1T", "124", "32", - "MKK", "5G", "20M", "OFDM", "1T", "124", "32", - "FCC", "5G", "20M", "OFDM", "1T", "128", "32", - "ETSI", "5G", "20M", "OFDM", "1T", "128", "32", - "MKK", "5G", "20M", "OFDM", "1T", "128", "32", - "FCC", "5G", "20M", "OFDM", "1T", "132", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "132", "32", - "MKK", "5G", "20M", "OFDM", "1T", "132", "32", - "FCC", "5G", "20M", "OFDM", "1T", "136", "30", - "ETSI", "5G", "20M", "OFDM", "1T", "136", "32", - "MKK", "5G", "20M", "OFDM", "1T", "136", "32", - "FCC", "5G", "20M", "OFDM", "1T", "140", "28", - "ETSI", "5G", "20M", "OFDM", "1T", "140", "32", - "MKK", "5G", "20M", "OFDM", "1T", "140", "32", - "FCC", "5G", "20M", "OFDM", "1T", "149", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "149", "32", - "MKK", "5G", "20M", "OFDM", "1T", "149", "63", - "FCC", "5G", "20M", "OFDM", "1T", "153", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "153", "32", - "MKK", "5G", "20M", "OFDM", "1T", "153", "63", - "FCC", "5G", "20M", "OFDM", "1T", "157", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "157", "32", - "MKK", "5G", "20M", "OFDM", "1T", "157", "63", - "FCC", "5G", "20M", "OFDM", "1T", "161", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "161", "32", - "MKK", "5G", "20M", "OFDM", "1T", "161", "63", - "FCC", "5G", "20M", "OFDM", "1T", "165", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "165", "32", - "MKK", "5G", "20M", "OFDM", "1T", "165", "63", - "FCC", "5G", "20M", "HT", "1T", "36", "30", - "ETSI", "5G", "20M", "HT", "1T", "36", "32", - "MKK", "5G", "20M", "HT", "1T", "36", "32", - "FCC", "5G", "20M", "HT", "1T", "40", "30", - "ETSI", "5G", "20M", "HT", "1T", "40", "32", - "MKK", "5G", "20M", "HT", "1T", "40", "32", - "FCC", "5G", "20M", "HT", "1T", "44", "30", - "ETSI", "5G", "20M", "HT", "1T", "44", "32", - "MKK", "5G", "20M", "HT", "1T", "44", "32", - "FCC", "5G", "20M", "HT", "1T", "48", "30", - "ETSI", "5G", "20M", "HT", "1T", "48", "32", - "MKK", "5G", "20M", "HT", "1T", "48", "32", - "FCC", "5G", "20M", "HT", "1T", "52", "36", - "ETSI", "5G", "20M", "HT", "1T", "52", "32", - "MKK", "5G", "20M", "HT", "1T", "52", "32", - "FCC", "5G", "20M", "HT", "1T", "56", "34", - "ETSI", "5G", "20M", "HT", "1T", "56", "32", - "MKK", "5G", "20M", "HT", "1T", "56", "32", - "FCC", "5G", "20M", "HT", "1T", "60", "32", - "ETSI", "5G", "20M", "HT", "1T", "60", "32", - "MKK", "5G", "20M", "HT", "1T", "60", "32", - "FCC", "5G", "20M", "HT", "1T", "64", "28", - "ETSI", "5G", "20M", "HT", "1T", "64", "32", - "MKK", "5G", "20M", "HT", "1T", "64", "32", - "FCC", "5G", "20M", "HT", "1T", "100", "30", - "ETSI", "5G", "20M", "HT", "1T", "100", "32", - "MKK", "5G", "20M", "HT", "1T", "100", "32", - "FCC", "5G", "20M", "HT", "1T", "104", "30", - "ETSI", "5G", "20M", "HT", "1T", "104", "32", - "MKK", "5G", "20M", "HT", "1T", "104", "32", - "FCC", "5G", "20M", "HT", "1T", "108", "32", - "ETSI", "5G", "20M", "HT", "1T", "108", "32", - "MKK", "5G", "20M", "HT", "1T", "108", "32", - "FCC", "5G", "20M", "HT", "1T", "112", "34", - "ETSI", "5G", "20M", "HT", "1T", "112", "32", - "MKK", "5G", "20M", "HT", "1T", "112", "32", - "FCC", "5G", "20M", "HT", "1T", "116", "34", - "ETSI", "5G", "20M", "HT", "1T", "116", "32", - "MKK", "5G", "20M", "HT", "1T", "116", "32", - "FCC", "5G", "20M", "HT", "1T", "120", "36", - "ETSI", "5G", "20M", "HT", "1T", "120", "32", - "MKK", "5G", "20M", "HT", "1T", "120", "32", - "FCC", "5G", "20M", "HT", "1T", "124", "34", - "ETSI", "5G", "20M", "HT", "1T", "124", "32", - "MKK", "5G", "20M", "HT", "1T", "124", "32", - "FCC", "5G", "20M", "HT", "1T", "128", "32", - "ETSI", "5G", "20M", "HT", "1T", "128", "32", - "MKK", "5G", "20M", "HT", "1T", "128", "32", - "FCC", "5G", "20M", "HT", "1T", "132", "30", - "ETSI", "5G", "20M", "HT", "1T", "132", "32", - "MKK", "5G", "20M", "HT", "1T", "132", "32", - "FCC", "5G", "20M", "HT", "1T", "136", "30", - "ETSI", "5G", "20M", "HT", "1T", "136", "32", - "MKK", "5G", "20M", "HT", "1T", "136", "32", - "FCC", "5G", "20M", "HT", "1T", "140", "28", - "ETSI", "5G", "20M", "HT", "1T", "140", "32", - "MKK", "5G", "20M", "HT", "1T", "140", "32", - "FCC", "5G", "20M", "HT", "1T", "149", "36", - "ETSI", "5G", "20M", "HT", "1T", "149", "32", - "MKK", "5G", "20M", "HT", "1T", "149", "63", - "FCC", "5G", "20M", "HT", "1T", "153", "36", - "ETSI", "5G", "20M", "HT", "1T", "153", "32", - "MKK", "5G", "20M", "HT", "1T", "153", "63", - "FCC", "5G", "20M", "HT", "1T", "157", "36", - "ETSI", "5G", "20M", "HT", "1T", "157", "32", - "MKK", "5G", "20M", "HT", "1T", "157", "63", - "FCC", "5G", "20M", "HT", "1T", "161", "36", - "ETSI", "5G", "20M", "HT", "1T", "161", "32", - "MKK", "5G", "20M", "HT", "1T", "161", "63", - "FCC", "5G", "20M", "HT", "1T", "165", "36", - "ETSI", "5G", "20M", "HT", "1T", "165", "32", - "MKK", "5G", "20M", "HT", "1T", "165", "63", - "FCC", "5G", "20M", "HT", "2T", "36", "28", - "ETSI", "5G", "20M", "HT", "2T", "36", "30", - "MKK", "5G", "20M", "HT", "2T", "36", "30", - "FCC", "5G", "20M", "HT", "2T", "40", "28", - "ETSI", "5G", "20M", "HT", "2T", "40", "30", - "MKK", "5G", "20M", "HT", "2T", "40", "30", - "FCC", "5G", "20M", "HT", "2T", "44", "28", - "ETSI", "5G", "20M", "HT", "2T", "44", "30", - "MKK", "5G", "20M", "HT", "2T", "44", "30", - "FCC", "5G", "20M", "HT", "2T", "48", "28", - "ETSI", "5G", "20M", "HT", "2T", "48", "30", - "MKK", "5G", "20M", "HT", "2T", "48", "30", - "FCC", "5G", "20M", "HT", "2T", "52", "34", - "ETSI", "5G", "20M", "HT", "2T", "52", "30", - "MKK", "5G", "20M", "HT", "2T", "52", "30", - "FCC", "5G", "20M", "HT", "2T", "56", "32", - "ETSI", "5G", "20M", "HT", "2T", "56", "30", - "MKK", "5G", "20M", "HT", "2T", "56", "30", - "FCC", "5G", "20M", "HT", "2T", "60", "30", - "ETSI", "5G", "20M", "HT", "2T", "60", "30", - "MKK", "5G", "20M", "HT", "2T", "60", "30", - "FCC", "5G", "20M", "HT", "2T", "64", "26", - "ETSI", "5G", "20M", "HT", "2T", "64", "30", - "MKK", "5G", "20M", "HT", "2T", "64", "30", - "FCC", "5G", "20M", "HT", "2T", "100", "28", - "ETSI", "5G", "20M", "HT", "2T", "100", "30", - "MKK", "5G", "20M", "HT", "2T", "100", "30", - "FCC", "5G", "20M", "HT", "2T", "104", "28", - "ETSI", "5G", "20M", "HT", "2T", "104", "30", - "MKK", "5G", "20M", "HT", "2T", "104", "30", - "FCC", "5G", "20M", "HT", "2T", "108", "30", - "ETSI", "5G", "20M", "HT", "2T", "108", "30", - "MKK", "5G", "20M", "HT", "2T", "108", "30", - "FCC", "5G", "20M", "HT", "2T", "112", "32", - "ETSI", "5G", "20M", "HT", "2T", "112", "30", - "MKK", "5G", "20M", "HT", "2T", "112", "30", - "FCC", "5G", "20M", "HT", "2T", "116", "32", - "ETSI", "5G", "20M", "HT", "2T", "116", "30", - "MKK", "5G", "20M", "HT", "2T", "116", "30", - "FCC", "5G", "20M", "HT", "2T", "120", "34", - "ETSI", "5G", "20M", "HT", "2T", "120", "30", - "MKK", "5G", "20M", "HT", "2T", "120", "30", - "FCC", "5G", "20M", "HT", "2T", "124", "32", - "ETSI", "5G", "20M", "HT", "2T", "124", "30", - "MKK", "5G", "20M", "HT", "2T", "124", "30", - "FCC", "5G", "20M", "HT", "2T", "128", "30", - "ETSI", "5G", "20M", "HT", "2T", "128", "30", - "MKK", "5G", "20M", "HT", "2T", "128", "30", - "FCC", "5G", "20M", "HT", "2T", "132", "28", - "ETSI", "5G", "20M", "HT", "2T", "132", "30", - "MKK", "5G", "20M", "HT", "2T", "132", "30", - "FCC", "5G", "20M", "HT", "2T", "136", "28", - "ETSI", "5G", "20M", "HT", "2T", "136", "30", - "MKK", "5G", "20M", "HT", "2T", "136", "30", - "FCC", "5G", "20M", "HT", "2T", "140", "26", - "ETSI", "5G", "20M", "HT", "2T", "140", "30", - "MKK", "5G", "20M", "HT", "2T", "140", "30", - "FCC", "5G", "20M", "HT", "2T", "149", "34", - "ETSI", "5G", "20M", "HT", "2T", "149", "30", - "MKK", "5G", "20M", "HT", "2T", "149", "63", - "FCC", "5G", "20M", "HT", "2T", "153", "34", - "ETSI", "5G", "20M", "HT", "2T", "153", "30", - "MKK", "5G", "20M", "HT", "2T", "153", "63", - "FCC", "5G", "20M", "HT", "2T", "157", "34", - "ETSI", "5G", "20M", "HT", "2T", "157", "30", - "MKK", "5G", "20M", "HT", "2T", "157", "63", - "FCC", "5G", "20M", "HT", "2T", "161", "34", - "ETSI", "5G", "20M", "HT", "2T", "161", "30", - "MKK", "5G", "20M", "HT", "2T", "161", "63", - "FCC", "5G", "20M", "HT", "2T", "165", "34", - "ETSI", "5G", "20M", "HT", "2T", "165", "30", - "MKK", "5G", "20M", "HT", "2T", "165", "63", - "FCC", "5G", "20M", "HT", "3T", "36", "26", - "ETSI", "5G", "20M", "HT", "3T", "36", "28", - "MKK", "5G", "20M", "HT", "3T", "36", "28", - "FCC", "5G", "20M", "HT", "3T", "40", "26", - "ETSI", "5G", "20M", "HT", "3T", "40", "28", - "MKK", "5G", "20M", "HT", "3T", "40", "28", - "FCC", "5G", "20M", "HT", "3T", "44", "26", - "ETSI", "5G", "20M", "HT", "3T", "44", "28", - "MKK", "5G", "20M", "HT", "3T", "44", "28", - "FCC", "5G", "20M", "HT", "3T", "48", "26", - "ETSI", "5G", "20M", "HT", "3T", "48", "28", - "MKK", "5G", "20M", "HT", "3T", "48", "28", - "FCC", "5G", "20M", "HT", "3T", "52", "32", - "ETSI", "5G", "20M", "HT", "3T", "52", "28", - "MKK", "5G", "20M", "HT", "3T", "52", "28", - "FCC", "5G", "20M", "HT", "3T", "56", "30", - "ETSI", "5G", "20M", "HT", "3T", "56", "28", - "MKK", "5G", "20M", "HT", "3T", "56", "28", - "FCC", "5G", "20M", "HT", "3T", "60", "28", - "ETSI", "5G", "20M", "HT", "3T", "60", "28", - "MKK", "5G", "20M", "HT", "3T", "60", "28", - "FCC", "5G", "20M", "HT", "3T", "64", "24", - "ETSI", "5G", "20M", "HT", "3T", "64", "28", - "MKK", "5G", "20M", "HT", "3T", "64", "28", - "FCC", "5G", "20M", "HT", "3T", "100", "26", - "ETSI", "5G", "20M", "HT", "3T", "100", "28", - "MKK", "5G", "20M", "HT", "3T", "100", "28", - "FCC", "5G", "20M", "HT", "3T", "104", "26", - "ETSI", "5G", "20M", "HT", "3T", "104", "28", - "MKK", "5G", "20M", "HT", "3T", "104", "28", - "FCC", "5G", "20M", "HT", "3T", "108", "28", - "ETSI", "5G", "20M", "HT", "3T", "108", "28", - "MKK", "5G", "20M", "HT", "3T", "108", "28", - "FCC", "5G", "20M", "HT", "3T", "112", "30", - "ETSI", "5G", "20M", "HT", "3T", "112", "28", - "MKK", "5G", "20M", "HT", "3T", "112", "28", - "FCC", "5G", "20M", "HT", "3T", "116", "30", - "ETSI", "5G", "20M", "HT", "3T", "116", "28", - "MKK", "5G", "20M", "HT", "3T", "116", "28", - "FCC", "5G", "20M", "HT", "3T", "120", "32", - "ETSI", "5G", "20M", "HT", "3T", "120", "28", - "MKK", "5G", "20M", "HT", "3T", "120", "28", - "FCC", "5G", "20M", "HT", "3T", "124", "30", - "ETSI", "5G", "20M", "HT", "3T", "124", "28", - "MKK", "5G", "20M", "HT", "3T", "124", "28", - "FCC", "5G", "20M", "HT", "3T", "128", "28", - "ETSI", "5G", "20M", "HT", "3T", "128", "28", - "MKK", "5G", "20M", "HT", "3T", "128", "28", - "FCC", "5G", "20M", "HT", "3T", "132", "26", - "ETSI", "5G", "20M", "HT", "3T", "132", "28", - "MKK", "5G", "20M", "HT", "3T", "132", "28", - "FCC", "5G", "20M", "HT", "3T", "136", "26", - "ETSI", "5G", "20M", "HT", "3T", "136", "28", - "MKK", "5G", "20M", "HT", "3T", "136", "28", - "FCC", "5G", "20M", "HT", "3T", "140", "24", - "ETSI", "5G", "20M", "HT", "3T", "140", "28", - "MKK", "5G", "20M", "HT", "3T", "140", "28", - "FCC", "5G", "20M", "HT", "3T", "149", "32", - "ETSI", "5G", "20M", "HT", "3T", "149", "28", - "MKK", "5G", "20M", "HT", "3T", "149", "63", - "FCC", "5G", "20M", "HT", "3T", "153", "32", - "ETSI", "5G", "20M", "HT", "3T", "153", "28", - "MKK", "5G", "20M", "HT", "3T", "153", "63", - "FCC", "5G", "20M", "HT", "3T", "157", "32", - "ETSI", "5G", "20M", "HT", "3T", "157", "28", - "MKK", "5G", "20M", "HT", "3T", "157", "63", - "FCC", "5G", "20M", "HT", "3T", "161", "32", - "ETSI", "5G", "20M", "HT", "3T", "161", "28", - "MKK", "5G", "20M", "HT", "3T", "161", "63", - "FCC", "5G", "20M", "HT", "3T", "165", "32", - "ETSI", "5G", "20M", "HT", "3T", "165", "28", - "MKK", "5G", "20M", "HT", "3T", "165", "63", - "FCC", "5G", "20M", "HT", "4T", "36", "24", - "ETSI", "5G", "20M", "HT", "4T", "36", "26", - "MKK", "5G", "20M", "HT", "4T", "36", "26", - "FCC", "5G", "20M", "HT", "4T", "40", "24", - "ETSI", "5G", "20M", "HT", "4T", "40", "26", - "MKK", "5G", "20M", "HT", "4T", "40", "26", - "FCC", "5G", "20M", "HT", "4T", "44", "24", - "ETSI", "5G", "20M", "HT", "4T", "44", "26", - "MKK", "5G", "20M", "HT", "4T", "44", "26", - "FCC", "5G", "20M", "HT", "4T", "48", "24", - "ETSI", "5G", "20M", "HT", "4T", "48", "26", - "MKK", "5G", "20M", "HT", "4T", "48", "26", - "FCC", "5G", "20M", "HT", "4T", "52", "30", - "ETSI", "5G", "20M", "HT", "4T", "52", "26", - "MKK", "5G", "20M", "HT", "4T", "52", "26", - "FCC", "5G", "20M", "HT", "4T", "56", "28", - "ETSI", "5G", "20M", "HT", "4T", "56", "26", - "MKK", "5G", "20M", "HT", "4T", "56", "26", - "FCC", "5G", "20M", "HT", "4T", "60", "26", - "ETSI", "5G", "20M", "HT", "4T", "60", "26", - "MKK", "5G", "20M", "HT", "4T", "60", "26", - "FCC", "5G", "20M", "HT", "4T", "64", "22", - "ETSI", "5G", "20M", "HT", "4T", "64", "26", - "MKK", "5G", "20M", "HT", "4T", "64", "26", - "FCC", "5G", "20M", "HT", "4T", "100", "24", - "ETSI", "5G", "20M", "HT", "4T", "100", "26", - "MKK", "5G", "20M", "HT", "4T", "100", "26", - "FCC", "5G", "20M", "HT", "4T", "104", "24", - "ETSI", "5G", "20M", "HT", "4T", "104", "26", - "MKK", "5G", "20M", "HT", "4T", "104", "26", - "FCC", "5G", "20M", "HT", "4T", "108", "26", - "ETSI", "5G", "20M", "HT", "4T", "108", "26", - "MKK", "5G", "20M", "HT", "4T", "108", "26", - "FCC", "5G", "20M", "HT", "4T", "112", "28", - "ETSI", "5G", "20M", "HT", "4T", "112", "26", - "MKK", "5G", "20M", "HT", "4T", "112", "26", - "FCC", "5G", "20M", "HT", "4T", "116", "28", - "ETSI", "5G", "20M", "HT", "4T", "116", "26", - "MKK", "5G", "20M", "HT", "4T", "116", "26", - "FCC", "5G", "20M", "HT", "4T", "120", "30", - "ETSI", "5G", "20M", "HT", "4T", "120", "26", - "MKK", "5G", "20M", "HT", "4T", "120", "26", - "FCC", "5G", "20M", "HT", "4T", "124", "28", - "ETSI", "5G", "20M", "HT", "4T", "124", "26", - "MKK", "5G", "20M", "HT", "4T", "124", "26", - "FCC", "5G", "20M", "HT", "4T", "128", "26", - "ETSI", "5G", "20M", "HT", "4T", "128", "26", - "MKK", "5G", "20M", "HT", "4T", "128", "26", - "FCC", "5G", "20M", "HT", "4T", "132", "24", - "ETSI", "5G", "20M", "HT", "4T", "132", "26", - "MKK", "5G", "20M", "HT", "4T", "132", "26", - "FCC", "5G", "20M", "HT", "4T", "136", "24", - "ETSI", "5G", "20M", "HT", "4T", "136", "26", - "MKK", "5G", "20M", "HT", "4T", "136", "26", - "FCC", "5G", "20M", "HT", "4T", "140", "22", - "ETSI", "5G", "20M", "HT", "4T", "140", "26", - "MKK", "5G", "20M", "HT", "4T", "140", "26", - "FCC", "5G", "20M", "HT", "4T", "149", "30", - "ETSI", "5G", "20M", "HT", "4T", "149", "26", - "MKK", "5G", "20M", "HT", "4T", "149", "63", - "FCC", "5G", "20M", "HT", "4T", "153", "30", - "ETSI", "5G", "20M", "HT", "4T", "153", "26", - "MKK", "5G", "20M", "HT", "4T", "153", "63", - "FCC", "5G", "20M", "HT", "4T", "157", "30", - "ETSI", "5G", "20M", "HT", "4T", "157", "26", - "MKK", "5G", "20M", "HT", "4T", "157", "63", - "FCC", "5G", "20M", "HT", "4T", "161", "30", - "ETSI", "5G", "20M", "HT", "4T", "161", "26", - "MKK", "5G", "20M", "HT", "4T", "161", "63", - "FCC", "5G", "20M", "HT", "4T", "165", "30", - "ETSI", "5G", "20M", "HT", "4T", "165", "26", - "MKK", "5G", "20M", "HT", "4T", "165", "63", - "FCC", "5G", "40M", "HT", "1T", "38", "30", - "ETSI", "5G", "40M", "HT", "1T", "38", "32", - "MKK", "5G", "40M", "HT", "1T", "38", "32", - "FCC", "5G", "40M", "HT", "1T", "46", "30", - "ETSI", "5G", "40M", "HT", "1T", "46", "32", - "MKK", "5G", "40M", "HT", "1T", "46", "32", - "FCC", "5G", "40M", "HT", "1T", "54", "32", - "ETSI", "5G", "40M", "HT", "1T", "54", "32", - "MKK", "5G", "40M", "HT", "1T", "54", "32", - "FCC", "5G", "40M", "HT", "1T", "62", "32", - "ETSI", "5G", "40M", "HT", "1T", "62", "32", - "MKK", "5G", "40M", "HT", "1T", "62", "32", - "FCC", "5G", "40M", "HT", "1T", "102", "28", - "ETSI", "5G", "40M", "HT", "1T", "102", "32", - "MKK", "5G", "40M", "HT", "1T", "102", "32", - "FCC", "5G", "40M", "HT", "1T", "110", "32", - "ETSI", "5G", "40M", "HT", "1T", "110", "32", - "MKK", "5G", "40M", "HT", "1T", "110", "32", - "FCC", "5G", "40M", "HT", "1T", "118", "36", - "ETSI", "5G", "40M", "HT", "1T", "118", "32", - "MKK", "5G", "40M", "HT", "1T", "118", "32", - "FCC", "5G", "40M", "HT", "1T", "126", "34", - "ETSI", "5G", "40M", "HT", "1T", "126", "32", - "MKK", "5G", "40M", "HT", "1T", "126", "32", - "FCC", "5G", "40M", "HT", "1T", "134", "32", - "ETSI", "5G", "40M", "HT", "1T", "134", "32", - "MKK", "5G", "40M", "HT", "1T", "134", "32", - "FCC", "5G", "40M", "HT", "1T", "151", "36", - "ETSI", "5G", "40M", "HT", "1T", "151", "32", - "MKK", "5G", "40M", "HT", "1T", "151", "63", - "FCC", "5G", "40M", "HT", "1T", "159", "36", - "ETSI", "5G", "40M", "HT", "1T", "159", "32", - "MKK", "5G", "40M", "HT", "1T", "159", "63", - "FCC", "5G", "40M", "HT", "2T", "38", "28", - "ETSI", "5G", "40M", "HT", "2T", "38", "30", - "MKK", "5G", "40M", "HT", "2T", "38", "30", - "FCC", "5G", "40M", "HT", "2T", "46", "28", - "ETSI", "5G", "40M", "HT", "2T", "46", "30", - "MKK", "5G", "40M", "HT", "2T", "46", "30", - "FCC", "5G", "40M", "HT", "2T", "54", "30", - "ETSI", "5G", "40M", "HT", "2T", "54", "30", - "MKK", "5G", "40M", "HT", "2T", "54", "30", - "FCC", "5G", "40M", "HT", "2T", "62", "30", - "ETSI", "5G", "40M", "HT", "2T", "62", "30", - "MKK", "5G", "40M", "HT", "2T", "62", "30", - "FCC", "5G", "40M", "HT", "2T", "102", "26", - "ETSI", "5G", "40M", "HT", "2T", "102", "30", - "MKK", "5G", "40M", "HT", "2T", "102", "30", - "FCC", "5G", "40M", "HT", "2T", "110", "30", - "ETSI", "5G", "40M", "HT", "2T", "110", "30", - "MKK", "5G", "40M", "HT", "2T", "110", "30", - "FCC", "5G", "40M", "HT", "2T", "118", "34", - "ETSI", "5G", "40M", "HT", "2T", "118", "30", - "MKK", "5G", "40M", "HT", "2T", "118", "30", - "FCC", "5G", "40M", "HT", "2T", "126", "32", - "ETSI", "5G", "40M", "HT", "2T", "126", "30", - "MKK", "5G", "40M", "HT", "2T", "126", "30", - "FCC", "5G", "40M", "HT", "2T", "134", "30", - "ETSI", "5G", "40M", "HT", "2T", "134", "30", - "MKK", "5G", "40M", "HT", "2T", "134", "30", - "FCC", "5G", "40M", "HT", "2T", "151", "34", - "ETSI", "5G", "40M", "HT", "2T", "151", "30", - "MKK", "5G", "40M", "HT", "2T", "151", "63", - "FCC", "5G", "40M", "HT", "2T", "159", "34", - "ETSI", "5G", "40M", "HT", "2T", "159", "30", - "MKK", "5G", "40M", "HT", "2T", "159", "63", - "FCC", "5G", "40M", "HT", "3T", "38", "26", - "ETSI", "5G", "40M", "HT", "3T", "38", "28", - "MKK", "5G", "40M", "HT", "3T", "38", "28", - "FCC", "5G", "40M", "HT", "3T", "46", "26", - "ETSI", "5G", "40M", "HT", "3T", "46", "28", - "MKK", "5G", "40M", "HT", "3T", "46", "28", - "FCC", "5G", "40M", "HT", "3T", "54", "28", - "ETSI", "5G", "40M", "HT", "3T", "54", "28", - "MKK", "5G", "40M", "HT", "3T", "54", "28", - "FCC", "5G", "40M", "HT", "3T", "62", "28", - "ETSI", "5G", "40M", "HT", "3T", "62", "28", - "MKK", "5G", "40M", "HT", "3T", "62", "28", - "FCC", "5G", "40M", "HT", "3T", "102", "24", - "ETSI", "5G", "40M", "HT", "3T", "102", "28", - "MKK", "5G", "40M", "HT", "3T", "102", "28", - "FCC", "5G", "40M", "HT", "3T", "110", "28", - "ETSI", "5G", "40M", "HT", "3T", "110", "28", - "MKK", "5G", "40M", "HT", "3T", "110", "28", - "FCC", "5G", "40M", "HT", "3T", "118", "32", - "ETSI", "5G", "40M", "HT", "3T", "118", "28", - "MKK", "5G", "40M", "HT", "3T", "118", "28", - "FCC", "5G", "40M", "HT", "3T", "126", "30", - "ETSI", "5G", "40M", "HT", "3T", "126", "28", - "MKK", "5G", "40M", "HT", "3T", "126", "28", - "FCC", "5G", "40M", "HT", "3T", "134", "28", - "ETSI", "5G", "40M", "HT", "3T", "134", "28", - "MKK", "5G", "40M", "HT", "3T", "134", "28", - "FCC", "5G", "40M", "HT", "3T", "151", "32", - "ETSI", "5G", "40M", "HT", "3T", "151", "28", - "MKK", "5G", "40M", "HT", "3T", "151", "63", - "FCC", "5G", "40M", "HT", "3T", "159", "32", - "ETSI", "5G", "40M", "HT", "3T", "159", "28", - "MKK", "5G", "40M", "HT", "3T", "159", "63", - "FCC", "5G", "40M", "HT", "4T", "38", "24", - "ETSI", "5G", "40M", "HT", "4T", "38", "26", - "MKK", "5G", "40M", "HT", "4T", "38", "26", - "FCC", "5G", "40M", "HT", "4T", "46", "24", - "ETSI", "5G", "40M", "HT", "4T", "46", "26", - "MKK", "5G", "40M", "HT", "4T", "46", "26", - "FCC", "5G", "40M", "HT", "4T", "54", "26", - "ETSI", "5G", "40M", "HT", "4T", "54", "26", - "MKK", "5G", "40M", "HT", "4T", "54", "26", - "FCC", "5G", "40M", "HT", "4T", "62", "26", - "ETSI", "5G", "40M", "HT", "4T", "62", "26", - "MKK", "5G", "40M", "HT", "4T", "62", "26", - "FCC", "5G", "40M", "HT", "4T", "102", "22", - "ETSI", "5G", "40M", "HT", "4T", "102", "26", - "MKK", "5G", "40M", "HT", "4T", "102", "26", - "FCC", "5G", "40M", "HT", "4T", "110", "26", - "ETSI", "5G", "40M", "HT", "4T", "110", "26", - "MKK", "5G", "40M", "HT", "4T", "110", "26", - "FCC", "5G", "40M", "HT", "4T", "118", "30", - "ETSI", "5G", "40M", "HT", "4T", "118", "26", - "MKK", "5G", "40M", "HT", "4T", "118", "26", - "FCC", "5G", "40M", "HT", "4T", "126", "28", - "ETSI", "5G", "40M", "HT", "4T", "126", "26", - "MKK", "5G", "40M", "HT", "4T", "126", "26", - "FCC", "5G", "40M", "HT", "4T", "134", "26", - "ETSI", "5G", "40M", "HT", "4T", "134", "26", - "MKK", "5G", "40M", "HT", "4T", "134", "26", - "FCC", "5G", "40M", "HT", "4T", "151", "30", - "ETSI", "5G", "40M", "HT", "4T", "151", "26", - "MKK", "5G", "40M", "HT", "4T", "151", "63", - "FCC", "5G", "40M", "HT", "4T", "159", "30", - "ETSI", "5G", "40M", "HT", "4T", "159", "26", - "MKK", "5G", "40M", "HT", "4T", "159", "63", - "FCC", "5G", "80M", "VHT", "1T", "42", "30", - "ETSI", "5G", "80M", "VHT", "1T", "42", "32", - "MKK", "5G", "80M", "VHT", "1T", "42", "32", - "FCC", "5G", "80M", "VHT", "1T", "58", "28", - "ETSI", "5G", "80M", "VHT", "1T", "58", "32", - "MKK", "5G", "80M", "VHT", "1T", "58", "32", - "FCC", "5G", "80M", "VHT", "1T", "106", "30", - "ETSI", "5G", "80M", "VHT", "1T", "106", "32", - "MKK", "5G", "80M", "VHT", "1T", "106", "32", - "FCC", "5G", "80M", "VHT", "1T", "122", "34", - "ETSI", "5G", "80M", "VHT", "1T", "122", "32", - "MKK", "5G", "80M", "VHT", "1T", "122", "32", - "FCC", "5G", "80M", "VHT", "1T", "155", "36", - "ETSI", "5G", "80M", "VHT", "1T", "155", "32", - "MKK", "5G", "80M", "VHT", "1T", "155", "63", - "FCC", "5G", "80M", "VHT", "2T", "42", "28", - "ETSI", "5G", "80M", "VHT", "2T", "42", "30", - "MKK", "5G", "80M", "VHT", "2T", "42", "30", - "FCC", "5G", "80M", "VHT", "2T", "58", "26", - "ETSI", "5G", "80M", "VHT", "2T", "58", "30", - "MKK", "5G", "80M", "VHT", "2T", "58", "30", - "FCC", "5G", "80M", "VHT", "2T", "106", "28", - "ETSI", "5G", "80M", "VHT", "2T", "106", "30", - "MKK", "5G", "80M", "VHT", "2T", "106", "30", - "FCC", "5G", "80M", "VHT", "2T", "122", "32", - "ETSI", "5G", "80M", "VHT", "2T", "122", "30", - "MKK", "5G", "80M", "VHT", "2T", "122", "30", - "FCC", "5G", "80M", "VHT", "2T", "155", "34", - "ETSI", "5G", "80M", "VHT", "2T", "155", "30", - "MKK", "5G", "80M", "VHT", "2T", "155", "63", - "FCC", "5G", "80M", "VHT", "3T", "42", "26", - "ETSI", "5G", "80M", "VHT", "3T", "42", "28", - "MKK", "5G", "80M", "VHT", "3T", "42", "28", - "FCC", "5G", "80M", "VHT", "3T", "58", "24", - "ETSI", "5G", "80M", "VHT", "3T", "58", "28", - "MKK", "5G", "80M", "VHT", "3T", "58", "28", - "FCC", "5G", "80M", "VHT", "3T", "106", "26", - "ETSI", "5G", "80M", "VHT", "3T", "106", "28", - "MKK", "5G", "80M", "VHT", "3T", "106", "28", - "FCC", "5G", "80M", "VHT", "3T", "122", "30", - "ETSI", "5G", "80M", "VHT", "3T", "122", "28", - "MKK", "5G", "80M", "VHT", "3T", "122", "28", - "FCC", "5G", "80M", "VHT", "3T", "155", "32", - "ETSI", "5G", "80M", "VHT", "3T", "155", "28", - "MKK", "5G", "80M", "VHT", "3T", "155", "63", - "FCC", "5G", "80M", "VHT", "4T", "42", "24", - "ETSI", "5G", "80M", "VHT", "4T", "42", "26", - "MKK", "5G", "80M", "VHT", "4T", "42", "26", - "FCC", "5G", "80M", "VHT", "4T", "58", "22", - "ETSI", "5G", "80M", "VHT", "4T", "58", "26", - "MKK", "5G", "80M", "VHT", "4T", "58", "26", - "FCC", "5G", "80M", "VHT", "4T", "106", "24", - "ETSI", "5G", "80M", "VHT", "4T", "106", "26", - "MKK", "5G", "80M", "VHT", "4T", "106", "26", - "FCC", "5G", "80M", "VHT", "4T", "122", "28", - "ETSI", "5G", "80M", "VHT", "4T", "122", "26", - "MKK", "5G", "80M", "VHT", "4T", "122", "26", - "FCC", "5G", "80M", "VHT", "4T", "155", "30", - "ETSI", "5G", "80M", "VHT", "4T", "155", "26", - "MKK", "5G", "80M", "VHT", "4T", "155", "63" -}; - -void -odm_read_and_config_mp_8814a_txpwr_lmt( - struct dm_struct * pDM_Odm -) -{ - u4Byte i = 0; - u4Byte ArrayLen = sizeof(Array_MP_8814A_TXPWR_LMT)/sizeof(pu1Byte); - pu1Byte *Array = (pu1Byte *)Array_MP_8814A_TXPWR_LMT; - -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - PADAPTER Adapter = pDM_Odm->Adapter; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - PlatformZeroMemory(pHalData->BufOfLinesPwrLmt, MAX_LINES_HWCONFIG_TXT*MAX_BYTES_LINE_HWCONFIG_TXT); - pHalData->nLinesReadPwrLmt = ArrayLen/7; -#endif - - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_8814A_TXPWR_LMT\n"); - - for (i = 0; i < ArrayLen; i += 7) { - pu1Byte regulation = Array[i]; - pu1Byte band = Array[i+1]; - pu1Byte bandwidth = Array[i+2]; - pu1Byte rate = Array[i+3]; - pu1Byte rfPath = Array[i+4]; - pu1Byte chnl = Array[i+5]; - pu1Byte val = Array[i+6]; - - odm_ConfigBB_TXPWR_LMT_8814A(pDM_Odm, regulation, band, bandwidth, rate, rfPath, chnl, val); -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - rsprintf((char *)pHalData->BufOfLinesPwrLmt[i/7], 100, "\"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\",", - regulation, band, bandwidth, rate, rfPath, chnl, val); -#endif - } - -} - -/****************************************************************************** -* TXPWR_LMT_type2.TXT -******************************************************************************/ - -/* -const char *Array_MP_8814A_TXPWR_LMT_type2[] = { - "FCC", "2.4G", "20M", "CCK", "1T", "01", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "01", "36", - "MKK", "2.4G", "20M", "CCK", "1T", "01", "36", - "FCC", "2.4G", "20M", "CCK", "1T", "02", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "02", "36", - "MKK", "2.4G", "20M", "CCK", "1T", "02", "36", - "FCC", "2.4G", "20M", "CCK", "1T", "03", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "03", "36", - "MKK", "2.4G", "20M", "CCK", "1T", "03", "36", - "FCC", "2.4G", "20M", "CCK", "1T", "04", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "04", "36", - "MKK", "2.4G", "20M", "CCK", "1T", "04", "36", - "FCC", "2.4G", "20M", "CCK", "1T", "05", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "05", "36", - "MKK", "2.4G", "20M", "CCK", "1T", "05", "36", - "FCC", "2.4G", "20M", "CCK", "1T", "06", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "06", "36", - "MKK", "2.4G", "20M", "CCK", "1T", "06", "36", - "FCC", "2.4G", "20M", "CCK", "1T", "07", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "07", "36", - "MKK", "2.4G", "20M", "CCK", "1T", "07", "36", - "FCC", "2.4G", "20M", "CCK", "1T", "08", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "08", "36", - "MKK", "2.4G", "20M", "CCK", "1T", "08", "36", - "FCC", "2.4G", "20M", "CCK", "1T", "09", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "09", "36", - "MKK", "2.4G", "20M", "CCK", "1T", "09", "36", - "FCC", "2.4G", "20M", "CCK", "1T", "10", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "10", "36", - "MKK", "2.4G", "20M", "CCK", "1T", "10", "36", - "FCC", "2.4G", "20M", "CCK", "1T", "11", "36", - "ETSI", "2.4G", "20M", "CCK", "1T", "11", "36", - "MKK", "2.4G", "20M", "CCK", "1T", "11", "36", - "FCC", "2.4G", "20M", "CCK", "1T", "12", "63", - "ETSI", "2.4G", "20M", "CCK", "1T", "12", "36", - "MKK", "2.4G", "20M", "CCK", "1T", "12", "36", - "FCC", "2.4G", "20M", "CCK", "1T", "13", "63", - "ETSI", "2.4G", "20M", "CCK", "1T", "13", "36", - "MKK", "2.4G", "20M", "CCK", "1T", "13", "36", - "FCC", "2.4G", "20M", "CCK", "1T", "14", "63", - "ETSI", "2.4G", "20M", "CCK", "1T", "14", "63", - "MKK", "2.4G", "20M", "CCK", "1T", "14", "36", - "FCC", "2.4G", "20M", "OFDM", "1T", "01", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "01", "36", - "MKK", "2.4G", "20M", "OFDM", "1T", "01", "36", - "FCC", "2.4G", "20M", "OFDM", "1T", "02", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "02", "36", - "MKK", "2.4G", "20M", "OFDM", "1T", "02", "36", - "FCC", "2.4G", "20M", "OFDM", "1T", "03", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "03", "36", - "MKK", "2.4G", "20M", "OFDM", "1T", "03", "36", - "FCC", "2.4G", "20M", "OFDM", "1T", "04", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "04", "36", - "MKK", "2.4G", "20M", "OFDM", "1T", "04", "36", - "FCC", "2.4G", "20M", "OFDM", "1T", "05", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "05", "36", - "MKK", "2.4G", "20M", "OFDM", "1T", "05", "36", - "FCC", "2.4G", "20M", "OFDM", "1T", "06", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "06", "36", - "MKK", "2.4G", "20M", "OFDM", "1T", "06", "36", - "FCC", "2.4G", "20M", "OFDM", "1T", "07", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "07", "36", - "MKK", "2.4G", "20M", "OFDM", "1T", "07", "36", - "FCC", "2.4G", "20M", "OFDM", "1T", "08", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "08", "36", - "MKK", "2.4G", "20M", "OFDM", "1T", "08", "36", - "FCC", "2.4G", "20M", "OFDM", "1T", "09", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "09", "36", - "MKK", "2.4G", "20M", "OFDM", "1T", "09", "36", - "FCC", "2.4G", "20M", "OFDM", "1T", "10", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "10", "36", - "MKK", "2.4G", "20M", "OFDM", "1T", "10", "36", - "FCC", "2.4G", "20M", "OFDM", "1T", "11", "36", - "ETSI", "2.4G", "20M", "OFDM", "1T", "11", "36", - "MKK", "2.4G", "20M", "OFDM", "1T", "11", "36", - "FCC", "2.4G", "20M", "OFDM", "1T", "12", "63", - "ETSI", "2.4G", "20M", "OFDM", "1T", "12", "36", - "MKK", "2.4G", "20M", "OFDM", "1T", "12", "36", - "FCC", "2.4G", "20M", "OFDM", "1T", "13", "63", - "ETSI", "2.4G", "20M", "OFDM", "1T", "13", "36", - "MKK", "2.4G", "20M", "OFDM", "1T", "13", "36", - "FCC", "2.4G", "20M", "OFDM", "1T", "14", "63", - "ETSI", "2.4G", "20M", "OFDM", "1T", "14", "63", - "MKK", "2.4G", "20M", "OFDM", "1T", "14", "63", - "FCC", "2.4G", "20M", "HT", "1T", "01", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "01", "36", - "MKK", "2.4G", "20M", "HT", "1T", "01", "36", - "FCC", "2.4G", "20M", "HT", "1T", "02", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "02", "36", - "MKK", "2.4G", "20M", "HT", "1T", "02", "36", - "FCC", "2.4G", "20M", "HT", "1T", "03", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "03", "36", - "MKK", "2.4G", "20M", "HT", "1T", "03", "36", - "FCC", "2.4G", "20M", "HT", "1T", "04", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "04", "36", - "MKK", "2.4G", "20M", "HT", "1T", "04", "36", - "FCC", "2.4G", "20M", "HT", "1T", "05", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "05", "36", - "MKK", "2.4G", "20M", "HT", "1T", "05", "36", - "FCC", "2.4G", "20M", "HT", "1T", "06", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "06", "36", - "MKK", "2.4G", "20M", "HT", "1T", "06", "36", - "FCC", "2.4G", "20M", "HT", "1T", "07", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "07", "36", - "MKK", "2.4G", "20M", "HT", "1T", "07", "36", - "FCC", "2.4G", "20M", "HT", "1T", "08", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "08", "36", - "MKK", "2.4G", "20M", "HT", "1T", "08", "36", - "FCC", "2.4G", "20M", "HT", "1T", "09", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "09", "36", - "MKK", "2.4G", "20M", "HT", "1T", "09", "36", - "FCC", "2.4G", "20M", "HT", "1T", "10", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "10", "36", - "MKK", "2.4G", "20M", "HT", "1T", "10", "36", - "FCC", "2.4G", "20M", "HT", "1T", "11", "36", - "ETSI", "2.4G", "20M", "HT", "1T", "11", "36", - "MKK", "2.4G", "20M", "HT", "1T", "11", "36", - "FCC", "2.4G", "20M", "HT", "1T", "12", "63", - "ETSI", "2.4G", "20M", "HT", "1T", "12", "36", - "MKK", "2.4G", "20M", "HT", "1T", "12", "36", - "FCC", "2.4G", "20M", "HT", "1T", "13", "63", - "ETSI", "2.4G", "20M", "HT", "1T", "13", "36", - "MKK", "2.4G", "20M", "HT", "1T", "13", "36", - "FCC", "2.4G", "20M", "HT", "1T", "14", "63", - "ETSI", "2.4G", "20M", "HT", "1T", "14", "63", - "MKK", "2.4G", "20M", "HT", "1T", "14", "63", - "FCC", "2.4G", "20M", "HT", "2T", "01", "36", - "ETSI", "2.4G", "20M", "HT", "2T", "01", "36", - "MKK", "2.4G", "20M", "HT", "2T", "01", "36", - "FCC", "2.4G", "20M", "HT", "2T", "02", "36", - "ETSI", "2.4G", "20M", "HT", "2T", "02", "36", - "MKK", "2.4G", "20M", "HT", "2T", "02", "36", - "FCC", "2.4G", "20M", "HT", "2T", "03", "36", - "ETSI", "2.4G", "20M", "HT", "2T", "03", "36", - "MKK", "2.4G", "20M", "HT", "2T", "03", "36", - "FCC", "2.4G", "20M", "HT", "2T", "04", "36", - "ETSI", "2.4G", "20M", "HT", "2T", "04", "36", - "MKK", "2.4G", "20M", "HT", "2T", "04", "36", - "FCC", "2.4G", "20M", "HT", "2T", "05", "36", - "ETSI", "2.4G", "20M", "HT", "2T", "05", "36", - "MKK", "2.4G", "20M", "HT", "2T", "05", "36", - "FCC", "2.4G", "20M", "HT", "2T", "06", "36", - "ETSI", "2.4G", "20M", "HT", "2T", "06", "36", - "MKK", "2.4G", "20M", "HT", "2T", "06", "36", - "FCC", "2.4G", "20M", "HT", "2T", "07", "36", - "ETSI", "2.4G", "20M", "HT", "2T", "07", "36", - "MKK", "2.4G", "20M", "HT", "2T", "07", "36", - "FCC", "2.4G", "20M", "HT", "2T", "08", "36", - "ETSI", "2.4G", "20M", "HT", "2T", "08", "36", - "MKK", "2.4G", "20M", "HT", "2T", "08", "36", - "FCC", "2.4G", "20M", "HT", "2T", "09", "36", - "ETSI", "2.4G", "20M", "HT", "2T", "09", "36", - "MKK", "2.4G", "20M", "HT", "2T", "09", "36", - "FCC", "2.4G", "20M", "HT", "2T", "10", "36", - "ETSI", "2.4G", "20M", "HT", "2T", "10", "36", - "MKK", "2.4G", "20M", "HT", "2T", "10", "36", - "FCC", "2.4G", "20M", "HT", "2T", "11", "36", - "ETSI", "2.4G", "20M", "HT", "2T", "11", "36", - "MKK", "2.4G", "20M", "HT", "2T", "11", "36", - "FCC", "2.4G", "20M", "HT", "2T", "12", "63", - "ETSI", "2.4G", "20M", "HT", "2T", "12", "36", - "MKK", "2.4G", "20M", "HT", "2T", "12", "36", - "FCC", "2.4G", "20M", "HT", "2T", "13", "63", - "ETSI", "2.4G", "20M", "HT", "2T", "13", "36", - "MKK", "2.4G", "20M", "HT", "2T", "13", "36", - "FCC", "2.4G", "20M", "HT", "2T", "14", "63", - "ETSI", "2.4G", "20M", "HT", "2T", "14", "63", - "MKK", "2.4G", "20M", "HT", "2T", "14", "63", - "FCC", "2.4G", "20M", "HT", "3T", "01", "36", - "ETSI", "2.4G", "20M", "HT", "3T", "01", "36", - "MKK", "2.4G", "20M", "HT", "3T", "01", "36", - "FCC", "2.4G", "20M", "HT", "3T", "02", "36", - "ETSI", "2.4G", "20M", "HT", "3T", "02", "36", - "MKK", "2.4G", "20M", "HT", "3T", "02", "36", - "FCC", "2.4G", "20M", "HT", "3T", "03", "36", - "ETSI", "2.4G", "20M", "HT", "3T", "03", "36", - "MKK", "2.4G", "20M", "HT", "3T", "03", "36", - "FCC", "2.4G", "20M", "HT", "3T", "04", "36", - "ETSI", "2.4G", "20M", "HT", "3T", "04", "36", - "MKK", "2.4G", "20M", "HT", "3T", "04", "36", - "FCC", "2.4G", "20M", "HT", "3T", "05", "36", - "ETSI", "2.4G", "20M", "HT", "3T", "05", "36", - "MKK", "2.4G", "20M", "HT", "3T", "05", "36", - "FCC", "2.4G", "20M", "HT", "3T", "06", "36", - "ETSI", "2.4G", "20M", "HT", "3T", "06", "36", - "MKK", "2.4G", "20M", "HT", "3T", "06", "36", - "FCC", "2.4G", "20M", "HT", "3T", "07", "36", - "ETSI", "2.4G", "20M", "HT", "3T", "07", "36", - "MKK", "2.4G", "20M", "HT", "3T", "07", "36", - "FCC", "2.4G", "20M", "HT", "3T", "08", "36", - "ETSI", "2.4G", "20M", "HT", "3T", "08", "36", - "MKK", "2.4G", "20M", "HT", "3T", "08", "36", - "FCC", "2.4G", "20M", "HT", "3T", "09", "36", - "ETSI", "2.4G", "20M", "HT", "3T", "09", "36", - "MKK", "2.4G", "20M", "HT", "3T", "09", "36", - "FCC", "2.4G", "20M", "HT", "3T", "10", "36", - "ETSI", "2.4G", "20M", "HT", "3T", "10", "36", - "MKK", "2.4G", "20M", "HT", "3T", "10", "36", - "FCC", "2.4G", "20M", "HT", "3T", "11", "36", - "ETSI", "2.4G", "20M", "HT", "3T", "11", "36", - "MKK", "2.4G", "20M", "HT", "3T", "11", "36", - "FCC", "2.4G", "20M", "HT", "3T", "12", "63", - "ETSI", "2.4G", "20M", "HT", "3T", "12", "36", - "MKK", "2.4G", "20M", "HT", "3T", "12", "36", - "FCC", "2.4G", "20M", "HT", "3T", "13", "63", - "ETSI", "2.4G", "20M", "HT", "3T", "13", "36", - "MKK", "2.4G", "20M", "HT", "3T", "13", "36", - "FCC", "2.4G", "20M", "HT", "3T", "14", "63", - "ETSI", "2.4G", "20M", "HT", "3T", "14", "63", - "MKK", "2.4G", "20M", "HT", "3T", "14", "63", - "FCC", "2.4G", "20M", "HT", "4T", "01", "36", - "ETSI", "2.4G", "20M", "HT", "4T", "01", "36", - "MKK", "2.4G", "20M", "HT", "4T", "01", "36", - "FCC", "2.4G", "20M", "HT", "4T", "02", "36", - "ETSI", "2.4G", "20M", "HT", "4T", "02", "36", - "MKK", "2.4G", "20M", "HT", "4T", "02", "36", - "FCC", "2.4G", "20M", "HT", "4T", "03", "36", - "ETSI", "2.4G", "20M", "HT", "4T", "03", "36", - "MKK", "2.4G", "20M", "HT", "4T", "03", "36", - "FCC", "2.4G", "20M", "HT", "4T", "04", "36", - "ETSI", "2.4G", "20M", "HT", "4T", "04", "36", - "MKK", "2.4G", "20M", "HT", "4T", "04", "36", - "FCC", "2.4G", "20M", "HT", "4T", "05", "36", - "ETSI", "2.4G", "20M", "HT", "4T", "05", "36", - "MKK", "2.4G", "20M", "HT", "4T", "05", "36", - "FCC", "2.4G", "20M", "HT", "4T", "06", "36", - "ETSI", "2.4G", "20M", "HT", "4T", "06", "36", - "MKK", "2.4G", "20M", "HT", "4T", "06", "36", - "FCC", "2.4G", "20M", "HT", "4T", "07", "36", - "ETSI", "2.4G", "20M", "HT", "4T", "07", "36", - "MKK", "2.4G", "20M", "HT", "4T", "07", "36", - "FCC", "2.4G", "20M", "HT", "4T", "08", "36", - "ETSI", "2.4G", "20M", "HT", "4T", "08", "36", - "MKK", "2.4G", "20M", "HT", "4T", "08", "36", - "FCC", "2.4G", "20M", "HT", "4T", "09", "36", - "ETSI", "2.4G", "20M", "HT", "4T", "09", "36", - "MKK", "2.4G", "20M", "HT", "4T", "09", "36", - "FCC", "2.4G", "20M", "HT", "4T", "10", "36", - "ETSI", "2.4G", "20M", "HT", "4T", "10", "36", - "MKK", "2.4G", "20M", "HT", "4T", "10", "36", - "FCC", "2.4G", "20M", "HT", "4T", "11", "36", - "ETSI", "2.4G", "20M", "HT", "4T", "11", "36", - "MKK", "2.4G", "20M", "HT", "4T", "11", "36", - "FCC", "2.4G", "20M", "HT", "4T", "12", "63", - "ETSI", "2.4G", "20M", "HT", "4T", "12", "36", - "MKK", "2.4G", "20M", "HT", "4T", "12", "36", - "FCC", "2.4G", "20M", "HT", "4T", "13", "63", - "ETSI", "2.4G", "20M", "HT", "4T", "13", "36", - "MKK", "2.4G", "20M", "HT", "4T", "13", "36", - "FCC", "2.4G", "20M", "HT", "4T", "14", "63", - "ETSI", "2.4G", "20M", "HT", "4T", "14", "63", - "MKK", "2.4G", "20M", "HT", "4T", "14", "63", - "FCC", "2.4G", "40M", "HT", "1T", "01", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "01", "63", - "MKK", "2.4G", "40M", "HT", "1T", "01", "63", - "FCC", "2.4G", "40M", "HT", "1T", "02", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "02", "63", - "MKK", "2.4G", "40M", "HT", "1T", "02", "63", - "FCC", "2.4G", "40M", "HT", "1T", "03", "36", - "ETSI", "2.4G", "40M", "HT", "1T", "03", "36", - "MKK", "2.4G", "40M", "HT", "1T", "03", "36", - "FCC", "2.4G", "40M", "HT", "1T", "04", "36", - "ETSI", "2.4G", "40M", "HT", "1T", "04", "36", - "MKK", "2.4G", "40M", "HT", "1T", "04", "36", - "FCC", "2.4G", "40M", "HT", "1T", "05", "36", - "ETSI", "2.4G", "40M", "HT", "1T", "05", "36", - "MKK", "2.4G", "40M", "HT", "1T", "05", "36", - "FCC", "2.4G", "40M", "HT", "1T", "06", "36", - "ETSI", "2.4G", "40M", "HT", "1T", "06", "36", - "MKK", "2.4G", "40M", "HT", "1T", "06", "36", - "FCC", "2.4G", "40M", "HT", "1T", "07", "36", - "ETSI", "2.4G", "40M", "HT", "1T", "07", "36", - "MKK", "2.4G", "40M", "HT", "1T", "07", "36", - "FCC", "2.4G", "40M", "HT", "1T", "08", "36", - "ETSI", "2.4G", "40M", "HT", "1T", "08", "36", - "MKK", "2.4G", "40M", "HT", "1T", "08", "36", - "FCC", "2.4G", "40M", "HT", "1T", "09", "36", - "ETSI", "2.4G", "40M", "HT", "1T", "09", "36", - "MKK", "2.4G", "40M", "HT", "1T", "09", "36", - "FCC", "2.4G", "40M", "HT", "1T", "10", "36", - "ETSI", "2.4G", "40M", "HT", "1T", "10", "36", - "MKK", "2.4G", "40M", "HT", "1T", "10", "36", - "FCC", "2.4G", "40M", "HT", "1T", "11", "36", - "ETSI", "2.4G", "40M", "HT", "1T", "11", "36", - "MKK", "2.4G", "40M", "HT", "1T", "11", "36", - "FCC", "2.4G", "40M", "HT", "1T", "12", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "12", "36", - "MKK", "2.4G", "40M", "HT", "1T", "12", "36", - "FCC", "2.4G", "40M", "HT", "1T", "13", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "13", "36", - "MKK", "2.4G", "40M", "HT", "1T", "13", "36", - "FCC", "2.4G", "40M", "HT", "1T", "14", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "14", "63", - "MKK", "2.4G", "40M", "HT", "1T", "14", "63", - "FCC", "2.4G", "40M", "HT", "2T", "01", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "01", "63", - "MKK", "2.4G", "40M", "HT", "2T", "01", "63", - "FCC", "2.4G", "40M", "HT", "2T", "02", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "02", "63", - "MKK", "2.4G", "40M", "HT", "2T", "02", "63", - "FCC", "2.4G", "40M", "HT", "2T", "03", "36", - "ETSI", "2.4G", "40M", "HT", "2T", "03", "36", - "MKK", "2.4G", "40M", "HT", "2T", "03", "36", - "FCC", "2.4G", "40M", "HT", "2T", "04", "36", - "ETSI", "2.4G", "40M", "HT", "2T", "04", "36", - "MKK", "2.4G", "40M", "HT", "2T", "04", "36", - "FCC", "2.4G", "40M", "HT", "2T", "05", "36", - "ETSI", "2.4G", "40M", "HT", "2T", "05", "36", - "MKK", "2.4G", "40M", "HT", "2T", "05", "36", - "FCC", "2.4G", "40M", "HT", "2T", "06", "36", - "ETSI", "2.4G", "40M", "HT", "2T", "06", "36", - "MKK", "2.4G", "40M", "HT", "2T", "06", "36", - "FCC", "2.4G", "40M", "HT", "2T", "07", "36", - "ETSI", "2.4G", "40M", "HT", "2T", "07", "36", - "MKK", "2.4G", "40M", "HT", "2T", "07", "36", - "FCC", "2.4G", "40M", "HT", "2T", "08", "36", - "ETSI", "2.4G", "40M", "HT", "2T", "08", "36", - "MKK", "2.4G", "40M", "HT", "2T", "08", "36", - "FCC", "2.4G", "40M", "HT", "2T", "09", "36", - "ETSI", "2.4G", "40M", "HT", "2T", "09", "36", - "MKK", "2.4G", "40M", "HT", "2T", "09", "36", - "FCC", "2.4G", "40M", "HT", "2T", "10", "36", - "ETSI", "2.4G", "40M", "HT", "2T", "10", "36", - "MKK", "2.4G", "40M", "HT", "2T", "10", "36", - "FCC", "2.4G", "40M", "HT", "2T", "11", "36", - "ETSI", "2.4G", "40M", "HT", "2T", "11", "36", - "MKK", "2.4G", "40M", "HT", "2T", "11", "36", - "FCC", "2.4G", "40M", "HT", "2T", "12", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "12", "36", - "MKK", "2.4G", "40M", "HT", "2T", "12", "36", - "FCC", "2.4G", "40M", "HT", "2T", "13", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "13", "36", - "MKK", "2.4G", "40M", "HT", "2T", "13", "36", - "FCC", "2.4G", "40M", "HT", "2T", "14", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "14", "63", - "MKK", "2.4G", "40M", "HT", "2T", "14", "63", - "FCC", "2.4G", "40M", "HT", "3T", "01", "63", - "ETSI", "2.4G", "40M", "HT", "3T", "01", "63", - "MKK", "2.4G", "40M", "HT", "3T", "01", "63", - "FCC", "2.4G", "40M", "HT", "3T", "02", "63", - "ETSI", "2.4G", "40M", "HT", "3T", "02", "63", - "MKK", "2.4G", "40M", "HT", "3T", "02", "63", - "FCC", "2.4G", "40M", "HT", "3T", "03", "36", - "ETSI", "2.4G", "40M", "HT", "3T", "03", "36", - "MKK", "2.4G", "40M", "HT", "3T", "03", "36", - "FCC", "2.4G", "40M", "HT", "3T", "04", "36", - "ETSI", "2.4G", "40M", "HT", "3T", "04", "36", - "MKK", "2.4G", "40M", "HT", "3T", "04", "36", - "FCC", "2.4G", "40M", "HT", "3T", "05", "36", - "ETSI", "2.4G", "40M", "HT", "3T", "05", "36", - "MKK", "2.4G", "40M", "HT", "3T", "05", "36", - "FCC", "2.4G", "40M", "HT", "3T", "06", "36", - "ETSI", "2.4G", "40M", "HT", "3T", "06", "36", - "MKK", "2.4G", "40M", "HT", "3T", "06", "36", - "FCC", "2.4G", "40M", "HT", "3T", "07", "36", - "ETSI", "2.4G", "40M", "HT", "3T", "07", "36", - "MKK", "2.4G", "40M", "HT", "3T", "07", "36", - "FCC", "2.4G", "40M", "HT", "3T", "08", "36", - "ETSI", "2.4G", "40M", "HT", "3T", "08", "36", - "MKK", "2.4G", "40M", "HT", "3T", "08", "36", - "FCC", "2.4G", "40M", "HT", "3T", "09", "36", - "ETSI", "2.4G", "40M", "HT", "3T", "09", "36", - "MKK", "2.4G", "40M", "HT", "3T", "09", "36", - "FCC", "2.4G", "40M", "HT", "3T", "10", "36", - "ETSI", "2.4G", "40M", "HT", "3T", "10", "36", - "MKK", "2.4G", "40M", "HT", "3T", "10", "36", - "FCC", "2.4G", "40M", "HT", "3T", "11", "36", - "ETSI", "2.4G", "40M", "HT", "3T", "11", "36", - "MKK", "2.4G", "40M", "HT", "3T", "11", "36", - "FCC", "2.4G", "40M", "HT", "3T", "12", "63", - "ETSI", "2.4G", "40M", "HT", "3T", "12", "36", - "MKK", "2.4G", "40M", "HT", "3T", "12", "36", - "FCC", "2.4G", "40M", "HT", "3T", "13", "63", - "ETSI", "2.4G", "40M", "HT", "3T", "13", "36", - "MKK", "2.4G", "40M", "HT", "3T", "13", "36", - "FCC", "2.4G", "40M", "HT", "3T", "14", "63", - "ETSI", "2.4G", "40M", "HT", "3T", "14", "63", - "MKK", "2.4G", "40M", "HT", "3T", "14", "63", - "FCC", "2.4G", "40M", "HT", "4T", "01", "63", - "ETSI", "2.4G", "40M", "HT", "4T", "01", "63", - "MKK", "2.4G", "40M", "HT", "4T", "01", "63", - "FCC", "2.4G", "40M", "HT", "4T", "02", "63", - "ETSI", "2.4G", "40M", "HT", "4T", "02", "63", - "MKK", "2.4G", "40M", "HT", "4T", "02", "63", - "FCC", "2.4G", "40M", "HT", "4T", "03", "36", - "ETSI", "2.4G", "40M", "HT", "4T", "03", "36", - "MKK", "2.4G", "40M", "HT", "4T", "03", "36", - "FCC", "2.4G", "40M", "HT", "4T", "04", "36", - "ETSI", "2.4G", "40M", "HT", "4T", "04", "36", - "MKK", "2.4G", "40M", "HT", "4T", "04", "36", - "FCC", "2.4G", "40M", "HT", "4T", "05", "36", - "ETSI", "2.4G", "40M", "HT", "4T", "05", "36", - "MKK", "2.4G", "40M", "HT", "4T", "05", "36", - "FCC", "2.4G", "40M", "HT", "4T", "06", "36", - "ETSI", "2.4G", "40M", "HT", "4T", "06", "36", - "MKK", "2.4G", "40M", "HT", "4T", "06", "36", - "FCC", "2.4G", "40M", "HT", "4T", "07", "36", - "ETSI", "2.4G", "40M", "HT", "4T", "07", "36", - "MKK", "2.4G", "40M", "HT", "4T", "07", "36", - "FCC", "2.4G", "40M", "HT", "4T", "08", "36", - "ETSI", "2.4G", "40M", "HT", "4T", "08", "36", - "MKK", "2.4G", "40M", "HT", "4T", "08", "36", - "FCC", "2.4G", "40M", "HT", "4T", "09", "36", - "ETSI", "2.4G", "40M", "HT", "4T", "09", "36", - "MKK", "2.4G", "40M", "HT", "4T", "09", "36", - "FCC", "2.4G", "40M", "HT", "4T", "10", "36", - "ETSI", "2.4G", "40M", "HT", "4T", "10", "36", - "MKK", "2.4G", "40M", "HT", "4T", "10", "36", - "FCC", "2.4G", "40M", "HT", "4T", "11", "36", - "ETSI", "2.4G", "40M", "HT", "4T", "11", "36", - "MKK", "2.4G", "40M", "HT", "4T", "11", "36", - "FCC", "2.4G", "40M", "HT", "4T", "12", "63", - "ETSI", "2.4G", "40M", "HT", "4T", "12", "36", - "MKK", "2.4G", "40M", "HT", "4T", "12", "36", - "FCC", "2.4G", "40M", "HT", "4T", "13", "63", - "ETSI", "2.4G", "40M", "HT", "4T", "13", "36", - "MKK", "2.4G", "40M", "HT", "4T", "13", "36", - "FCC", "2.4G", "40M", "HT", "4T", "14", "63", - "ETSI", "2.4G", "40M", "HT", "4T", "14", "63", - "MKK", "2.4G", "40M", "HT", "4T", "14", "63", - "FCC", "5G", "20M", "OFDM", "1T", "36", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "36", "36", - "MKK", "5G", "20M", "OFDM", "1T", "36", "36", - "FCC", "5G", "20M", "OFDM", "1T", "40", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "40", "36", - "MKK", "5G", "20M", "OFDM", "1T", "40", "36", - "FCC", "5G", "20M", "OFDM", "1T", "44", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "44", "36", - "MKK", "5G", "20M", "OFDM", "1T", "44", "36", - "FCC", "5G", "20M", "OFDM", "1T", "48", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "48", "36", - "MKK", "5G", "20M", "OFDM", "1T", "48", "36", - "FCC", "5G", "20M", "OFDM", "1T", "52", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "52", "36", - "MKK", "5G", "20M", "OFDM", "1T", "52", "36", - "FCC", "5G", "20M", "OFDM", "1T", "56", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "56", "36", - "MKK", "5G", "20M", "OFDM", "1T", "56", "36", - "FCC", "5G", "20M", "OFDM", "1T", "60", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "60", "36", - "MKK", "5G", "20M", "OFDM", "1T", "60", "36", - "FCC", "5G", "20M", "OFDM", "1T", "64", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "64", "36", - "MKK", "5G", "20M", "OFDM", "1T", "64", "36", - "FCC", "5G", "20M", "OFDM", "1T", "100", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "100", "36", - "MKK", "5G", "20M", "OFDM", "1T", "100", "36", - "FCC", "5G", "20M", "OFDM", "1T", "104", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "104", "36", - "MKK", "5G", "20M", "OFDM", "1T", "104", "36", - "FCC", "5G", "20M", "OFDM", "1T", "108", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "108", "36", - "MKK", "5G", "20M", "OFDM", "1T", "108", "36", - "FCC", "5G", "20M", "OFDM", "1T", "112", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "112", "36", - "MKK", "5G", "20M", "OFDM", "1T", "112", "36", - "FCC", "5G", "20M", "OFDM", "1T", "116", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "116", "36", - "MKK", "5G", "20M", "OFDM", "1T", "116", "36", - "FCC", "5G", "20M", "OFDM", "1T", "120", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "120", "36", - "MKK", "5G", "20M", "OFDM", "1T", "120", "36", - "FCC", "5G", "20M", "OFDM", "1T", "124", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "124", "36", - "MKK", "5G", "20M", "OFDM", "1T", "124", "36", - "FCC", "5G", "20M", "OFDM", "1T", "128", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "128", "36", - "MKK", "5G", "20M", "OFDM", "1T", "128", "36", - "FCC", "5G", "20M", "OFDM", "1T", "132", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "132", "36", - "MKK", "5G", "20M", "OFDM", "1T", "132", "36", - "FCC", "5G", "20M", "OFDM", "1T", "136", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "136", "36", - "MKK", "5G", "20M", "OFDM", "1T", "136", "36", - "FCC", "5G", "20M", "OFDM", "1T", "140", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "140", "36", - "MKK", "5G", "20M", "OFDM", "1T", "140", "36", - "FCC", "5G", "20M", "OFDM", "1T", "149", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "149", "36", - "MKK", "5G", "20M", "OFDM", "1T", "149", "63", - "FCC", "5G", "20M", "OFDM", "1T", "153", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "153", "36", - "MKK", "5G", "20M", "OFDM", "1T", "153", "63", - "FCC", "5G", "20M", "OFDM", "1T", "157", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "157", "36", - "MKK", "5G", "20M", "OFDM", "1T", "157", "63", - "FCC", "5G", "20M", "OFDM", "1T", "161", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "161", "36", - "MKK", "5G", "20M", "OFDM", "1T", "161", "63", - "FCC", "5G", "20M", "OFDM", "1T", "165", "36", - "ETSI", "5G", "20M", "OFDM", "1T", "165", "36", - "MKK", "5G", "20M", "OFDM", "1T", "165", "63", - "FCC", "5G", "20M", "HT", "1T", "36", "36", - "ETSI", "5G", "20M", "HT", "1T", "36", "36", - "MKK", "5G", "20M", "HT", "1T", "36", "36", - "FCC", "5G", "20M", "HT", "1T", "40", "36", - "ETSI", "5G", "20M", "HT", "1T", "40", "36", - "MKK", "5G", "20M", "HT", "1T", "40", "36", - "FCC", "5G", "20M", "HT", "1T", "44", "36", - "ETSI", "5G", "20M", "HT", "1T", "44", "36", - "MKK", "5G", "20M", "HT", "1T", "44", "36", - "FCC", "5G", "20M", "HT", "1T", "48", "36", - "ETSI", "5G", "20M", "HT", "1T", "48", "36", - "MKK", "5G", "20M", "HT", "1T", "48", "36", - "FCC", "5G", "20M", "HT", "1T", "52", "36", - "ETSI", "5G", "20M", "HT", "1T", "52", "36", - "MKK", "5G", "20M", "HT", "1T", "52", "36", - "FCC", "5G", "20M", "HT", "1T", "56", "36", - "ETSI", "5G", "20M", "HT", "1T", "56", "36", - "MKK", "5G", "20M", "HT", "1T", "56", "36", - "FCC", "5G", "20M", "HT", "1T", "60", "36", - "ETSI", "5G", "20M", "HT", "1T", "60", "36", - "MKK", "5G", "20M", "HT", "1T", "60", "36", - "FCC", "5G", "20M", "HT", "1T", "64", "36", - "ETSI", "5G", "20M", "HT", "1T", "64", "36", - "MKK", "5G", "20M", "HT", "1T", "64", "36", - "FCC", "5G", "20M", "HT", "1T", "100", "36", - "ETSI", "5G", "20M", "HT", "1T", "100", "36", - "MKK", "5G", "20M", "HT", "1T", "100", "36", - "FCC", "5G", "20M", "HT", "1T", "104", "36", - "ETSI", "5G", "20M", "HT", "1T", "104", "36", - "MKK", "5G", "20M", "HT", "1T", "104", "36", - "FCC", "5G", "20M", "HT", "1T", "108", "36", - "ETSI", "5G", "20M", "HT", "1T", "108", "36", - "MKK", "5G", "20M", "HT", "1T", "108", "36", - "FCC", "5G", "20M", "HT", "1T", "112", "36", - "ETSI", "5G", "20M", "HT", "1T", "112", "36", - "MKK", "5G", "20M", "HT", "1T", "112", "36", - "FCC", "5G", "20M", "HT", "1T", "116", "36", - "ETSI", "5G", "20M", "HT", "1T", "116", "36", - "MKK", "5G", "20M", "HT", "1T", "116", "36", - "FCC", "5G", "20M", "HT", "1T", "120", "36", - "ETSI", "5G", "20M", "HT", "1T", "120", "36", - "MKK", "5G", "20M", "HT", "1T", "120", "36", - "FCC", "5G", "20M", "HT", "1T", "124", "36", - "ETSI", "5G", "20M", "HT", "1T", "124", "36", - "MKK", "5G", "20M", "HT", "1T", "124", "36", - "FCC", "5G", "20M", "HT", "1T", "128", "36", - "ETSI", "5G", "20M", "HT", "1T", "128", "36", - "MKK", "5G", "20M", "HT", "1T", "128", "36", - "FCC", "5G", "20M", "HT", "1T", "132", "36", - "ETSI", "5G", "20M", "HT", "1T", "132", "36", - "MKK", "5G", "20M", "HT", "1T", "132", "36", - "FCC", "5G", "20M", "HT", "1T", "136", "36", - "ETSI", "5G", "20M", "HT", "1T", "136", "36", - "MKK", "5G", "20M", "HT", "1T", "136", "36", - "FCC", "5G", "20M", "HT", "1T", "140", "36", - "ETSI", "5G", "20M", "HT", "1T", "140", "36", - "MKK", "5G", "20M", "HT", "1T", "140", "36", - "FCC", "5G", "20M", "HT", "1T", "149", "36", - "ETSI", "5G", "20M", "HT", "1T", "149", "36", - "MKK", "5G", "20M", "HT", "1T", "149", "63", - "FCC", "5G", "20M", "HT", "1T", "153", "36", - "ETSI", "5G", "20M", "HT", "1T", "153", "36", - "MKK", "5G", "20M", "HT", "1T", "153", "63", - "FCC", "5G", "20M", "HT", "1T", "157", "36", - "ETSI", "5G", "20M", "HT", "1T", "157", "36", - "MKK", "5G", "20M", "HT", "1T", "157", "63", - "FCC", "5G", "20M", "HT", "1T", "161", "36", - "ETSI", "5G", "20M", "HT", "1T", "161", "36", - "MKK", "5G", "20M", "HT", "1T", "161", "63", - "FCC", "5G", "20M", "HT", "1T", "165", "36", - "ETSI", "5G", "20M", "HT", "1T", "165", "36", - "MKK", "5G", "20M", "HT", "1T", "165", "63", - "FCC", "5G", "20M", "HT", "2T", "36", "36", - "ETSI", "5G", "20M", "HT", "2T", "36", "36", - "MKK", "5G", "20M", "HT", "2T", "36", "36", - "FCC", "5G", "20M", "HT", "2T", "40", "36", - "ETSI", "5G", "20M", "HT", "2T", "40", "36", - "MKK", "5G", "20M", "HT", "2T", "40", "36", - "FCC", "5G", "20M", "HT", "2T", "44", "36", - "ETSI", "5G", "20M", "HT", "2T", "44", "36", - "MKK", "5G", "20M", "HT", "2T", "44", "36", - "FCC", "5G", "20M", "HT", "2T", "48", "36", - "ETSI", "5G", "20M", "HT", "2T", "48", "36", - "MKK", "5G", "20M", "HT", "2T", "48", "36", - "FCC", "5G", "20M", "HT", "2T", "52", "36", - "ETSI", "5G", "20M", "HT", "2T", "52", "36", - "MKK", "5G", "20M", "HT", "2T", "52", "36", - "FCC", "5G", "20M", "HT", "2T", "56", "36", - "ETSI", "5G", "20M", "HT", "2T", "56", "36", - "MKK", "5G", "20M", "HT", "2T", "56", "36", - "FCC", "5G", "20M", "HT", "2T", "60", "36", - "ETSI", "5G", "20M", "HT", "2T", "60", "36", - "MKK", "5G", "20M", "HT", "2T", "60", "36", - "FCC", "5G", "20M", "HT", "2T", "64", "36", - "ETSI", "5G", "20M", "HT", "2T", "64", "36", - "MKK", "5G", "20M", "HT", "2T", "64", "36", - "FCC", "5G", "20M", "HT", "2T", "100", "36", - "ETSI", "5G", "20M", "HT", "2T", "100", "36", - "MKK", "5G", "20M", "HT", "2T", "100", "36", - "FCC", "5G", "20M", "HT", "2T", "104", "36", - "ETSI", "5G", "20M", "HT", "2T", "104", "36", - "MKK", "5G", "20M", "HT", "2T", "104", "36", - "FCC", "5G", "20M", "HT", "2T", "108", "36", - "ETSI", "5G", "20M", "HT", "2T", "108", "36", - "MKK", "5G", "20M", "HT", "2T", "108", "36", - "FCC", "5G", "20M", "HT", "2T", "112", "36", - "ETSI", "5G", "20M", "HT", "2T", "112", "36", - "MKK", "5G", "20M", "HT", "2T", "112", "36", - "FCC", "5G", "20M", "HT", "2T", "116", "36", - "ETSI", "5G", "20M", "HT", "2T", "116", "36", - "MKK", "5G", "20M", "HT", "2T", "116", "36", - "FCC", "5G", "20M", "HT", "2T", "120", "36", - "ETSI", "5G", "20M", "HT", "2T", "120", "36", - "MKK", "5G", "20M", "HT", "2T", "120", "36", - "FCC", "5G", "20M", "HT", "2T", "124", "36", - "ETSI", "5G", "20M", "HT", "2T", "124", "36", - "MKK", "5G", "20M", "HT", "2T", "124", "36", - "FCC", "5G", "20M", "HT", "2T", "128", "36", - "ETSI", "5G", "20M", "HT", "2T", "128", "36", - "MKK", "5G", "20M", "HT", "2T", "128", "36", - "FCC", "5G", "20M", "HT", "2T", "132", "36", - "ETSI", "5G", "20M", "HT", "2T", "132", "36", - "MKK", "5G", "20M", "HT", "2T", "132", "36", - "FCC", "5G", "20M", "HT", "2T", "136", "36", - "ETSI", "5G", "20M", "HT", "2T", "136", "36", - "MKK", "5G", "20M", "HT", "2T", "136", "36", - "FCC", "5G", "20M", "HT", "2T", "140", "36", - "ETSI", "5G", "20M", "HT", "2T", "140", "36", - "MKK", "5G", "20M", "HT", "2T", "140", "36", - "FCC", "5G", "20M", "HT", "2T", "149", "36", - "ETSI", "5G", "20M", "HT", "2T", "149", "36", - "MKK", "5G", "20M", "HT", "2T", "149", "63", - "FCC", "5G", "20M", "HT", "2T", "153", "36", - "ETSI", "5G", "20M", "HT", "2T", "153", "36", - "MKK", "5G", "20M", "HT", "2T", "153", "63", - "FCC", "5G", "20M", "HT", "2T", "157", "36", - "ETSI", "5G", "20M", "HT", "2T", "157", "36", - "MKK", "5G", "20M", "HT", "2T", "157", "63", - "FCC", "5G", "20M", "HT", "2T", "161", "36", - "ETSI", "5G", "20M", "HT", "2T", "161", "36", - "MKK", "5G", "20M", "HT", "2T", "161", "63", - "FCC", "5G", "20M", "HT", "2T", "165", "36", - "ETSI", "5G", "20M", "HT", "2T", "165", "36", - "MKK", "5G", "20M", "HT", "2T", "165", "63", - "FCC", "5G", "20M", "HT", "3T", "36", "36", - "ETSI", "5G", "20M", "HT", "3T", "36", "36", - "MKK", "5G", "20M", "HT", "3T", "36", "36", - "FCC", "5G", "20M", "HT", "3T", "40", "36", - "ETSI", "5G", "20M", "HT", "3T", "40", "36", - "MKK", "5G", "20M", "HT", "3T", "40", "36", - "FCC", "5G", "20M", "HT", "3T", "44", "36", - "ETSI", "5G", "20M", "HT", "3T", "44", "36", - "MKK", "5G", "20M", "HT", "3T", "44", "36", - "FCC", "5G", "20M", "HT", "3T", "48", "36", - "ETSI", "5G", "20M", "HT", "3T", "48", "36", - "MKK", "5G", "20M", "HT", "3T", "48", "36", - "FCC", "5G", "20M", "HT", "3T", "52", "36", - "ETSI", "5G", "20M", "HT", "3T", "52", "36", - "MKK", "5G", "20M", "HT", "3T", "52", "36", - "FCC", "5G", "20M", "HT", "3T", "56", "36", - "ETSI", "5G", "20M", "HT", "3T", "56", "36", - "MKK", "5G", "20M", "HT", "3T", "56", "36", - "FCC", "5G", "20M", "HT", "3T", "60", "36", - "ETSI", "5G", "20M", "HT", "3T", "60", "36", - "MKK", "5G", "20M", "HT", "3T", "60", "36", - "FCC", "5G", "20M", "HT", "3T", "64", "36", - "ETSI", "5G", "20M", "HT", "3T", "64", "36", - "MKK", "5G", "20M", "HT", "3T", "64", "36", - "FCC", "5G", "20M", "HT", "3T", "100", "36", - "ETSI", "5G", "20M", "HT", "3T", "100", "36", - "MKK", "5G", "20M", "HT", "3T", "100", "36", - "FCC", "5G", "20M", "HT", "3T", "104", "36", - "ETSI", "5G", "20M", "HT", "3T", "104", "36", - "MKK", "5G", "20M", "HT", "3T", "104", "36", - "FCC", "5G", "20M", "HT", "3T", "108", "36", - "ETSI", "5G", "20M", "HT", "3T", "108", "36", - "MKK", "5G", "20M", "HT", "3T", "108", "36", - "FCC", "5G", "20M", "HT", "3T", "112", "36", - "ETSI", "5G", "20M", "HT", "3T", "112", "36", - "MKK", "5G", "20M", "HT", "3T", "112", "36", - "FCC", "5G", "20M", "HT", "3T", "116", "36", - "ETSI", "5G", "20M", "HT", "3T", "116", "36", - "MKK", "5G", "20M", "HT", "3T", "116", "36", - "FCC", "5G", "20M", "HT", "3T", "120", "36", - "ETSI", "5G", "20M", "HT", "3T", "120", "36", - "MKK", "5G", "20M", "HT", "3T", "120", "36", - "FCC", "5G", "20M", "HT", "3T", "124", "36", - "ETSI", "5G", "20M", "HT", "3T", "124", "36", - "MKK", "5G", "20M", "HT", "3T", "124", "36", - "FCC", "5G", "20M", "HT", "3T", "128", "36", - "ETSI", "5G", "20M", "HT", "3T", "128", "36", - "MKK", "5G", "20M", "HT", "3T", "128", "36", - "FCC", "5G", "20M", "HT", "3T", "132", "36", - "ETSI", "5G", "20M", "HT", "3T", "132", "36", - "MKK", "5G", "20M", "HT", "3T", "132", "36", - "FCC", "5G", "20M", "HT", "3T", "136", "36", - "ETSI", "5G", "20M", "HT", "3T", "136", "36", - "MKK", "5G", "20M", "HT", "3T", "136", "36", - "FCC", "5G", "20M", "HT", "3T", "140", "36", - "ETSI", "5G", "20M", "HT", "3T", "140", "36", - "MKK", "5G", "20M", "HT", "3T", "140", "36", - "FCC", "5G", "20M", "HT", "3T", "149", "36", - "ETSI", "5G", "20M", "HT", "3T", "149", "36", - "MKK", "5G", "20M", "HT", "3T", "149", "63", - "FCC", "5G", "20M", "HT", "3T", "153", "36", - "ETSI", "5G", "20M", "HT", "3T", "153", "36", - "MKK", "5G", "20M", "HT", "3T", "153", "63", - "FCC", "5G", "20M", "HT", "3T", "157", "36", - "ETSI", "5G", "20M", "HT", "3T", "157", "36", - "MKK", "5G", "20M", "HT", "3T", "157", "63", - "FCC", "5G", "20M", "HT", "3T", "161", "36", - "ETSI", "5G", "20M", "HT", "3T", "161", "36", - "MKK", "5G", "20M", "HT", "3T", "161", "63", - "FCC", "5G", "20M", "HT", "3T", "165", "36", - "ETSI", "5G", "20M", "HT", "3T", "165", "36", - "MKK", "5G", "20M", "HT", "3T", "165", "63", - "FCC", "5G", "20M", "HT", "4T", "36", "36", - "ETSI", "5G", "20M", "HT", "4T", "36", "36", - "MKK", "5G", "20M", "HT", "4T", "36", "36", - "FCC", "5G", "20M", "HT", "4T", "40", "36", - "ETSI", "5G", "20M", "HT", "4T", "40", "36", - "MKK", "5G", "20M", "HT", "4T", "40", "36", - "FCC", "5G", "20M", "HT", "4T", "44", "36", - "ETSI", "5G", "20M", "HT", "4T", "44", "36", - "MKK", "5G", "20M", "HT", "4T", "44", "36", - "FCC", "5G", "20M", "HT", "4T", "48", "36", - "ETSI", "5G", "20M", "HT", "4T", "48", "36", - "MKK", "5G", "20M", "HT", "4T", "48", "36", - "FCC", "5G", "20M", "HT", "4T", "52", "36", - "ETSI", "5G", "20M", "HT", "4T", "52", "36", - "MKK", "5G", "20M", "HT", "4T", "52", "36", - "FCC", "5G", "20M", "HT", "4T", "56", "36", - "ETSI", "5G", "20M", "HT", "4T", "56", "36", - "MKK", "5G", "20M", "HT", "4T", "56", "36", - "FCC", "5G", "20M", "HT", "4T", "60", "36", - "ETSI", "5G", "20M", "HT", "4T", "60", "36", - "MKK", "5G", "20M", "HT", "4T", "60", "36", - "FCC", "5G", "20M", "HT", "4T", "64", "36", - "ETSI", "5G", "20M", "HT", "4T", "64", "36", - "MKK", "5G", "20M", "HT", "4T", "64", "36", - "FCC", "5G", "20M", "HT", "4T", "100", "36", - "ETSI", "5G", "20M", "HT", "4T", "100", "36", - "MKK", "5G", "20M", "HT", "4T", "100", "36", - "FCC", "5G", "20M", "HT", "4T", "104", "36", - "ETSI", "5G", "20M", "HT", "4T", "104", "36", - "MKK", "5G", "20M", "HT", "4T", "104", "36", - "FCC", "5G", "20M", "HT", "4T", "108", "36", - "ETSI", "5G", "20M", "HT", "4T", "108", "36", - "MKK", "5G", "20M", "HT", "4T", "108", "36", - "FCC", "5G", "20M", "HT", "4T", "112", "36", - "ETSI", "5G", "20M", "HT", "4T", "112", "36", - "MKK", "5G", "20M", "HT", "4T", "112", "36", - "FCC", "5G", "20M", "HT", "4T", "116", "36", - "ETSI", "5G", "20M", "HT", "4T", "116", "36", - "MKK", "5G", "20M", "HT", "4T", "116", "36", - "FCC", "5G", "20M", "HT", "4T", "120", "36", - "ETSI", "5G", "20M", "HT", "4T", "120", "36", - "MKK", "5G", "20M", "HT", "4T", "120", "36", - "FCC", "5G", "20M", "HT", "4T", "124", "36", - "ETSI", "5G", "20M", "HT", "4T", "124", "36", - "MKK", "5G", "20M", "HT", "4T", "124", "36", - "FCC", "5G", "20M", "HT", "4T", "128", "36", - "ETSI", "5G", "20M", "HT", "4T", "128", "36", - "MKK", "5G", "20M", "HT", "4T", "128", "36", - "FCC", "5G", "20M", "HT", "4T", "132", "36", - "ETSI", "5G", "20M", "HT", "4T", "132", "36", - "MKK", "5G", "20M", "HT", "4T", "132", "36", - "FCC", "5G", "20M", "HT", "4T", "136", "36", - "ETSI", "5G", "20M", "HT", "4T", "136", "36", - "MKK", "5G", "20M", "HT", "4T", "136", "36", - "FCC", "5G", "20M", "HT", "4T", "140", "36", - "ETSI", "5G", "20M", "HT", "4T", "140", "36", - "MKK", "5G", "20M", "HT", "4T", "140", "36", - "FCC", "5G", "20M", "HT", "4T", "149", "36", - "ETSI", "5G", "20M", "HT", "4T", "149", "36", - "MKK", "5G", "20M", "HT", "4T", "149", "63", - "FCC", "5G", "20M", "HT", "4T", "153", "36", - "ETSI", "5G", "20M", "HT", "4T", "153", "36", - "MKK", "5G", "20M", "HT", "4T", "153", "63", - "FCC", "5G", "20M", "HT", "4T", "157", "36", - "ETSI", "5G", "20M", "HT", "4T", "157", "36", - "MKK", "5G", "20M", "HT", "4T", "157", "63", - "FCC", "5G", "20M", "HT", "4T", "161", "36", - "ETSI", "5G", "20M", "HT", "4T", "161", "36", - "MKK", "5G", "20M", "HT", "4T", "161", "63", - "FCC", "5G", "20M", "HT", "4T", "165", "36", - "ETSI", "5G", "20M", "HT", "4T", "165", "36", - "MKK", "5G", "20M", "HT", "4T", "165", "63", - "FCC", "5G", "40M", "HT", "1T", "38", "36", - "ETSI", "5G", "40M", "HT", "1T", "38", "36", - "MKK", "5G", "40M", "HT", "1T", "38", "36", - "FCC", "5G", "40M", "HT", "1T", "46", "36", - "ETSI", "5G", "40M", "HT", "1T", "46", "36", - "MKK", "5G", "40M", "HT", "1T", "46", "36", - "FCC", "5G", "40M", "HT", "1T", "54", "36", - "ETSI", "5G", "40M", "HT", "1T", "54", "36", - "MKK", "5G", "40M", "HT", "1T", "54", "36", - "FCC", "5G", "40M", "HT", "1T", "62", "36", - "ETSI", "5G", "40M", "HT", "1T", "62", "36", - "MKK", "5G", "40M", "HT", "1T", "62", "36", - "FCC", "5G", "40M", "HT", "1T", "102", "36", - "ETSI", "5G", "40M", "HT", "1T", "102", "36", - "MKK", "5G", "40M", "HT", "1T", "102", "36", - "FCC", "5G", "40M", "HT", "1T", "110", "36", - "ETSI", "5G", "40M", "HT", "1T", "110", "36", - "MKK", "5G", "40M", "HT", "1T", "110", "36", - "FCC", "5G", "40M", "HT", "1T", "118", "36", - "ETSI", "5G", "40M", "HT", "1T", "118", "36", - "MKK", "5G", "40M", "HT", "1T", "118", "36", - "FCC", "5G", "40M", "HT", "1T", "126", "36", - "ETSI", "5G", "40M", "HT", "1T", "126", "36", - "MKK", "5G", "40M", "HT", "1T", "126", "36", - "FCC", "5G", "40M", "HT", "1T", "134", "36", - "ETSI", "5G", "40M", "HT", "1T", "134", "36", - "MKK", "5G", "40M", "HT", "1T", "134", "36", - "FCC", "5G", "40M", "HT", "1T", "151", "36", - "ETSI", "5G", "40M", "HT", "1T", "151", "36", - "MKK", "5G", "40M", "HT", "1T", "151", "63", - "FCC", "5G", "40M", "HT", "1T", "159", "36", - "ETSI", "5G", "40M", "HT", "1T", "159", "36", - "MKK", "5G", "40M", "HT", "1T", "159", "63", - "FCC", "5G", "40M", "HT", "2T", "38", "36", - "ETSI", "5G", "40M", "HT", "2T", "38", "36", - "MKK", "5G", "40M", "HT", "2T", "38", "36", - "FCC", "5G", "40M", "HT", "2T", "46", "36", - "ETSI", "5G", "40M", "HT", "2T", "46", "36", - "MKK", "5G", "40M", "HT", "2T", "46", "36", - "FCC", "5G", "40M", "HT", "2T", "54", "36", - "ETSI", "5G", "40M", "HT", "2T", "54", "36", - "MKK", "5G", "40M", "HT", "2T", "54", "36", - "FCC", "5G", "40M", "HT", "2T", "62", "36", - "ETSI", "5G", "40M", "HT", "2T", "62", "36", - "MKK", "5G", "40M", "HT", "2T", "62", "36", - "FCC", "5G", "40M", "HT", "2T", "102", "36", - "ETSI", "5G", "40M", "HT", "2T", "102", "36", - "MKK", "5G", "40M", "HT", "2T", "102", "36", - "FCC", "5G", "40M", "HT", "2T", "110", "36", - "ETSI", "5G", "40M", "HT", "2T", "110", "36", - "MKK", "5G", "40M", "HT", "2T", "110", "36", - "FCC", "5G", "40M", "HT", "2T", "118", "36", - "ETSI", "5G", "40M", "HT", "2T", "118", "36", - "MKK", "5G", "40M", "HT", "2T", "118", "36", - "FCC", "5G", "40M", "HT", "2T", "126", "36", - "ETSI", "5G", "40M", "HT", "2T", "126", "36", - "MKK", "5G", "40M", "HT", "2T", "126", "36", - "FCC", "5G", "40M", "HT", "2T", "134", "36", - "ETSI", "5G", "40M", "HT", "2T", "134", "36", - "MKK", "5G", "40M", "HT", "2T", "134", "36", - "FCC", "5G", "40M", "HT", "2T", "151", "36", - "ETSI", "5G", "40M", "HT", "2T", "151", "36", - "MKK", "5G", "40M", "HT", "2T", "151", "63", - "FCC", "5G", "40M", "HT", "2T", "159", "36", - "ETSI", "5G", "40M", "HT", "2T", "159", "36", - "MKK", "5G", "40M", "HT", "2T", "159", "63", - "FCC", "5G", "40M", "HT", "3T", "38", "36", - "ETSI", "5G", "40M", "HT", "3T", "38", "36", - "MKK", "5G", "40M", "HT", "3T", "38", "36", - "FCC", "5G", "40M", "HT", "3T", "46", "36", - "ETSI", "5G", "40M", "HT", "3T", "46", "36", - "MKK", "5G", "40M", "HT", "3T", "46", "36", - "FCC", "5G", "40M", "HT", "3T", "54", "36", - "ETSI", "5G", "40M", "HT", "3T", "54", "36", - "MKK", "5G", "40M", "HT", "3T", "54", "36", - "FCC", "5G", "40M", "HT", "3T", "62", "36", - "ETSI", "5G", "40M", "HT", "3T", "62", "36", - "MKK", "5G", "40M", "HT", "3T", "62", "36", - "FCC", "5G", "40M", "HT", "3T", "102", "36", - "ETSI", "5G", "40M", "HT", "3T", "102", "36", - "MKK", "5G", "40M", "HT", "3T", "102", "36", - "FCC", "5G", "40M", "HT", "3T", "110", "36", - "ETSI", "5G", "40M", "HT", "3T", "110", "36", - "MKK", "5G", "40M", "HT", "3T", "110", "36", - "FCC", "5G", "40M", "HT", "3T", "118", "36", - "ETSI", "5G", "40M", "HT", "3T", "118", "36", - "MKK", "5G", "40M", "HT", "3T", "118", "36", - "FCC", "5G", "40M", "HT", "3T", "126", "36", - "ETSI", "5G", "40M", "HT", "3T", "126", "36", - "MKK", "5G", "40M", "HT", "3T", "126", "36", - "FCC", "5G", "40M", "HT", "3T", "134", "36", - "ETSI", "5G", "40M", "HT", "3T", "134", "36", - "MKK", "5G", "40M", "HT", "3T", "134", "36", - "FCC", "5G", "40M", "HT", "3T", "151", "36", - "ETSI", "5G", "40M", "HT", "3T", "151", "36", - "MKK", "5G", "40M", "HT", "3T", "151", "63", - "FCC", "5G", "40M", "HT", "3T", "159", "36", - "ETSI", "5G", "40M", "HT", "3T", "159", "36", - "MKK", "5G", "40M", "HT", "3T", "159", "63", - "FCC", "5G", "40M", "HT", "4T", "38", "36", - "ETSI", "5G", "40M", "HT", "4T", "38", "36", - "MKK", "5G", "40M", "HT", "4T", "38", "36", - "FCC", "5G", "40M", "HT", "4T", "46", "36", - "ETSI", "5G", "40M", "HT", "4T", "46", "36", - "MKK", "5G", "40M", "HT", "4T", "46", "36", - "FCC", "5G", "40M", "HT", "4T", "54", "36", - "ETSI", "5G", "40M", "HT", "4T", "54", "36", - "MKK", "5G", "40M", "HT", "4T", "54", "36", - "FCC", "5G", "40M", "HT", "4T", "62", "36", - "ETSI", "5G", "40M", "HT", "4T", "62", "36", - "MKK", "5G", "40M", "HT", "4T", "62", "36", - "FCC", "5G", "40M", "HT", "4T", "102", "36", - "ETSI", "5G", "40M", "HT", "4T", "102", "36", - "MKK", "5G", "40M", "HT", "4T", "102", "36", - "FCC", "5G", "40M", "HT", "4T", "110", "36", - "ETSI", "5G", "40M", "HT", "4T", "110", "36", - "MKK", "5G", "40M", "HT", "4T", "110", "36", - "FCC", "5G", "40M", "HT", "4T", "118", "36", - "ETSI", "5G", "40M", "HT", "4T", "118", "36", - "MKK", "5G", "40M", "HT", "4T", "118", "36", - "FCC", "5G", "40M", "HT", "4T", "126", "36", - "ETSI", "5G", "40M", "HT", "4T", "126", "36", - "MKK", "5G", "40M", "HT", "4T", "126", "36", - "FCC", "5G", "40M", "HT", "4T", "134", "36", - "ETSI", "5G", "40M", "HT", "4T", "134", "36", - "MKK", "5G", "40M", "HT", "4T", "134", "36", - "FCC", "5G", "40M", "HT", "4T", "151", "36", - "ETSI", "5G", "40M", "HT", "4T", "151", "36", - "MKK", "5G", "40M", "HT", "4T", "151", "63", - "FCC", "5G", "40M", "HT", "4T", "159", "36", - "ETSI", "5G", "40M", "HT", "4T", "159", "36", - "MKK", "5G", "40M", "HT", "4T", "159", "63", - "FCC", "5G", "80M", "VHT", "1T", "42", "36", - "ETSI", "5G", "80M", "VHT", "1T", "42", "36", - "MKK", "5G", "80M", "VHT", "1T", "42", "36", - "FCC", "5G", "80M", "VHT", "1T", "58", "36", - "ETSI", "5G", "80M", "VHT", "1T", "58", "36", - "MKK", "5G", "80M", "VHT", "1T", "58", "36", - "FCC", "5G", "80M", "VHT", "1T", "106", "36", - "ETSI", "5G", "80M", "VHT", "1T", "106", "36", - "MKK", "5G", "80M", "VHT", "1T", "106", "36", - "FCC", "5G", "80M", "VHT", "1T", "122", "36", - "ETSI", "5G", "80M", "VHT", "1T", "122", "36", - "MKK", "5G", "80M", "VHT", "1T", "122", "36", - "FCC", "5G", "80M", "VHT", "1T", "155", "36", - "ETSI", "5G", "80M", "VHT", "1T", "155", "36", - "MKK", "5G", "80M", "VHT", "1T", "155", "63", - "FCC", "5G", "80M", "VHT", "2T", "42", "36", - "ETSI", "5G", "80M", "VHT", "2T", "42", "36", - "MKK", "5G", "80M", "VHT", "2T", "42", "36", - "FCC", "5G", "80M", "VHT", "2T", "58", "36", - "ETSI", "5G", "80M", "VHT", "2T", "58", "36", - "MKK", "5G", "80M", "VHT", "2T", "58", "36", - "FCC", "5G", "80M", "VHT", "2T", "106", "36", - "ETSI", "5G", "80M", "VHT", "2T", "106", "36", - "MKK", "5G", "80M", "VHT", "2T", "106", "36", - "FCC", "5G", "80M", "VHT", "2T", "122", "36", - "ETSI", "5G", "80M", "VHT", "2T", "122", "36", - "MKK", "5G", "80M", "VHT", "2T", "122", "36", - "FCC", "5G", "80M", "VHT", "2T", "155", "36", - "ETSI", "5G", "80M", "VHT", "2T", "155", "36", - "MKK", "5G", "80M", "VHT", "2T", "155", "63", - "FCC", "5G", "80M", "VHT", "3T", "42", "36", - "ETSI", "5G", "80M", "VHT", "3T", "42", "36", - "MKK", "5G", "80M", "VHT", "3T", "42", "36", - "FCC", "5G", "80M", "VHT", "3T", "58", "36", - "ETSI", "5G", "80M", "VHT", "3T", "58", "36", - "MKK", "5G", "80M", "VHT", "3T", "58", "36", - "FCC", "5G", "80M", "VHT", "3T", "106", "36", - "ETSI", "5G", "80M", "VHT", "3T", "106", "36", - "MKK", "5G", "80M", "VHT", "3T", "106", "36", - "FCC", "5G", "80M", "VHT", "3T", "122", "36", - "ETSI", "5G", "80M", "VHT", "3T", "122", "36", - "MKK", "5G", "80M", "VHT", "3T", "122", "36", - "FCC", "5G", "80M", "VHT", "3T", "155", "36", - "ETSI", "5G", "80M", "VHT", "3T", "155", "36", - "MKK", "5G", "80M", "VHT", "3T", "155", "63", - "FCC", "5G", "80M", "VHT", "4T", "42", "36", - "ETSI", "5G", "80M", "VHT", "4T", "42", "36", - "MKK", "5G", "80M", "VHT", "4T", "42", "36", - "FCC", "5G", "80M", "VHT", "4T", "58", "36", - "ETSI", "5G", "80M", "VHT", "4T", "58", "36", - "MKK", "5G", "80M", "VHT", "4T", "58", "36", - "FCC", "5G", "80M", "VHT", "4T", "106", "36", - "ETSI", "5G", "80M", "VHT", "4T", "106", "36", - "MKK", "5G", "80M", "VHT", "4T", "106", "36", - "FCC", "5G", "80M", "VHT", "4T", "122", "36", - "ETSI", "5G", "80M", "VHT", "4T", "122", "36", - "MKK", "5G", "80M", "VHT", "4T", "122", "36", - "FCC", "5G", "80M", "VHT", "4T", "155", "36", - "ETSI", "5G", "80M", "VHT", "4T", "155", "36", - "MKK", "5G", "80M", "VHT", "4T", "155", "63" -}; - -void -_odm_read_and_config_mp_8814a_txpwr_lmt_type2( - struct dm_struct * pDM_Odm -) -{ - u4Byte i = 0; - u4Byte ArrayLen = sizeof(Array_MP_8814A_TXPWR_LMT_type2)/sizeof(pu1Byte); - pu1Byte *Array = (pu1Byte *)Array_MP_8814A_TXPWR_LMT_type2; - -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - PADAPTER Adapter = pDM_Odm->Adapter; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - PlatformZeroMemory(pHalData->BufOfLinesPwrLmt, MAX_LINES_HWCONFIG_TXT*MAX_BYTES_LINE_HWCONFIG_TXT); - pHalData->nLinesReadPwrLmt = ArrayLen/7; -#endif - - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_8814A_TXPWR_LMT_type2\n"); - - for (i = 0; i < ArrayLen; i += 7) { - pu1Byte regulation = Array[i]; - pu1Byte band = Array[i+1]; - pu1Byte bandwidth = Array[i+2]; - pu1Byte rate = Array[i+3]; - pu1Byte rfPath = Array[i+4]; - pu1Byte chnl = Array[i+5]; - pu1Byte val = Array[i+6]; - - odm_ConfigBB_TXPWR_LMT_8814A(pDM_Odm, regulation, band, bandwidth, rate, rfPath, chnl, val); -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - rsprintf((char *)pHalData->BufOfLinesPwrLmt[i/7], 100, "\"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\",", - regulation, band, bandwidth, rate, rfPath, chnl, val); -#endif - } - -} - -****************************************************************************** -* TXPWR_LMT_Type3.TXT -****************************************************************************** - -const char *Array_MP_8814A_TXPWR_LMT_Type3[] = { - "FCC", "2.4G", "20M", "CCK", "1T", "01", "46", - "ETSI", "2.4G", "20M", "CCK", "1T", "01", "40", - "MKK", "2.4G", "20M", "CCK", "1T", "01", "40", - "FCC", "2.4G", "20M", "CCK", "1T", "02", "46", - "ETSI", "2.4G", "20M", "CCK", "1T", "02", "40", - "MKK", "2.4G", "20M", "CCK", "1T", "02", "40", - "FCC", "2.4G", "20M", "CCK", "1T", "03", "46", - "ETSI", "2.4G", "20M", "CCK", "1T", "03", "40", - "MKK", "2.4G", "20M", "CCK", "1T", "03", "40", - "FCC", "2.4G", "20M", "CCK", "1T", "04", "46", - "ETSI", "2.4G", "20M", "CCK", "1T", "04", "40", - "MKK", "2.4G", "20M", "CCK", "1T", "04", "40", - "FCC", "2.4G", "20M", "CCK", "1T", "05", "46", - "ETSI", "2.4G", "20M", "CCK", "1T", "05", "40", - "MKK", "2.4G", "20M", "CCK", "1T", "05", "40", - "FCC", "2.4G", "20M", "CCK", "1T", "06", "46", - "ETSI", "2.4G", "20M", "CCK", "1T", "06", "40", - "MKK", "2.4G", "20M", "CCK", "1T", "06", "40", - "FCC", "2.4G", "20M", "CCK", "1T", "07", "46", - "ETSI", "2.4G", "20M", "CCK", "1T", "07", "40", - "MKK", "2.4G", "20M", "CCK", "1T", "07", "40", - "FCC", "2.4G", "20M", "CCK", "1T", "08", "46", - "ETSI", "2.4G", "20M", "CCK", "1T", "08", "40", - "MKK", "2.4G", "20M", "CCK", "1T", "08", "40", - "FCC", "2.4G", "20M", "CCK", "1T", "09", "46", - "ETSI", "2.4G", "20M", "CCK", "1T", "09", "40", - "MKK", "2.4G", "20M", "CCK", "1T", "09", "40", - "FCC", "2.4G", "20M", "CCK", "1T", "10", "46", - "ETSI", "2.4G", "20M", "CCK", "1T", "10", "40", - "MKK", "2.4G", "20M", "CCK", "1T", "10", "40", - "FCC", "2.4G", "20M", "CCK", "1T", "11", "46", - "ETSI", "2.4G", "20M", "CCK", "1T", "11", "40", - "MKK", "2.4G", "20M", "CCK", "1T", "11", "40", - "FCC", "2.4G", "20M", "CCK", "1T", "12", "63", - "ETSI", "2.4G", "20M", "CCK", "1T", "12", "40", - "MKK", "2.4G", "20M", "CCK", "1T", "12", "40", - "FCC", "2.4G", "20M", "CCK", "1T", "13", "63", - "ETSI", "2.4G", "20M", "CCK", "1T", "13", "40", - "MKK", "2.4G", "20M", "CCK", "1T", "13", "40", - "FCC", "2.4G", "20M", "CCK", "1T", "14", "63", - "ETSI", "2.4G", "20M", "CCK", "1T", "14", "63", - "MKK", "2.4G", "20M", "CCK", "1T", "14", "40", - "FCC", "2.4G", "20M", "OFDM", "1T", "01", "46", - "ETSI", "2.4G", "20M", "OFDM", "1T", "01", "40", - "MKK", "2.4G", "20M", "OFDM", "1T", "01", "40", - "FCC", "2.4G", "20M", "OFDM", "1T", "02", "46", - "ETSI", "2.4G", "20M", "OFDM", "1T", "02", "40", - "MKK", "2.4G", "20M", "OFDM", "1T", "02", "40", - "FCC", "2.4G", "20M", "OFDM", "1T", "03", "46", - "ETSI", "2.4G", "20M", "OFDM", "1T", "03", "40", - "MKK", "2.4G", "20M", "OFDM", "1T", "03", "40", - "FCC", "2.4G", "20M", "OFDM", "1T", "04", "46", - "ETSI", "2.4G", "20M", "OFDM", "1T", "04", "40", - "MKK", "2.4G", "20M", "OFDM", "1T", "04", "40", - "FCC", "2.4G", "20M", "OFDM", "1T", "05", "46", - "ETSI", "2.4G", "20M", "OFDM", "1T", "05", "40", - "MKK", "2.4G", "20M", "OFDM", "1T", "05", "40", - "FCC", "2.4G", "20M", "OFDM", "1T", "06", "46", - "ETSI", "2.4G", "20M", "OFDM", "1T", "06", "40", - "MKK", "2.4G", "20M", "OFDM", "1T", "06", "40", - "FCC", "2.4G", "20M", "OFDM", "1T", "07", "46", - "ETSI", "2.4G", "20M", "OFDM", "1T", "07", "40", - "MKK", "2.4G", "20M", "OFDM", "1T", "07", "40", - "FCC", "2.4G", "20M", "OFDM", "1T", "08", "46", - "ETSI", "2.4G", "20M", "OFDM", "1T", "08", "40", - "MKK", "2.4G", "20M", "OFDM", "1T", "08", "40", - "FCC", "2.4G", "20M", "OFDM", "1T", "09", "46", - "ETSI", "2.4G", "20M", "OFDM", "1T", "09", "40", - "MKK", "2.4G", "20M", "OFDM", "1T", "09", "40", - "FCC", "2.4G", "20M", "OFDM", "1T", "10", "46", - "ETSI", "2.4G", "20M", "OFDM", "1T", "10", "40", - "MKK", "2.4G", "20M", "OFDM", "1T", "10", "40", - "FCC", "2.4G", "20M", "OFDM", "1T", "11", "46", - "ETSI", "2.4G", "20M", "OFDM", "1T", "11", "40", - "MKK", "2.4G", "20M", "OFDM", "1T", "11", "40", - "FCC", "2.4G", "20M", "OFDM", "1T", "12", "63", - "ETSI", "2.4G", "20M", "OFDM", "1T", "12", "40", - "MKK", "2.4G", "20M", "OFDM", "1T", "12", "40", - "FCC", "2.4G", "20M", "OFDM", "1T", "13", "63", - "ETSI", "2.4G", "20M", "OFDM", "1T", "13", "40", - "MKK", "2.4G", "20M", "OFDM", "1T", "13", "40", - "FCC", "2.4G", "20M", "OFDM", "1T", "14", "63", - "ETSI", "2.4G", "20M", "OFDM", "1T", "14", "63", - "MKK", "2.4G", "20M", "OFDM", "1T", "14", "63", - "FCC", "2.4G", "20M", "HT", "1T", "01", "46", - "ETSI", "2.4G", "20M", "HT", "1T", "01", "40", - "MKK", "2.4G", "20M", "HT", "1T", "01", "40", - "FCC", "2.4G", "20M", "HT", "1T", "02", "46", - "ETSI", "2.4G", "20M", "HT", "1T", "02", "40", - "MKK", "2.4G", "20M", "HT", "1T", "02", "40", - "FCC", "2.4G", "20M", "HT", "1T", "03", "46", - "ETSI", "2.4G", "20M", "HT", "1T", "03", "40", - "MKK", "2.4G", "20M", "HT", "1T", "03", "40", - "FCC", "2.4G", "20M", "HT", "1T", "04", "46", - "ETSI", "2.4G", "20M", "HT", "1T", "04", "40", - "MKK", "2.4G", "20M", "HT", "1T", "04", "40", - "FCC", "2.4G", "20M", "HT", "1T", "05", "46", - "ETSI", "2.4G", "20M", "HT", "1T", "05", "40", - "MKK", "2.4G", "20M", "HT", "1T", "05", "40", - "FCC", "2.4G", "20M", "HT", "1T", "06", "46", - "ETSI", "2.4G", "20M", "HT", "1T", "06", "40", - "MKK", "2.4G", "20M", "HT", "1T", "06", "40", - "FCC", "2.4G", "20M", "HT", "1T", "07", "46", - "ETSI", "2.4G", "20M", "HT", "1T", "07", "40", - "MKK", "2.4G", "20M", "HT", "1T", "07", "40", - "FCC", "2.4G", "20M", "HT", "1T", "08", "46", - "ETSI", "2.4G", "20M", "HT", "1T", "08", "40", - "MKK", "2.4G", "20M", "HT", "1T", "08", "40", - "FCC", "2.4G", "20M", "HT", "1T", "09", "46", - "ETSI", "2.4G", "20M", "HT", "1T", "09", "40", - "MKK", "2.4G", "20M", "HT", "1T", "09", "40", - "FCC", "2.4G", "20M", "HT", "1T", "10", "46", - "ETSI", "2.4G", "20M", "HT", "1T", "10", "40", - "MKK", "2.4G", "20M", "HT", "1T", "10", "40", - "FCC", "2.4G", "20M", "HT", "1T", "11", "46", - "ETSI", "2.4G", "20M", "HT", "1T", "11", "40", - "MKK", "2.4G", "20M", "HT", "1T", "11", "40", - "FCC", "2.4G", "20M", "HT", "1T", "12", "63", - "ETSI", "2.4G", "20M", "HT", "1T", "12", "40", - "MKK", "2.4G", "20M", "HT", "1T", "12", "40", - "FCC", "2.4G", "20M", "HT", "1T", "13", "63", - "ETSI", "2.4G", "20M", "HT", "1T", "13", "40", - "MKK", "2.4G", "20M", "HT", "1T", "13", "40", - "FCC", "2.4G", "20M", "HT", "1T", "14", "63", - "ETSI", "2.4G", "20M", "HT", "1T", "14", "63", - "MKK", "2.4G", "20M", "HT", "1T", "14", "63", - "FCC", "2.4G", "20M", "HT", "2T", "01", "46", - "ETSI", "2.4G", "20M", "HT", "2T", "01", "40", - "MKK", "2.4G", "20M", "HT", "2T", "01", "40", - "FCC", "2.4G", "20M", "HT", "2T", "02", "46", - "ETSI", "2.4G", "20M", "HT", "2T", "02", "40", - "MKK", "2.4G", "20M", "HT", "2T", "02", "40", - "FCC", "2.4G", "20M", "HT", "2T", "03", "46", - "ETSI", "2.4G", "20M", "HT", "2T", "03", "40", - "MKK", "2.4G", "20M", "HT", "2T", "03", "40", - "FCC", "2.4G", "20M", "HT", "2T", "04", "46", - "ETSI", "2.4G", "20M", "HT", "2T", "04", "40", - "MKK", "2.4G", "20M", "HT", "2T", "04", "40", - "FCC", "2.4G", "20M", "HT", "2T", "05", "46", - "ETSI", "2.4G", "20M", "HT", "2T", "05", "40", - "MKK", "2.4G", "20M", "HT", "2T", "05", "40", - "FCC", "2.4G", "20M", "HT", "2T", "06", "46", - "ETSI", "2.4G", "20M", "HT", "2T", "06", "40", - "MKK", "2.4G", "20M", "HT", "2T", "06", "40", - "FCC", "2.4G", "20M", "HT", "2T", "07", "46", - "ETSI", "2.4G", "20M", "HT", "2T", "07", "40", - "MKK", "2.4G", "20M", "HT", "2T", "07", "40", - "FCC", "2.4G", "20M", "HT", "2T", "08", "46", - "ETSI", "2.4G", "20M", "HT", "2T", "08", "40", - "MKK", "2.4G", "20M", "HT", "2T", "08", "40", - "FCC", "2.4G", "20M", "HT", "2T", "09", "46", - "ETSI", "2.4G", "20M", "HT", "2T", "09", "40", - "MKK", "2.4G", "20M", "HT", "2T", "09", "40", - "FCC", "2.4G", "20M", "HT", "2T", "10", "46", - "ETSI", "2.4G", "20M", "HT", "2T", "10", "40", - "MKK", "2.4G", "20M", "HT", "2T", "10", "40", - "FCC", "2.4G", "20M", "HT", "2T", "11", "46", - "ETSI", "2.4G", "20M", "HT", "2T", "11", "40", - "MKK", "2.4G", "20M", "HT", "2T", "11", "40", - "FCC", "2.4G", "20M", "HT", "2T", "12", "63", - "ETSI", "2.4G", "20M", "HT", "2T", "12", "40", - "MKK", "2.4G", "20M", "HT", "2T", "12", "40", - "FCC", "2.4G", "20M", "HT", "2T", "13", "63", - "ETSI", "2.4G", "20M", "HT", "2T", "13", "40", - "MKK", "2.4G", "20M", "HT", "2T", "13", "40", - "FCC", "2.4G", "20M", "HT", "2T", "14", "63", - "ETSI", "2.4G", "20M", "HT", "2T", "14", "63", - "MKK", "2.4G", "20M", "HT", "2T", "14", "63", - "FCC", "2.4G", "20M", "HT", "3T", "01", "46", - "ETSI", "2.4G", "20M", "HT", "3T", "01", "40", - "MKK", "2.4G", "20M", "HT", "3T", "01", "40", - "FCC", "2.4G", "20M", "HT", "3T", "02", "46", - "ETSI", "2.4G", "20M", "HT", "3T", "02", "40", - "MKK", "2.4G", "20M", "HT", "3T", "02", "40", - "FCC", "2.4G", "20M", "HT", "3T", "03", "46", - "ETSI", "2.4G", "20M", "HT", "3T", "03", "40", - "MKK", "2.4G", "20M", "HT", "3T", "03", "40", - "FCC", "2.4G", "20M", "HT", "3T", "04", "46", - "ETSI", "2.4G", "20M", "HT", "3T", "04", "40", - "MKK", "2.4G", "20M", "HT", "3T", "04", "40", - "FCC", "2.4G", "20M", "HT", "3T", "05", "46", - "ETSI", "2.4G", "20M", "HT", "3T", "05", "40", - "MKK", "2.4G", "20M", "HT", "3T", "05", "40", - "FCC", "2.4G", "20M", "HT", "3T", "06", "46", - "ETSI", "2.4G", "20M", "HT", "3T", "06", "40", - "MKK", "2.4G", "20M", "HT", "3T", "06", "40", - "FCC", "2.4G", "20M", "HT", "3T", "07", "46", - "ETSI", "2.4G", "20M", "HT", "3T", "07", "40", - "MKK", "2.4G", "20M", "HT", "3T", "07", "40", - "FCC", "2.4G", "20M", "HT", "3T", "08", "46", - "ETSI", "2.4G", "20M", "HT", "3T", "08", "40", - "MKK", "2.4G", "20M", "HT", "3T", "08", "40", - "FCC", "2.4G", "20M", "HT", "3T", "09", "46", - "ETSI", "2.4G", "20M", "HT", "3T", "09", "40", - "MKK", "2.4G", "20M", "HT", "3T", "09", "40", - "FCC", "2.4G", "20M", "HT", "3T", "10", "46", - "ETSI", "2.4G", "20M", "HT", "3T", "10", "40", - "MKK", "2.4G", "20M", "HT", "3T", "10", "40", - "FCC", "2.4G", "20M", "HT", "3T", "11", "46", - "ETSI", "2.4G", "20M", "HT", "3T", "11", "40", - "MKK", "2.4G", "20M", "HT", "3T", "11", "40", - "FCC", "2.4G", "20M", "HT", "3T", "12", "63", - "ETSI", "2.4G", "20M", "HT", "3T", "12", "40", - "MKK", "2.4G", "20M", "HT", "3T", "12", "40", - "FCC", "2.4G", "20M", "HT", "3T", "13", "63", - "ETSI", "2.4G", "20M", "HT", "3T", "13", "40", - "MKK", "2.4G", "20M", "HT", "3T", "13", "40", - "FCC", "2.4G", "20M", "HT", "3T", "14", "63", - "ETSI", "2.4G", "20M", "HT", "3T", "14", "63", - "MKK", "2.4G", "20M", "HT", "3T", "14", "63", - "FCC", "2.4G", "20M", "HT", "4T", "01", "46", - "ETSI", "2.4G", "20M", "HT", "4T", "01", "40", - "MKK", "2.4G", "20M", "HT", "4T", "01", "40", - "FCC", "2.4G", "20M", "HT", "4T", "02", "46", - "ETSI", "2.4G", "20M", "HT", "4T", "02", "40", - "MKK", "2.4G", "20M", "HT", "4T", "02", "40", - "FCC", "2.4G", "20M", "HT", "4T", "03", "46", - "ETSI", "2.4G", "20M", "HT", "4T", "03", "40", - "MKK", "2.4G", "20M", "HT", "4T", "03", "40", - "FCC", "2.4G", "20M", "HT", "4T", "04", "46", - "ETSI", "2.4G", "20M", "HT", "4T", "04", "40", - "MKK", "2.4G", "20M", "HT", "4T", "04", "40", - "FCC", "2.4G", "20M", "HT", "4T", "05", "46", - "ETSI", "2.4G", "20M", "HT", "4T", "05", "40", - "MKK", "2.4G", "20M", "HT", "4T", "05", "40", - "FCC", "2.4G", "20M", "HT", "4T", "06", "46", - "ETSI", "2.4G", "20M", "HT", "4T", "06", "40", - "MKK", "2.4G", "20M", "HT", "4T", "06", "40", - "FCC", "2.4G", "20M", "HT", "4T", "07", "46", - "ETSI", "2.4G", "20M", "HT", "4T", "07", "40", - "MKK", "2.4G", "20M", "HT", "4T", "07", "40", - "FCC", "2.4G", "20M", "HT", "4T", "08", "46", - "ETSI", "2.4G", "20M", "HT", "4T", "08", "40", - "MKK", "2.4G", "20M", "HT", "4T", "08", "40", - "FCC", "2.4G", "20M", "HT", "4T", "09", "46", - "ETSI", "2.4G", "20M", "HT", "4T", "09", "40", - "MKK", "2.4G", "20M", "HT", "4T", "09", "40", - "FCC", "2.4G", "20M", "HT", "4T", "10", "46", - "ETSI", "2.4G", "20M", "HT", "4T", "10", "40", - "MKK", "2.4G", "20M", "HT", "4T", "10", "40", - "FCC", "2.4G", "20M", "HT", "4T", "11", "46", - "ETSI", "2.4G", "20M", "HT", "4T", "11", "40", - "MKK", "2.4G", "20M", "HT", "4T", "11", "40", - "FCC", "2.4G", "20M", "HT", "4T", "12", "63", - "ETSI", "2.4G", "20M", "HT", "4T", "12", "40", - "MKK", "2.4G", "20M", "HT", "4T", "12", "40", - "FCC", "2.4G", "20M", "HT", "4T", "13", "63", - "ETSI", "2.4G", "20M", "HT", "4T", "13", "40", - "MKK", "2.4G", "20M", "HT", "4T", "13", "40", - "FCC", "2.4G", "20M", "HT", "4T", "14", "63", - "ETSI", "2.4G", "20M", "HT", "4T", "14", "63", - "MKK", "2.4G", "20M", "HT", "4T", "14", "63", - "FCC", "2.4G", "40M", "HT", "1T", "01", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "01", "63", - "MKK", "2.4G", "40M", "HT", "1T", "01", "63", - "FCC", "2.4G", "40M", "HT", "1T", "02", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "02", "63", - "MKK", "2.4G", "40M", "HT", "1T", "02", "63", - "FCC", "2.4G", "40M", "HT", "1T", "03", "46", - "ETSI", "2.4G", "40M", "HT", "1T", "03", "40", - "MKK", "2.4G", "40M", "HT", "1T", "03", "40", - "FCC", "2.4G", "40M", "HT", "1T", "04", "46", - "ETSI", "2.4G", "40M", "HT", "1T", "04", "40", - "MKK", "2.4G", "40M", "HT", "1T", "04", "40", - "FCC", "2.4G", "40M", "HT", "1T", "05", "46", - "ETSI", "2.4G", "40M", "HT", "1T", "05", "40", - "MKK", "2.4G", "40M", "HT", "1T", "05", "40", - "FCC", "2.4G", "40M", "HT", "1T", "06", "46", - "ETSI", "2.4G", "40M", "HT", "1T", "06", "40", - "MKK", "2.4G", "40M", "HT", "1T", "06", "40", - "FCC", "2.4G", "40M", "HT", "1T", "07", "46", - "ETSI", "2.4G", "40M", "HT", "1T", "07", "40", - "MKK", "2.4G", "40M", "HT", "1T", "07", "40", - "FCC", "2.4G", "40M", "HT", "1T", "08", "46", - "ETSI", "2.4G", "40M", "HT", "1T", "08", "40", - "MKK", "2.4G", "40M", "HT", "1T", "08", "40", - "FCC", "2.4G", "40M", "HT", "1T", "09", "46", - "ETSI", "2.4G", "40M", "HT", "1T", "09", "40", - "MKK", "2.4G", "40M", "HT", "1T", "09", "40", - "FCC", "2.4G", "40M", "HT", "1T", "10", "46", - "ETSI", "2.4G", "40M", "HT", "1T", "10", "40", - "MKK", "2.4G", "40M", "HT", "1T", "10", "40", - "FCC", "2.4G", "40M", "HT", "1T", "11", "46", - "ETSI", "2.4G", "40M", "HT", "1T", "11", "40", - "MKK", "2.4G", "40M", "HT", "1T", "11", "40", - "FCC", "2.4G", "40M", "HT", "1T", "12", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "12", "40", - "MKK", "2.4G", "40M", "HT", "1T", "12", "40", - "FCC", "2.4G", "40M", "HT", "1T", "13", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "13", "40", - "MKK", "2.4G", "40M", "HT", "1T", "13", "40", - "FCC", "2.4G", "40M", "HT", "1T", "14", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "14", "63", - "MKK", "2.4G", "40M", "HT", "1T", "14", "63", - "FCC", "2.4G", "40M", "HT", "2T", "01", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "01", "63", - "MKK", "2.4G", "40M", "HT", "2T", "01", "63", - "FCC", "2.4G", "40M", "HT", "2T", "02", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "02", "63", - "MKK", "2.4G", "40M", "HT", "2T", "02", "63", - "FCC", "2.4G", "40M", "HT", "2T", "03", "46", - "ETSI", "2.4G", "40M", "HT", "2T", "03", "40", - "MKK", "2.4G", "40M", "HT", "2T", "03", "40", - "FCC", "2.4G", "40M", "HT", "2T", "04", "46", - "ETSI", "2.4G", "40M", "HT", "2T", "04", "40", - "MKK", "2.4G", "40M", "HT", "2T", "04", "40", - "FCC", "2.4G", "40M", "HT", "2T", "05", "46", - "ETSI", "2.4G", "40M", "HT", "2T", "05", "40", - "MKK", "2.4G", "40M", "HT", "2T", "05", "40", - "FCC", "2.4G", "40M", "HT", "2T", "06", "46", - "ETSI", "2.4G", "40M", "HT", "2T", "06", "40", - "MKK", "2.4G", "40M", "HT", "2T", "06", "40", - "FCC", "2.4G", "40M", "HT", "2T", "07", "46", - "ETSI", "2.4G", "40M", "HT", "2T", "07", "40", - "MKK", "2.4G", "40M", "HT", "2T", "07", "40", - "FCC", "2.4G", "40M", "HT", "2T", "08", "46", - "ETSI", "2.4G", "40M", "HT", "2T", "08", "40", - "MKK", "2.4G", "40M", "HT", "2T", "08", "40", - "FCC", "2.4G", "40M", "HT", "2T", "09", "46", - "ETSI", "2.4G", "40M", "HT", "2T", "09", "40", - "MKK", "2.4G", "40M", "HT", "2T", "09", "40", - "FCC", "2.4G", "40M", "HT", "2T", "10", "46", - "ETSI", "2.4G", "40M", "HT", "2T", "10", "40", - "MKK", "2.4G", "40M", "HT", "2T", "10", "40", - "FCC", "2.4G", "40M", "HT", "2T", "11", "46", - "ETSI", "2.4G", "40M", "HT", "2T", "11", "40", - "MKK", "2.4G", "40M", "HT", "2T", "11", "40", - "FCC", "2.4G", "40M", "HT", "2T", "12", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "12", "40", - "MKK", "2.4G", "40M", "HT", "2T", "12", "40", - "FCC", "2.4G", "40M", "HT", "2T", "13", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "13", "40", - "MKK", "2.4G", "40M", "HT", "2T", "13", "40", - "FCC", "2.4G", "40M", "HT", "2T", "14", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "14", "63", - "MKK", "2.4G", "40M", "HT", "2T", "14", "63", - "FCC", "2.4G", "40M", "HT", "3T", "01", "63", - "ETSI", "2.4G", "40M", "HT", "3T", "01", "63", - "MKK", "2.4G", "40M", "HT", "3T", "01", "63", - "FCC", "2.4G", "40M", "HT", "3T", "02", "63", - "ETSI", "2.4G", "40M", "HT", "3T", "02", "63", - "MKK", "2.4G", "40M", "HT", "3T", "02", "63", - "FCC", "2.4G", "40M", "HT", "3T", "03", "46", - "ETSI", "2.4G", "40M", "HT", "3T", "03", "40", - "MKK", "2.4G", "40M", "HT", "3T", "03", "40", - "FCC", "2.4G", "40M", "HT", "3T", "04", "46", - "ETSI", "2.4G", "40M", "HT", "3T", "04", "40", - "MKK", "2.4G", "40M", "HT", "3T", "04", "40", - "FCC", "2.4G", "40M", "HT", "3T", "05", "46", - "ETSI", "2.4G", "40M", "HT", "3T", "05", "40", - "MKK", "2.4G", "40M", "HT", "3T", "05", "40", - "FCC", "2.4G", "40M", "HT", "3T", "06", "46", - "ETSI", "2.4G", "40M", "HT", "3T", "06", "40", - "MKK", "2.4G", "40M", "HT", "3T", "06", "40", - "FCC", "2.4G", "40M", "HT", "3T", "07", "46", - "ETSI", "2.4G", "40M", "HT", "3T", "07", "40", - "MKK", "2.4G", "40M", "HT", "3T", "07", "40", - "FCC", "2.4G", "40M", "HT", "3T", "08", "46", - "ETSI", "2.4G", "40M", "HT", "3T", "08", "40", - "MKK", "2.4G", "40M", "HT", "3T", "08", "40", - "FCC", "2.4G", "40M", "HT", "3T", "09", "46", - "ETSI", "2.4G", "40M", "HT", "3T", "09", "40", - "MKK", "2.4G", "40M", "HT", "3T", "09", "40", - "FCC", "2.4G", "40M", "HT", "3T", "10", "46", - "ETSI", "2.4G", "40M", "HT", "3T", "10", "40", - "MKK", "2.4G", "40M", "HT", "3T", "10", "40", - "FCC", "2.4G", "40M", "HT", "3T", "11", "46", - "ETSI", "2.4G", "40M", "HT", "3T", "11", "40", - "MKK", "2.4G", "40M", "HT", "3T", "11", "40", - "FCC", "2.4G", "40M", "HT", "3T", "12", "63", - "ETSI", "2.4G", "40M", "HT", "3T", "12", "40", - "MKK", "2.4G", "40M", "HT", "3T", "12", "40", - "FCC", "2.4G", "40M", "HT", "3T", "13", "63", - "ETSI", "2.4G", "40M", "HT", "3T", "13", "40", - "MKK", "2.4G", "40M", "HT", "3T", "13", "40", - "FCC", "2.4G", "40M", "HT", "3T", "14", "63", - "ETSI", "2.4G", "40M", "HT", "3T", "14", "63", - "MKK", "2.4G", "40M", "HT", "3T", "14", "63", - "FCC", "2.4G", "40M", "HT", "4T", "01", "63", - "ETSI", "2.4G", "40M", "HT", "4T", "01", "63", - "MKK", "2.4G", "40M", "HT", "4T", "01", "63", - "FCC", "2.4G", "40M", "HT", "4T", "02", "63", - "ETSI", "2.4G", "40M", "HT", "4T", "02", "63", - "MKK", "2.4G", "40M", "HT", "4T", "02", "63", - "FCC", "2.4G", "40M", "HT", "4T", "03", "46", - "ETSI", "2.4G", "40M", "HT", "4T", "03", "40", - "MKK", "2.4G", "40M", "HT", "4T", "03", "40", - "FCC", "2.4G", "40M", "HT", "4T", "04", "46", - "ETSI", "2.4G", "40M", "HT", "4T", "04", "40", - "MKK", "2.4G", "40M", "HT", "4T", "04", "40", - "FCC", "2.4G", "40M", "HT", "4T", "05", "46", - "ETSI", "2.4G", "40M", "HT", "4T", "05", "40", - "MKK", "2.4G", "40M", "HT", "4T", "05", "40", - "FCC", "2.4G", "40M", "HT", "4T", "06", "46", - "ETSI", "2.4G", "40M", "HT", "4T", "06", "40", - "MKK", "2.4G", "40M", "HT", "4T", "06", "40", - "FCC", "2.4G", "40M", "HT", "4T", "07", "46", - "ETSI", "2.4G", "40M", "HT", "4T", "07", "40", - "MKK", "2.4G", "40M", "HT", "4T", "07", "40", - "FCC", "2.4G", "40M", "HT", "4T", "08", "46", - "ETSI", "2.4G", "40M", "HT", "4T", "08", "40", - "MKK", "2.4G", "40M", "HT", "4T", "08", "40", - "FCC", "2.4G", "40M", "HT", "4T", "09", "46", - "ETSI", "2.4G", "40M", "HT", "4T", "09", "40", - "MKK", "2.4G", "40M", "HT", "4T", "09", "40", - "FCC", "2.4G", "40M", "HT", "4T", "10", "46", - "ETSI", "2.4G", "40M", "HT", "4T", "10", "40", - "MKK", "2.4G", "40M", "HT", "4T", "10", "40", - "FCC", "2.4G", "40M", "HT", "4T", "11", "46", - "ETSI", "2.4G", "40M", "HT", "4T", "11", "40", - "MKK", "2.4G", "40M", "HT", "4T", "11", "40", - "FCC", "2.4G", "40M", "HT", "4T", "12", "63", - "ETSI", "2.4G", "40M", "HT", "4T", "12", "40", - "MKK", "2.4G", "40M", "HT", "4T", "12", "40", - "FCC", "2.4G", "40M", "HT", "4T", "13", "63", - "ETSI", "2.4G", "40M", "HT", "4T", "13", "40", - "MKK", "2.4G", "40M", "HT", "4T", "13", "40", - "FCC", "2.4G", "40M", "HT", "4T", "14", "63", - "ETSI", "2.4G", "40M", "HT", "4T", "14", "63", - "MKK", "2.4G", "40M", "HT", "4T", "14", "63", - "FCC", "5G", "20M", "OFDM", "1T", "36", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "36", "40", - "MKK", "5G", "20M", "OFDM", "1T", "36", "40", - "FCC", "5G", "20M", "OFDM", "1T", "40", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "40", "40", - "MKK", "5G", "20M", "OFDM", "1T", "40", "40", - "FCC", "5G", "20M", "OFDM", "1T", "44", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "44", "40", - "MKK", "5G", "20M", "OFDM", "1T", "44", "40", - "FCC", "5G", "20M", "OFDM", "1T", "48", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "48", "40", - "MKK", "5G", "20M", "OFDM", "1T", "48", "40", - "FCC", "5G", "20M", "OFDM", "1T", "52", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "52", "40", - "MKK", "5G", "20M", "OFDM", "1T", "52", "40", - "FCC", "5G", "20M", "OFDM", "1T", "56", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "56", "40", - "MKK", "5G", "20M", "OFDM", "1T", "56", "40", - "FCC", "5G", "20M", "OFDM", "1T", "60", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "60", "40", - "MKK", "5G", "20M", "OFDM", "1T", "60", "40", - "FCC", "5G", "20M", "OFDM", "1T", "64", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "64", "40", - "MKK", "5G", "20M", "OFDM", "1T", "64", "40", - "FCC", "5G", "20M", "OFDM", "1T", "100", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "100", "40", - "MKK", "5G", "20M", "OFDM", "1T", "100", "40", - "FCC", "5G", "20M", "OFDM", "1T", "104", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "104", "40", - "MKK", "5G", "20M", "OFDM", "1T", "104", "40", - "FCC", "5G", "20M", "OFDM", "1T", "108", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "108", "40", - "MKK", "5G", "20M", "OFDM", "1T", "108", "40", - "FCC", "5G", "20M", "OFDM", "1T", "112", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "112", "40", - "MKK", "5G", "20M", "OFDM", "1T", "112", "40", - "FCC", "5G", "20M", "OFDM", "1T", "116", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "116", "40", - "MKK", "5G", "20M", "OFDM", "1T", "116", "40", - "FCC", "5G", "20M", "OFDM", "1T", "120", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "120", "40", - "MKK", "5G", "20M", "OFDM", "1T", "120", "40", - "FCC", "5G", "20M", "OFDM", "1T", "124", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "124", "40", - "MKK", "5G", "20M", "OFDM", "1T", "124", "40", - "FCC", "5G", "20M", "OFDM", "1T", "128", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "128", "40", - "MKK", "5G", "20M", "OFDM", "1T", "128", "40", - "FCC", "5G", "20M", "OFDM", "1T", "132", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "132", "40", - "MKK", "5G", "20M", "OFDM", "1T", "132", "40", - "FCC", "5G", "20M", "OFDM", "1T", "136", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "136", "40", - "MKK", "5G", "20M", "OFDM", "1T", "136", "40", - "FCC", "5G", "20M", "OFDM", "1T", "140", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "140", "40", - "MKK", "5G", "20M", "OFDM", "1T", "140", "40", - "FCC", "5G", "20M", "OFDM", "1T", "149", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "149", "40", - "MKK", "5G", "20M", "OFDM", "1T", "149", "63", - "FCC", "5G", "20M", "OFDM", "1T", "153", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "153", "40", - "MKK", "5G", "20M", "OFDM", "1T", "153", "63", - "FCC", "5G", "20M", "OFDM", "1T", "157", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "157", "40", - "MKK", "5G", "20M", "OFDM", "1T", "157", "63", - "FCC", "5G", "20M", "OFDM", "1T", "161", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "161", "40", - "MKK", "5G", "20M", "OFDM", "1T", "161", "63", - "FCC", "5G", "20M", "OFDM", "1T", "165", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "165", "40", - "MKK", "5G", "20M", "OFDM", "1T", "165", "63", - "FCC", "5G", "20M", "HT", "1T", "36", "46", - "ETSI", "5G", "20M", "HT", "1T", "36", "40", - "MKK", "5G", "20M", "HT", "1T", "36", "40", - "FCC", "5G", "20M", "HT", "1T", "40", "46", - "ETSI", "5G", "20M", "HT", "1T", "40", "40", - "MKK", "5G", "20M", "HT", "1T", "40", "40", - "FCC", "5G", "20M", "HT", "1T", "44", "46", - "ETSI", "5G", "20M", "HT", "1T", "44", "40", - "MKK", "5G", "20M", "HT", "1T", "44", "40", - "FCC", "5G", "20M", "HT", "1T", "48", "46", - "ETSI", "5G", "20M", "HT", "1T", "48", "40", - "MKK", "5G", "20M", "HT", "1T", "48", "40", - "FCC", "5G", "20M", "HT", "1T", "52", "46", - "ETSI", "5G", "20M", "HT", "1T", "52", "40", - "MKK", "5G", "20M", "HT", "1T", "52", "40", - "FCC", "5G", "20M", "HT", "1T", "56", "46", - "ETSI", "5G", "20M", "HT", "1T", "56", "40", - "MKK", "5G", "20M", "HT", "1T", "56", "40", - "FCC", "5G", "20M", "HT", "1T", "60", "46", - "ETSI", "5G", "20M", "HT", "1T", "60", "40", - "MKK", "5G", "20M", "HT", "1T", "60", "40", - "FCC", "5G", "20M", "HT", "1T", "64", "46", - "ETSI", "5G", "20M", "HT", "1T", "64", "40", - "MKK", "5G", "20M", "HT", "1T", "64", "40", - "FCC", "5G", "20M", "HT", "1T", "100", "46", - "ETSI", "5G", "20M", "HT", "1T", "100", "40", - "MKK", "5G", "20M", "HT", "1T", "100", "40", - "FCC", "5G", "20M", "HT", "1T", "104", "46", - "ETSI", "5G", "20M", "HT", "1T", "104", "40", - "MKK", "5G", "20M", "HT", "1T", "104", "40", - "FCC", "5G", "20M", "HT", "1T", "108", "46", - "ETSI", "5G", "20M", "HT", "1T", "108", "40", - "MKK", "5G", "20M", "HT", "1T", "108", "40", - "FCC", "5G", "20M", "HT", "1T", "112", "46", - "ETSI", "5G", "20M", "HT", "1T", "112", "40", - "MKK", "5G", "20M", "HT", "1T", "112", "40", - "FCC", "5G", "20M", "HT", "1T", "116", "46", - "ETSI", "5G", "20M", "HT", "1T", "116", "40", - "MKK", "5G", "20M", "HT", "1T", "116", "40", - "FCC", "5G", "20M", "HT", "1T", "120", "46", - "ETSI", "5G", "20M", "HT", "1T", "120", "40", - "MKK", "5G", "20M", "HT", "1T", "120", "40", - "FCC", "5G", "20M", "HT", "1T", "124", "46", - "ETSI", "5G", "20M", "HT", "1T", "124", "40", - "MKK", "5G", "20M", "HT", "1T", "124", "40", - "FCC", "5G", "20M", "HT", "1T", "128", "46", - "ETSI", "5G", "20M", "HT", "1T", "128", "40", - "MKK", "5G", "20M", "HT", "1T", "128", "40", - "FCC", "5G", "20M", "HT", "1T", "132", "46", - "ETSI", "5G", "20M", "HT", "1T", "132", "40", - "MKK", "5G", "20M", "HT", "1T", "132", "40", - "FCC", "5G", "20M", "HT", "1T", "136", "46", - "ETSI", "5G", "20M", "HT", "1T", "136", "40", - "MKK", "5G", "20M", "HT", "1T", "136", "40", - "FCC", "5G", "20M", "HT", "1T", "140", "46", - "ETSI", "5G", "20M", "HT", "1T", "140", "40", - "MKK", "5G", "20M", "HT", "1T", "140", "40", - "FCC", "5G", "20M", "HT", "1T", "149", "46", - "ETSI", "5G", "20M", "HT", "1T", "149", "40", - "MKK", "5G", "20M", "HT", "1T", "149", "63", - "FCC", "5G", "20M", "HT", "1T", "153", "46", - "ETSI", "5G", "20M", "HT", "1T", "153", "40", - "MKK", "5G", "20M", "HT", "1T", "153", "63", - "FCC", "5G", "20M", "HT", "1T", "157", "46", - "ETSI", "5G", "20M", "HT", "1T", "157", "40", - "MKK", "5G", "20M", "HT", "1T", "157", "63", - "FCC", "5G", "20M", "HT", "1T", "161", "46", - "ETSI", "5G", "20M", "HT", "1T", "161", "40", - "MKK", "5G", "20M", "HT", "1T", "161", "63", - "FCC", "5G", "20M", "HT", "1T", "165", "46", - "ETSI", "5G", "20M", "HT", "1T", "165", "40", - "MKK", "5G", "20M", "HT", "1T", "165", "63", - "FCC", "5G", "20M", "HT", "2T", "36", "46", - "ETSI", "5G", "20M", "HT", "2T", "36", "40", - "MKK", "5G", "20M", "HT", "2T", "36", "40", - "FCC", "5G", "20M", "HT", "2T", "40", "46", - "ETSI", "5G", "20M", "HT", "2T", "40", "40", - "MKK", "5G", "20M", "HT", "2T", "40", "40", - "FCC", "5G", "20M", "HT", "2T", "44", "46", - "ETSI", "5G", "20M", "HT", "2T", "44", "40", - "MKK", "5G", "20M", "HT", "2T", "44", "40", - "FCC", "5G", "20M", "HT", "2T", "48", "46", - "ETSI", "5G", "20M", "HT", "2T", "48", "40", - "MKK", "5G", "20M", "HT", "2T", "48", "40", - "FCC", "5G", "20M", "HT", "2T", "52", "46", - "ETSI", "5G", "20M", "HT", "2T", "52", "40", - "MKK", "5G", "20M", "HT", "2T", "52", "40", - "FCC", "5G", "20M", "HT", "2T", "56", "46", - "ETSI", "5G", "20M", "HT", "2T", "56", "40", - "MKK", "5G", "20M", "HT", "2T", "56", "40", - "FCC", "5G", "20M", "HT", "2T", "60", "46", - "ETSI", "5G", "20M", "HT", "2T", "60", "40", - "MKK", "5G", "20M", "HT", "2T", "60", "40", - "FCC", "5G", "20M", "HT", "2T", "64", "46", - "ETSI", "5G", "20M", "HT", "2T", "64", "40", - "MKK", "5G", "20M", "HT", "2T", "64", "40", - "FCC", "5G", "20M", "HT", "2T", "100", "46", - "ETSI", "5G", "20M", "HT", "2T", "100", "40", - "MKK", "5G", "20M", "HT", "2T", "100", "40", - "FCC", "5G", "20M", "HT", "2T", "104", "46", - "ETSI", "5G", "20M", "HT", "2T", "104", "40", - "MKK", "5G", "20M", "HT", "2T", "104", "40", - "FCC", "5G", "20M", "HT", "2T", "108", "46", - "ETSI", "5G", "20M", "HT", "2T", "108", "40", - "MKK", "5G", "20M", "HT", "2T", "108", "40", - "FCC", "5G", "20M", "HT", "2T", "112", "46", - "ETSI", "5G", "20M", "HT", "2T", "112", "40", - "MKK", "5G", "20M", "HT", "2T", "112", "40", - "FCC", "5G", "20M", "HT", "2T", "116", "46", - "ETSI", "5G", "20M", "HT", "2T", "116", "40", - "MKK", "5G", "20M", "HT", "2T", "116", "40", - "FCC", "5G", "20M", "HT", "2T", "120", "46", - "ETSI", "5G", "20M", "HT", "2T", "120", "40", - "MKK", "5G", "20M", "HT", "2T", "120", "40", - "FCC", "5G", "20M", "HT", "2T", "124", "46", - "ETSI", "5G", "20M", "HT", "2T", "124", "40", - "MKK", "5G", "20M", "HT", "2T", "124", "40", - "FCC", "5G", "20M", "HT", "2T", "128", "46", - "ETSI", "5G", "20M", "HT", "2T", "128", "40", - "MKK", "5G", "20M", "HT", "2T", "128", "40", - "FCC", "5G", "20M", "HT", "2T", "132", "46", - "ETSI", "5G", "20M", "HT", "2T", "132", "40", - "MKK", "5G", "20M", "HT", "2T", "132", "40", - "FCC", "5G", "20M", "HT", "2T", "136", "46", - "ETSI", "5G", "20M", "HT", "2T", "136", "40", - "MKK", "5G", "20M", "HT", "2T", "136", "40", - "FCC", "5G", "20M", "HT", "2T", "140", "46", - "ETSI", "5G", "20M", "HT", "2T", "140", "40", - "MKK", "5G", "20M", "HT", "2T", "140", "40", - "FCC", "5G", "20M", "HT", "2T", "149", "46", - "ETSI", "5G", "20M", "HT", "2T", "149", "40", - "MKK", "5G", "20M", "HT", "2T", "149", "63", - "FCC", "5G", "20M", "HT", "2T", "153", "46", - "ETSI", "5G", "20M", "HT", "2T", "153", "40", - "MKK", "5G", "20M", "HT", "2T", "153", "63", - "FCC", "5G", "20M", "HT", "2T", "157", "46", - "ETSI", "5G", "20M", "HT", "2T", "157", "40", - "MKK", "5G", "20M", "HT", "2T", "157", "63", - "FCC", "5G", "20M", "HT", "2T", "161", "46", - "ETSI", "5G", "20M", "HT", "2T", "161", "40", - "MKK", "5G", "20M", "HT", "2T", "161", "63", - "FCC", "5G", "20M", "HT", "2T", "165", "46", - "ETSI", "5G", "20M", "HT", "2T", "165", "40", - "MKK", "5G", "20M", "HT", "2T", "165", "63", - "FCC", "5G", "20M", "HT", "3T", "36", "46", - "ETSI", "5G", "20M", "HT", "3T", "36", "40", - "MKK", "5G", "20M", "HT", "3T", "36", "40", - "FCC", "5G", "20M", "HT", "3T", "40", "46", - "ETSI", "5G", "20M", "HT", "3T", "40", "40", - "MKK", "5G", "20M", "HT", "3T", "40", "40", - "FCC", "5G", "20M", "HT", "3T", "44", "46", - "ETSI", "5G", "20M", "HT", "3T", "44", "40", - "MKK", "5G", "20M", "HT", "3T", "44", "40", - "FCC", "5G", "20M", "HT", "3T", "48", "46", - "ETSI", "5G", "20M", "HT", "3T", "48", "40", - "MKK", "5G", "20M", "HT", "3T", "48", "40", - "FCC", "5G", "20M", "HT", "3T", "52", "46", - "ETSI", "5G", "20M", "HT", "3T", "52", "40", - "MKK", "5G", "20M", "HT", "3T", "52", "40", - "FCC", "5G", "20M", "HT", "3T", "56", "46", - "ETSI", "5G", "20M", "HT", "3T", "56", "40", - "MKK", "5G", "20M", "HT", "3T", "56", "40", - "FCC", "5G", "20M", "HT", "3T", "60", "46", - "ETSI", "5G", "20M", "HT", "3T", "60", "40", - "MKK", "5G", "20M", "HT", "3T", "60", "40", - "FCC", "5G", "20M", "HT", "3T", "64", "46", - "ETSI", "5G", "20M", "HT", "3T", "64", "40", - "MKK", "5G", "20M", "HT", "3T", "64", "40", - "FCC", "5G", "20M", "HT", "3T", "100", "46", - "ETSI", "5G", "20M", "HT", "3T", "100", "40", - "MKK", "5G", "20M", "HT", "3T", "100", "40", - "FCC", "5G", "20M", "HT", "3T", "104", "46", - "ETSI", "5G", "20M", "HT", "3T", "104", "40", - "MKK", "5G", "20M", "HT", "3T", "104", "40", - "FCC", "5G", "20M", "HT", "3T", "108", "46", - "ETSI", "5G", "20M", "HT", "3T", "108", "40", - "MKK", "5G", "20M", "HT", "3T", "108", "40", - "FCC", "5G", "20M", "HT", "3T", "112", "46", - "ETSI", "5G", "20M", "HT", "3T", "112", "40", - "MKK", "5G", "20M", "HT", "3T", "112", "40", - "FCC", "5G", "20M", "HT", "3T", "116", "46", - "ETSI", "5G", "20M", "HT", "3T", "116", "40", - "MKK", "5G", "20M", "HT", "3T", "116", "40", - "FCC", "5G", "20M", "HT", "3T", "120", "46", - "ETSI", "5G", "20M", "HT", "3T", "120", "40", - "MKK", "5G", "20M", "HT", "3T", "120", "40", - "FCC", "5G", "20M", "HT", "3T", "124", "46", - "ETSI", "5G", "20M", "HT", "3T", "124", "40", - "MKK", "5G", "20M", "HT", "3T", "124", "40", - "FCC", "5G", "20M", "HT", "3T", "128", "46", - "ETSI", "5G", "20M", "HT", "3T", "128", "40", - "MKK", "5G", "20M", "HT", "3T", "128", "40", - "FCC", "5G", "20M", "HT", "3T", "132", "46", - "ETSI", "5G", "20M", "HT", "3T", "132", "40", - "MKK", "5G", "20M", "HT", "3T", "132", "40", - "FCC", "5G", "20M", "HT", "3T", "136", "46", - "ETSI", "5G", "20M", "HT", "3T", "136", "40", - "MKK", "5G", "20M", "HT", "3T", "136", "40", - "FCC", "5G", "20M", "HT", "3T", "140", "46", - "ETSI", "5G", "20M", "HT", "3T", "140", "40", - "MKK", "5G", "20M", "HT", "3T", "140", "40", - "FCC", "5G", "20M", "HT", "3T", "149", "46", - "ETSI", "5G", "20M", "HT", "3T", "149", "40", - "MKK", "5G", "20M", "HT", "3T", "149", "63", - "FCC", "5G", "20M", "HT", "3T", "153", "46", - "ETSI", "5G", "20M", "HT", "3T", "153", "40", - "MKK", "5G", "20M", "HT", "3T", "153", "63", - "FCC", "5G", "20M", "HT", "3T", "157", "46", - "ETSI", "5G", "20M", "HT", "3T", "157", "40", - "MKK", "5G", "20M", "HT", "3T", "157", "63", - "FCC", "5G", "20M", "HT", "3T", "161", "46", - "ETSI", "5G", "20M", "HT", "3T", "161", "40", - "MKK", "5G", "20M", "HT", "3T", "161", "63", - "FCC", "5G", "20M", "HT", "3T", "165", "46", - "ETSI", "5G", "20M", "HT", "3T", "165", "40", - "MKK", "5G", "20M", "HT", "3T", "165", "63", - "FCC", "5G", "20M", "HT", "4T", "36", "46", - "ETSI", "5G", "20M", "HT", "4T", "36", "40", - "MKK", "5G", "20M", "HT", "4T", "36", "40", - "FCC", "5G", "20M", "HT", "4T", "40", "46", - "ETSI", "5G", "20M", "HT", "4T", "40", "40", - "MKK", "5G", "20M", "HT", "4T", "40", "40", - "FCC", "5G", "20M", "HT", "4T", "44", "46", - "ETSI", "5G", "20M", "HT", "4T", "44", "40", - "MKK", "5G", "20M", "HT", "4T", "44", "40", - "FCC", "5G", "20M", "HT", "4T", "48", "46", - "ETSI", "5G", "20M", "HT", "4T", "48", "40", - "MKK", "5G", "20M", "HT", "4T", "48", "40", - "FCC", "5G", "20M", "HT", "4T", "52", "46", - "ETSI", "5G", "20M", "HT", "4T", "52", "40", - "MKK", "5G", "20M", "HT", "4T", "52", "40", - "FCC", "5G", "20M", "HT", "4T", "56", "46", - "ETSI", "5G", "20M", "HT", "4T", "56", "40", - "MKK", "5G", "20M", "HT", "4T", "56", "40", - "FCC", "5G", "20M", "HT", "4T", "60", "46", - "ETSI", "5G", "20M", "HT", "4T", "60", "40", - "MKK", "5G", "20M", "HT", "4T", "60", "40", - "FCC", "5G", "20M", "HT", "4T", "64", "46", - "ETSI", "5G", "20M", "HT", "4T", "64", "40", - "MKK", "5G", "20M", "HT", "4T", "64", "40", - "FCC", "5G", "20M", "HT", "4T", "100", "46", - "ETSI", "5G", "20M", "HT", "4T", "100", "40", - "MKK", "5G", "20M", "HT", "4T", "100", "40", - "FCC", "5G", "20M", "HT", "4T", "104", "46", - "ETSI", "5G", "20M", "HT", "4T", "104", "40", - "MKK", "5G", "20M", "HT", "4T", "104", "40", - "FCC", "5G", "20M", "HT", "4T", "108", "46", - "ETSI", "5G", "20M", "HT", "4T", "108", "40", - "MKK", "5G", "20M", "HT", "4T", "108", "40", - "FCC", "5G", "20M", "HT", "4T", "112", "46", - "ETSI", "5G", "20M", "HT", "4T", "112", "40", - "MKK", "5G", "20M", "HT", "4T", "112", "40", - "FCC", "5G", "20M", "HT", "4T", "116", "46", - "ETSI", "5G", "20M", "HT", "4T", "116", "40", - "MKK", "5G", "20M", "HT", "4T", "116", "40", - "FCC", "5G", "20M", "HT", "4T", "120", "46", - "ETSI", "5G", "20M", "HT", "4T", "120", "40", - "MKK", "5G", "20M", "HT", "4T", "120", "40", - "FCC", "5G", "20M", "HT", "4T", "124", "46", - "ETSI", "5G", "20M", "HT", "4T", "124", "40", - "MKK", "5G", "20M", "HT", "4T", "124", "40", - "FCC", "5G", "20M", "HT", "4T", "128", "46", - "ETSI", "5G", "20M", "HT", "4T", "128", "40", - "MKK", "5G", "20M", "HT", "4T", "128", "40", - "FCC", "5G", "20M", "HT", "4T", "132", "46", - "ETSI", "5G", "20M", "HT", "4T", "132", "40", - "MKK", "5G", "20M", "HT", "4T", "132", "40", - "FCC", "5G", "20M", "HT", "4T", "136", "46", - "ETSI", "5G", "20M", "HT", "4T", "136", "40", - "MKK", "5G", "20M", "HT", "4T", "136", "40", - "FCC", "5G", "20M", "HT", "4T", "140", "46", - "ETSI", "5G", "20M", "HT", "4T", "140", "40", - "MKK", "5G", "20M", "HT", "4T", "140", "40", - "FCC", "5G", "20M", "HT", "4T", "149", "46", - "ETSI", "5G", "20M", "HT", "4T", "149", "40", - "MKK", "5G", "20M", "HT", "4T", "149", "63", - "FCC", "5G", "20M", "HT", "4T", "153", "46", - "ETSI", "5G", "20M", "HT", "4T", "153", "40", - "MKK", "5G", "20M", "HT", "4T", "153", "63", - "FCC", "5G", "20M", "HT", "4T", "157", "46", - "ETSI", "5G", "20M", "HT", "4T", "157", "40", - "MKK", "5G", "20M", "HT", "4T", "157", "63", - "FCC", "5G", "20M", "HT", "4T", "161", "46", - "ETSI", "5G", "20M", "HT", "4T", "161", "40", - "MKK", "5G", "20M", "HT", "4T", "161", "63", - "FCC", "5G", "20M", "HT", "4T", "165", "46", - "ETSI", "5G", "20M", "HT", "4T", "165", "40", - "MKK", "5G", "20M", "HT", "4T", "165", "63", - "FCC", "5G", "40M", "HT", "1T", "38", "46", - "ETSI", "5G", "40M", "HT", "1T", "38", "40", - "MKK", "5G", "40M", "HT", "1T", "38", "40", - "FCC", "5G", "40M", "HT", "1T", "46", "46", - "ETSI", "5G", "40M", "HT", "1T", "46", "40", - "MKK", "5G", "40M", "HT", "1T", "46", "40", - "FCC", "5G", "40M", "HT", "1T", "54", "46", - "ETSI", "5G", "40M", "HT", "1T", "54", "40", - "MKK", "5G", "40M", "HT", "1T", "54", "40", - "FCC", "5G", "40M", "HT", "1T", "62", "46", - "ETSI", "5G", "40M", "HT", "1T", "62", "40", - "MKK", "5G", "40M", "HT", "1T", "62", "40", - "FCC", "5G", "40M", "HT", "1T", "102", "46", - "ETSI", "5G", "40M", "HT", "1T", "102", "40", - "MKK", "5G", "40M", "HT", "1T", "102", "40", - "FCC", "5G", "40M", "HT", "1T", "110", "46", - "ETSI", "5G", "40M", "HT", "1T", "110", "40", - "MKK", "5G", "40M", "HT", "1T", "110", "40", - "FCC", "5G", "40M", "HT", "1T", "118", "46", - "ETSI", "5G", "40M", "HT", "1T", "118", "40", - "MKK", "5G", "40M", "HT", "1T", "118", "40", - "FCC", "5G", "40M", "HT", "1T", "126", "46", - "ETSI", "5G", "40M", "HT", "1T", "126", "40", - "MKK", "5G", "40M", "HT", "1T", "126", "40", - "FCC", "5G", "40M", "HT", "1T", "134", "46", - "ETSI", "5G", "40M", "HT", "1T", "134", "40", - "MKK", "5G", "40M", "HT", "1T", "134", "40", - "FCC", "5G", "40M", "HT", "1T", "151", "46", - "ETSI", "5G", "40M", "HT", "1T", "151", "40", - "MKK", "5G", "40M", "HT", "1T", "151", "63", - "FCC", "5G", "40M", "HT", "1T", "159", "46", - "ETSI", "5G", "40M", "HT", "1T", "159", "40", - "MKK", "5G", "40M", "HT", "1T", "159", "63", - "FCC", "5G", "40M", "HT", "2T", "38", "46", - "ETSI", "5G", "40M", "HT", "2T", "38", "40", - "MKK", "5G", "40M", "HT", "2T", "38", "40", - "FCC", "5G", "40M", "HT", "2T", "46", "46", - "ETSI", "5G", "40M", "HT", "2T", "46", "40", - "MKK", "5G", "40M", "HT", "2T", "46", "40", - "FCC", "5G", "40M", "HT", "2T", "54", "46", - "ETSI", "5G", "40M", "HT", "2T", "54", "40", - "MKK", "5G", "40M", "HT", "2T", "54", "40", - "FCC", "5G", "40M", "HT", "2T", "62", "46", - "ETSI", "5G", "40M", "HT", "2T", "62", "40", - "MKK", "5G", "40M", "HT", "2T", "62", "40", - "FCC", "5G", "40M", "HT", "2T", "102", "46", - "ETSI", "5G", "40M", "HT", "2T", "102", "40", - "MKK", "5G", "40M", "HT", "2T", "102", "40", - "FCC", "5G", "40M", "HT", "2T", "110", "46", - "ETSI", "5G", "40M", "HT", "2T", "110", "40", - "MKK", "5G", "40M", "HT", "2T", "110", "40", - "FCC", "5G", "40M", "HT", "2T", "118", "46", - "ETSI", "5G", "40M", "HT", "2T", "118", "40", - "MKK", "5G", "40M", "HT", "2T", "118", "40", - "FCC", "5G", "40M", "HT", "2T", "126", "46", - "ETSI", "5G", "40M", "HT", "2T", "126", "40", - "MKK", "5G", "40M", "HT", "2T", "126", "40", - "FCC", "5G", "40M", "HT", "2T", "134", "46", - "ETSI", "5G", "40M", "HT", "2T", "134", "40", - "MKK", "5G", "40M", "HT", "2T", "134", "40", - "FCC", "5G", "40M", "HT", "2T", "151", "46", - "ETSI", "5G", "40M", "HT", "2T", "151", "40", - "MKK", "5G", "40M", "HT", "2T", "151", "63", - "FCC", "5G", "40M", "HT", "2T", "159", "46", - "ETSI", "5G", "40M", "HT", "2T", "159", "40", - "MKK", "5G", "40M", "HT", "2T", "159", "63", - "FCC", "5G", "40M", "HT", "3T", "38", "46", - "ETSI", "5G", "40M", "HT", "3T", "38", "40", - "MKK", "5G", "40M", "HT", "3T", "38", "40", - "FCC", "5G", "40M", "HT", "3T", "46", "46", - "ETSI", "5G", "40M", "HT", "3T", "46", "40", - "MKK", "5G", "40M", "HT", "3T", "46", "40", - "FCC", "5G", "40M", "HT", "3T", "54", "46", - "ETSI", "5G", "40M", "HT", "3T", "54", "40", - "MKK", "5G", "40M", "HT", "3T", "54", "40", - "FCC", "5G", "40M", "HT", "3T", "62", "46", - "ETSI", "5G", "40M", "HT", "3T", "62", "40", - "MKK", "5G", "40M", "HT", "3T", "62", "40", - "FCC", "5G", "40M", "HT", "3T", "102", "46", - "ETSI", "5G", "40M", "HT", "3T", "102", "40", - "MKK", "5G", "40M", "HT", "3T", "102", "40", - "FCC", "5G", "40M", "HT", "3T", "110", "46", - "ETSI", "5G", "40M", "HT", "3T", "110", "40", - "MKK", "5G", "40M", "HT", "3T", "110", "40", - "FCC", "5G", "40M", "HT", "3T", "118", "46", - "ETSI", "5G", "40M", "HT", "3T", "118", "40", - "MKK", "5G", "40M", "HT", "3T", "118", "40", - "FCC", "5G", "40M", "HT", "3T", "126", "46", - "ETSI", "5G", "40M", "HT", "3T", "126", "40", - "MKK", "5G", "40M", "HT", "3T", "126", "40", - "FCC", "5G", "40M", "HT", "3T", "134", "46", - "ETSI", "5G", "40M", "HT", "3T", "134", "40", - "MKK", "5G", "40M", "HT", "3T", "134", "40", - "FCC", "5G", "40M", "HT", "3T", "151", "46", - "ETSI", "5G", "40M", "HT", "3T", "151", "40", - "MKK", "5G", "40M", "HT", "3T", "151", "63", - "FCC", "5G", "40M", "HT", "3T", "159", "46", - "ETSI", "5G", "40M", "HT", "3T", "159", "40", - "MKK", "5G", "40M", "HT", "3T", "159", "63", - "FCC", "5G", "40M", "HT", "4T", "38", "46", - "ETSI", "5G", "40M", "HT", "4T", "38", "40", - "MKK", "5G", "40M", "HT", "4T", "38", "40", - "FCC", "5G", "40M", "HT", "4T", "46", "46", - "ETSI", "5G", "40M", "HT", "4T", "46", "40", - "MKK", "5G", "40M", "HT", "4T", "46", "40", - "FCC", "5G", "40M", "HT", "4T", "54", "46", - "ETSI", "5G", "40M", "HT", "4T", "54", "40", - "MKK", "5G", "40M", "HT", "4T", "54", "40", - "FCC", "5G", "40M", "HT", "4T", "62", "46", - "ETSI", "5G", "40M", "HT", "4T", "62", "40", - "MKK", "5G", "40M", "HT", "4T", "62", "40", - "FCC", "5G", "40M", "HT", "4T", "102", "46", - "ETSI", "5G", "40M", "HT", "4T", "102", "40", - "MKK", "5G", "40M", "HT", "4T", "102", "40", - "FCC", "5G", "40M", "HT", "4T", "110", "46", - "ETSI", "5G", "40M", "HT", "4T", "110", "40", - "MKK", "5G", "40M", "HT", "4T", "110", "40", - "FCC", "5G", "40M", "HT", "4T", "118", "46", - "ETSI", "5G", "40M", "HT", "4T", "118", "40", - "MKK", "5G", "40M", "HT", "4T", "118", "40", - "FCC", "5G", "40M", "HT", "4T", "126", "46", - "ETSI", "5G", "40M", "HT", "4T", "126", "40", - "MKK", "5G", "40M", "HT", "4T", "126", "40", - "FCC", "5G", "40M", "HT", "4T", "134", "46", - "ETSI", "5G", "40M", "HT", "4T", "134", "40", - "MKK", "5G", "40M", "HT", "4T", "134", "40", - "FCC", "5G", "40M", "HT", "4T", "151", "46", - "ETSI", "5G", "40M", "HT", "4T", "151", "40", - "MKK", "5G", "40M", "HT", "4T", "151", "63", - "FCC", "5G", "40M", "HT", "4T", "159", "46", - "ETSI", "5G", "40M", "HT", "4T", "159", "40", - "MKK", "5G", "40M", "HT", "4T", "159", "63", - "FCC", "5G", "80M", "VHT", "1T", "42", "46", - "ETSI", "5G", "80M", "VHT", "1T", "42", "40", - "MKK", "5G", "80M", "VHT", "1T", "42", "40", - "FCC", "5G", "80M", "VHT", "1T", "58", "46", - "ETSI", "5G", "80M", "VHT", "1T", "58", "40", - "MKK", "5G", "80M", "VHT", "1T", "58", "40", - "FCC", "5G", "80M", "VHT", "1T", "106", "46", - "ETSI", "5G", "80M", "VHT", "1T", "106", "40", - "MKK", "5G", "80M", "VHT", "1T", "106", "40", - "FCC", "5G", "80M", "VHT", "1T", "122", "46", - "ETSI", "5G", "80M", "VHT", "1T", "122", "40", - "MKK", "5G", "80M", "VHT", "1T", "122", "40", - "FCC", "5G", "80M", "VHT", "1T", "155", "46", - "ETSI", "5G", "80M", "VHT", "1T", "155", "40", - "MKK", "5G", "80M", "VHT", "1T", "155", "63", - "FCC", "5G", "80M", "VHT", "2T", "42", "46", - "ETSI", "5G", "80M", "VHT", "2T", "42", "40", - "MKK", "5G", "80M", "VHT", "2T", "42", "40", - "FCC", "5G", "80M", "VHT", "2T", "58", "46", - "ETSI", "5G", "80M", "VHT", "2T", "58", "40", - "MKK", "5G", "80M", "VHT", "2T", "58", "40", - "FCC", "5G", "80M", "VHT", "2T", "106", "46", - "ETSI", "5G", "80M", "VHT", "2T", "106", "40", - "MKK", "5G", "80M", "VHT", "2T", "106", "40", - "FCC", "5G", "80M", "VHT", "2T", "122", "46", - "ETSI", "5G", "80M", "VHT", "2T", "122", "40", - "MKK", "5G", "80M", "VHT", "2T", "122", "40", - "FCC", "5G", "80M", "VHT", "2T", "155", "46", - "ETSI", "5G", "80M", "VHT", "2T", "155", "40", - "MKK", "5G", "80M", "VHT", "2T", "155", "63", - "FCC", "5G", "80M", "VHT", "3T", "42", "46", - "ETSI", "5G", "80M", "VHT", "3T", "42", "40", - "MKK", "5G", "80M", "VHT", "3T", "42", "40", - "FCC", "5G", "80M", "VHT", "3T", "58", "46", - "ETSI", "5G", "80M", "VHT", "3T", "58", "40", - "MKK", "5G", "80M", "VHT", "3T", "58", "40", - "FCC", "5G", "80M", "VHT", "3T", "106", "46", - "ETSI", "5G", "80M", "VHT", "3T", "106", "40", - "MKK", "5G", "80M", "VHT", "3T", "106", "40", - "FCC", "5G", "80M", "VHT", "3T", "122", "46", - "ETSI", "5G", "80M", "VHT", "3T", "122", "40", - "MKK", "5G", "80M", "VHT", "3T", "122", "40", - "FCC", "5G", "80M", "VHT", "3T", "155", "46", - "ETSI", "5G", "80M", "VHT", "3T", "155", "40", - "MKK", "5G", "80M", "VHT", "3T", "155", "63", - "FCC", "5G", "80M", "VHT", "4T", "42", "46", - "ETSI", "5G", "80M", "VHT", "4T", "42", "40", - "MKK", "5G", "80M", "VHT", "4T", "42", "40", - "FCC", "5G", "80M", "VHT", "4T", "58", "46", - "ETSI", "5G", "80M", "VHT", "4T", "58", "40", - "MKK", "5G", "80M", "VHT", "4T", "58", "40", - "FCC", "5G", "80M", "VHT", "4T", "106", "46", - "ETSI", "5G", "80M", "VHT", "4T", "106", "40", - "MKK", "5G", "80M", "VHT", "4T", "106", "40", - "FCC", "5G", "80M", "VHT", "4T", "122", "46", - "ETSI", "5G", "80M", "VHT", "4T", "122", "40", - "MKK", "5G", "80M", "VHT", "4T", "122", "40", - "FCC", "5G", "80M", "VHT", "4T", "155", "46", - "ETSI", "5G", "80M", "VHT", "4T", "155", "40", - "MKK", "5G", "80M", "VHT", "4T", "155", "63" -}; - -void -_odm_read_and_config_mp_8814a_txpwr_lmt_type3( - struct dm_struct * pDM_Odm -) -{ - u4Byte i = 0; - u4Byte ArrayLen = sizeof(Array_MP_8814A_TXPWR_LMT_Type3)/sizeof(pu1Byte); - pu1Byte *Array = (pu1Byte *)Array_MP_8814A_TXPWR_LMT_Type3; - - - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_8814A_TXPWR_LMT_Type3\n"); - - for (i = 0; i < ArrayLen; i += 7) { - pu1Byte regulation = Array[i]; - pu1Byte band = Array[i+1]; - pu1Byte bandwidth = Array[i+2]; - pu1Byte rate = Array[i+3]; - pu1Byte rfPath = Array[i+4]; - pu1Byte chnl = Array[i+5]; - pu1Byte val = Array[i+6]; - - odm_ConfigBB_TXPWR_LMT_8814A(pDM_Odm, regulation, band, bandwidth, rate, rfPath, chnl, val); - } - -} - -****************************************************************************** -* TXPWR_LMT_Type5.TXT -****************************************************************************** - -const char *Array_MP_8814A_TXPWR_LMT_Type5[] = { - "FCC", "2.4G", "20M", "CCK", "1T", "01", "46", - "ETSI", "2.4G", "20M", "CCK", "1T", "01", "40", - "MKK", "2.4G", "20M", "CCK", "1T", "01", "40", - "FCC", "2.4G", "20M", "CCK", "1T", "02", "46", - "ETSI", "2.4G", "20M", "CCK", "1T", "02", "40", - "MKK", "2.4G", "20M", "CCK", "1T", "02", "40", - "FCC", "2.4G", "20M", "CCK", "1T", "03", "46", - "ETSI", "2.4G", "20M", "CCK", "1T", "03", "40", - "MKK", "2.4G", "20M", "CCK", "1T", "03", "40", - "FCC", "2.4G", "20M", "CCK", "1T", "04", "46", - "ETSI", "2.4G", "20M", "CCK", "1T", "04", "40", - "MKK", "2.4G", "20M", "CCK", "1T", "04", "40", - "FCC", "2.4G", "20M", "CCK", "1T", "05", "46", - "ETSI", "2.4G", "20M", "CCK", "1T", "05", "40", - "MKK", "2.4G", "20M", "CCK", "1T", "05", "40", - "FCC", "2.4G", "20M", "CCK", "1T", "06", "46", - "ETSI", "2.4G", "20M", "CCK", "1T", "06", "40", - "MKK", "2.4G", "20M", "CCK", "1T", "06", "40", - "FCC", "2.4G", "20M", "CCK", "1T", "07", "46", - "ETSI", "2.4G", "20M", "CCK", "1T", "07", "40", - "MKK", "2.4G", "20M", "CCK", "1T", "07", "40", - "FCC", "2.4G", "20M", "CCK", "1T", "08", "46", - "ETSI", "2.4G", "20M", "CCK", "1T", "08", "40", - "MKK", "2.4G", "20M", "CCK", "1T", "08", "40", - "FCC", "2.4G", "20M", "CCK", "1T", "09", "46", - "ETSI", "2.4G", "20M", "CCK", "1T", "09", "40", - "MKK", "2.4G", "20M", "CCK", "1T", "09", "40", - "FCC", "2.4G", "20M", "CCK", "1T", "10", "46", - "ETSI", "2.4G", "20M", "CCK", "1T", "10", "40", - "MKK", "2.4G", "20M", "CCK", "1T", "10", "40", - "FCC", "2.4G", "20M", "CCK", "1T", "11", "46", - "ETSI", "2.4G", "20M", "CCK", "1T", "11", "40", - "MKK", "2.4G", "20M", "CCK", "1T", "11", "40", - "FCC", "2.4G", "20M", "CCK", "1T", "12", "63", - "ETSI", "2.4G", "20M", "CCK", "1T", "12", "40", - "MKK", "2.4G", "20M", "CCK", "1T", "12", "40", - "FCC", "2.4G", "20M", "CCK", "1T", "13", "63", - "ETSI", "2.4G", "20M", "CCK", "1T", "13", "40", - "MKK", "2.4G", "20M", "CCK", "1T", "13", "40", - "FCC", "2.4G", "20M", "CCK", "1T", "14", "63", - "ETSI", "2.4G", "20M", "CCK", "1T", "14", "63", - "MKK", "2.4G", "20M", "CCK", "1T", "14", "40", - "FCC", "2.4G", "20M", "OFDM", "1T", "01", "46", - "ETSI", "2.4G", "20M", "OFDM", "1T", "01", "40", - "MKK", "2.4G", "20M", "OFDM", "1T", "01", "40", - "FCC", "2.4G", "20M", "OFDM", "1T", "02", "46", - "ETSI", "2.4G", "20M", "OFDM", "1T", "02", "40", - "MKK", "2.4G", "20M", "OFDM", "1T", "02", "40", - "FCC", "2.4G", "20M", "OFDM", "1T", "03", "46", - "ETSI", "2.4G", "20M", "OFDM", "1T", "03", "40", - "MKK", "2.4G", "20M", "OFDM", "1T", "03", "40", - "FCC", "2.4G", "20M", "OFDM", "1T", "04", "46", - "ETSI", "2.4G", "20M", "OFDM", "1T", "04", "40", - "MKK", "2.4G", "20M", "OFDM", "1T", "04", "40", - "FCC", "2.4G", "20M", "OFDM", "1T", "05", "46", - "ETSI", "2.4G", "20M", "OFDM", "1T", "05", "40", - "MKK", "2.4G", "20M", "OFDM", "1T", "05", "40", - "FCC", "2.4G", "20M", "OFDM", "1T", "06", "46", - "ETSI", "2.4G", "20M", "OFDM", "1T", "06", "40", - "MKK", "2.4G", "20M", "OFDM", "1T", "06", "40", - "FCC", "2.4G", "20M", "OFDM", "1T", "07", "46", - "ETSI", "2.4G", "20M", "OFDM", "1T", "07", "40", - "MKK", "2.4G", "20M", "OFDM", "1T", "07", "40", - "FCC", "2.4G", "20M", "OFDM", "1T", "08", "46", - "ETSI", "2.4G", "20M", "OFDM", "1T", "08", "40", - "MKK", "2.4G", "20M", "OFDM", "1T", "08", "40", - "FCC", "2.4G", "20M", "OFDM", "1T", "09", "46", - "ETSI", "2.4G", "20M", "OFDM", "1T", "09", "40", - "MKK", "2.4G", "20M", "OFDM", "1T", "09", "40", - "FCC", "2.4G", "20M", "OFDM", "1T", "10", "46", - "ETSI", "2.4G", "20M", "OFDM", "1T", "10", "40", - "MKK", "2.4G", "20M", "OFDM", "1T", "10", "40", - "FCC", "2.4G", "20M", "OFDM", "1T", "11", "46", - "ETSI", "2.4G", "20M", "OFDM", "1T", "11", "40", - "MKK", "2.4G", "20M", "OFDM", "1T", "11", "40", - "FCC", "2.4G", "20M", "OFDM", "1T", "12", "63", - "ETSI", "2.4G", "20M", "OFDM", "1T", "12", "40", - "MKK", "2.4G", "20M", "OFDM", "1T", "12", "40", - "FCC", "2.4G", "20M", "OFDM", "1T", "13", "63", - "ETSI", "2.4G", "20M", "OFDM", "1T", "13", "40", - "MKK", "2.4G", "20M", "OFDM", "1T", "13", "40", - "FCC", "2.4G", "20M", "OFDM", "1T", "14", "63", - "ETSI", "2.4G", "20M", "OFDM", "1T", "14", "63", - "MKK", "2.4G", "20M", "OFDM", "1T", "14", "63", - "FCC", "2.4G", "20M", "HT", "1T", "01", "46", - "ETSI", "2.4G", "20M", "HT", "1T", "01", "40", - "MKK", "2.4G", "20M", "HT", "1T", "01", "40", - "FCC", "2.4G", "20M", "HT", "1T", "02", "46", - "ETSI", "2.4G", "20M", "HT", "1T", "02", "40", - "MKK", "2.4G", "20M", "HT", "1T", "02", "40", - "FCC", "2.4G", "20M", "HT", "1T", "03", "46", - "ETSI", "2.4G", "20M", "HT", "1T", "03", "40", - "MKK", "2.4G", "20M", "HT", "1T", "03", "40", - "FCC", "2.4G", "20M", "HT", "1T", "04", "46", - "ETSI", "2.4G", "20M", "HT", "1T", "04", "40", - "MKK", "2.4G", "20M", "HT", "1T", "04", "40", - "FCC", "2.4G", "20M", "HT", "1T", "05", "46", - "ETSI", "2.4G", "20M", "HT", "1T", "05", "40", - "MKK", "2.4G", "20M", "HT", "1T", "05", "40", - "FCC", "2.4G", "20M", "HT", "1T", "06", "46", - "ETSI", "2.4G", "20M", "HT", "1T", "06", "40", - "MKK", "2.4G", "20M", "HT", "1T", "06", "40", - "FCC", "2.4G", "20M", "HT", "1T", "07", "46", - "ETSI", "2.4G", "20M", "HT", "1T", "07", "40", - "MKK", "2.4G", "20M", "HT", "1T", "07", "40", - "FCC", "2.4G", "20M", "HT", "1T", "08", "46", - "ETSI", "2.4G", "20M", "HT", "1T", "08", "40", - "MKK", "2.4G", "20M", "HT", "1T", "08", "40", - "FCC", "2.4G", "20M", "HT", "1T", "09", "46", - "ETSI", "2.4G", "20M", "HT", "1T", "09", "40", - "MKK", "2.4G", "20M", "HT", "1T", "09", "40", - "FCC", "2.4G", "20M", "HT", "1T", "10", "46", - "ETSI", "2.4G", "20M", "HT", "1T", "10", "40", - "MKK", "2.4G", "20M", "HT", "1T", "10", "40", - "FCC", "2.4G", "20M", "HT", "1T", "11", "46", - "ETSI", "2.4G", "20M", "HT", "1T", "11", "40", - "MKK", "2.4G", "20M", "HT", "1T", "11", "40", - "FCC", "2.4G", "20M", "HT", "1T", "12", "63", - "ETSI", "2.4G", "20M", "HT", "1T", "12", "40", - "MKK", "2.4G", "20M", "HT", "1T", "12", "40", - "FCC", "2.4G", "20M", "HT", "1T", "13", "63", - "ETSI", "2.4G", "20M", "HT", "1T", "13", "40", - "MKK", "2.4G", "20M", "HT", "1T", "13", "40", - "FCC", "2.4G", "20M", "HT", "1T", "14", "63", - "ETSI", "2.4G", "20M", "HT", "1T", "14", "63", - "MKK", "2.4G", "20M", "HT", "1T", "14", "63", - "FCC", "2.4G", "20M", "HT", "2T", "01", "46", - "ETSI", "2.4G", "20M", "HT", "2T", "01", "40", - "MKK", "2.4G", "20M", "HT", "2T", "01", "40", - "FCC", "2.4G", "20M", "HT", "2T", "02", "46", - "ETSI", "2.4G", "20M", "HT", "2T", "02", "40", - "MKK", "2.4G", "20M", "HT", "2T", "02", "40", - "FCC", "2.4G", "20M", "HT", "2T", "03", "46", - "ETSI", "2.4G", "20M", "HT", "2T", "03", "40", - "MKK", "2.4G", "20M", "HT", "2T", "03", "40", - "FCC", "2.4G", "20M", "HT", "2T", "04", "46", - "ETSI", "2.4G", "20M", "HT", "2T", "04", "40", - "MKK", "2.4G", "20M", "HT", "2T", "04", "40", - "FCC", "2.4G", "20M", "HT", "2T", "05", "46", - "ETSI", "2.4G", "20M", "HT", "2T", "05", "40", - "MKK", "2.4G", "20M", "HT", "2T", "05", "40", - "FCC", "2.4G", "20M", "HT", "2T", "06", "46", - "ETSI", "2.4G", "20M", "HT", "2T", "06", "40", - "MKK", "2.4G", "20M", "HT", "2T", "06", "40", - "FCC", "2.4G", "20M", "HT", "2T", "07", "46", - "ETSI", "2.4G", "20M", "HT", "2T", "07", "40", - "MKK", "2.4G", "20M", "HT", "2T", "07", "40", - "FCC", "2.4G", "20M", "HT", "2T", "08", "46", - "ETSI", "2.4G", "20M", "HT", "2T", "08", "40", - "MKK", "2.4G", "20M", "HT", "2T", "08", "40", - "FCC", "2.4G", "20M", "HT", "2T", "09", "46", - "ETSI", "2.4G", "20M", "HT", "2T", "09", "40", - "MKK", "2.4G", "20M", "HT", "2T", "09", "40", - "FCC", "2.4G", "20M", "HT", "2T", "10", "46", - "ETSI", "2.4G", "20M", "HT", "2T", "10", "40", - "MKK", "2.4G", "20M", "HT", "2T", "10", "40", - "FCC", "2.4G", "20M", "HT", "2T", "11", "46", - "ETSI", "2.4G", "20M", "HT", "2T", "11", "40", - "MKK", "2.4G", "20M", "HT", "2T", "11", "40", - "FCC", "2.4G", "20M", "HT", "2T", "12", "63", - "ETSI", "2.4G", "20M", "HT", "2T", "12", "40", - "MKK", "2.4G", "20M", "HT", "2T", "12", "40", - "FCC", "2.4G", "20M", "HT", "2T", "13", "63", - "ETSI", "2.4G", "20M", "HT", "2T", "13", "40", - "MKK", "2.4G", "20M", "HT", "2T", "13", "40", - "FCC", "2.4G", "20M", "HT", "2T", "14", "63", - "ETSI", "2.4G", "20M", "HT", "2T", "14", "63", - "MKK", "2.4G", "20M", "HT", "2T", "14", "63", - "FCC", "2.4G", "20M", "HT", "3T", "01", "46", - "ETSI", "2.4G", "20M", "HT", "3T", "01", "40", - "MKK", "2.4G", "20M", "HT", "3T", "01", "40", - "FCC", "2.4G", "20M", "HT", "3T", "02", "46", - "ETSI", "2.4G", "20M", "HT", "3T", "02", "40", - "MKK", "2.4G", "20M", "HT", "3T", "02", "40", - "FCC", "2.4G", "20M", "HT", "3T", "03", "46", - "ETSI", "2.4G", "20M", "HT", "3T", "03", "40", - "MKK", "2.4G", "20M", "HT", "3T", "03", "40", - "FCC", "2.4G", "20M", "HT", "3T", "04", "46", - "ETSI", "2.4G", "20M", "HT", "3T", "04", "40", - "MKK", "2.4G", "20M", "HT", "3T", "04", "40", - "FCC", "2.4G", "20M", "HT", "3T", "05", "46", - "ETSI", "2.4G", "20M", "HT", "3T", "05", "40", - "MKK", "2.4G", "20M", "HT", "3T", "05", "40", - "FCC", "2.4G", "20M", "HT", "3T", "06", "46", - "ETSI", "2.4G", "20M", "HT", "3T", "06", "40", - "MKK", "2.4G", "20M", "HT", "3T", "06", "40", - "FCC", "2.4G", "20M", "HT", "3T", "07", "46", - "ETSI", "2.4G", "20M", "HT", "3T", "07", "40", - "MKK", "2.4G", "20M", "HT", "3T", "07", "40", - "FCC", "2.4G", "20M", "HT", "3T", "08", "46", - "ETSI", "2.4G", "20M", "HT", "3T", "08", "40", - "MKK", "2.4G", "20M", "HT", "3T", "08", "40", - "FCC", "2.4G", "20M", "HT", "3T", "09", "46", - "ETSI", "2.4G", "20M", "HT", "3T", "09", "40", - "MKK", "2.4G", "20M", "HT", "3T", "09", "40", - "FCC", "2.4G", "20M", "HT", "3T", "10", "46", - "ETSI", "2.4G", "20M", "HT", "3T", "10", "40", - "MKK", "2.4G", "20M", "HT", "3T", "10", "40", - "FCC", "2.4G", "20M", "HT", "3T", "11", "46", - "ETSI", "2.4G", "20M", "HT", "3T", "11", "40", - "MKK", "2.4G", "20M", "HT", "3T", "11", "40", - "FCC", "2.4G", "20M", "HT", "3T", "12", "63", - "ETSI", "2.4G", "20M", "HT", "3T", "12", "40", - "MKK", "2.4G", "20M", "HT", "3T", "12", "40", - "FCC", "2.4G", "20M", "HT", "3T", "13", "63", - "ETSI", "2.4G", "20M", "HT", "3T", "13", "40", - "MKK", "2.4G", "20M", "HT", "3T", "13", "40", - "FCC", "2.4G", "20M", "HT", "3T", "14", "63", - "ETSI", "2.4G", "20M", "HT", "3T", "14", "63", - "MKK", "2.4G", "20M", "HT", "3T", "14", "63", - "FCC", "2.4G", "20M", "HT", "4T", "01", "46", - "ETSI", "2.4G", "20M", "HT", "4T", "01", "40", - "MKK", "2.4G", "20M", "HT", "4T", "01", "40", - "FCC", "2.4G", "20M", "HT", "4T", "02", "46", - "ETSI", "2.4G", "20M", "HT", "4T", "02", "40", - "MKK", "2.4G", "20M", "HT", "4T", "02", "40", - "FCC", "2.4G", "20M", "HT", "4T", "03", "46", - "ETSI", "2.4G", "20M", "HT", "4T", "03", "40", - "MKK", "2.4G", "20M", "HT", "4T", "03", "40", - "FCC", "2.4G", "20M", "HT", "4T", "04", "46", - "ETSI", "2.4G", "20M", "HT", "4T", "04", "40", - "MKK", "2.4G", "20M", "HT", "4T", "04", "40", - "FCC", "2.4G", "20M", "HT", "4T", "05", "46", - "ETSI", "2.4G", "20M", "HT", "4T", "05", "40", - "MKK", "2.4G", "20M", "HT", "4T", "05", "40", - "FCC", "2.4G", "20M", "HT", "4T", "06", "46", - "ETSI", "2.4G", "20M", "HT", "4T", "06", "40", - "MKK", "2.4G", "20M", "HT", "4T", "06", "40", - "FCC", "2.4G", "20M", "HT", "4T", "07", "46", - "ETSI", "2.4G", "20M", "HT", "4T", "07", "40", - "MKK", "2.4G", "20M", "HT", "4T", "07", "40", - "FCC", "2.4G", "20M", "HT", "4T", "08", "46", - "ETSI", "2.4G", "20M", "HT", "4T", "08", "40", - "MKK", "2.4G", "20M", "HT", "4T", "08", "40", - "FCC", "2.4G", "20M", "HT", "4T", "09", "46", - "ETSI", "2.4G", "20M", "HT", "4T", "09", "40", - "MKK", "2.4G", "20M", "HT", "4T", "09", "40", - "FCC", "2.4G", "20M", "HT", "4T", "10", "46", - "ETSI", "2.4G", "20M", "HT", "4T", "10", "40", - "MKK", "2.4G", "20M", "HT", "4T", "10", "40", - "FCC", "2.4G", "20M", "HT", "4T", "11", "46", - "ETSI", "2.4G", "20M", "HT", "4T", "11", "40", - "MKK", "2.4G", "20M", "HT", "4T", "11", "40", - "FCC", "2.4G", "20M", "HT", "4T", "12", "63", - "ETSI", "2.4G", "20M", "HT", "4T", "12", "40", - "MKK", "2.4G", "20M", "HT", "4T", "12", "40", - "FCC", "2.4G", "20M", "HT", "4T", "13", "63", - "ETSI", "2.4G", "20M", "HT", "4T", "13", "40", - "MKK", "2.4G", "20M", "HT", "4T", "13", "40", - "FCC", "2.4G", "20M", "HT", "4T", "14", "63", - "ETSI", "2.4G", "20M", "HT", "4T", "14", "63", - "MKK", "2.4G", "20M", "HT", "4T", "14", "63", - "FCC", "2.4G", "40M", "HT", "1T", "01", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "01", "63", - "MKK", "2.4G", "40M", "HT", "1T", "01", "63", - "FCC", "2.4G", "40M", "HT", "1T", "02", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "02", "63", - "MKK", "2.4G", "40M", "HT", "1T", "02", "63", - "FCC", "2.4G", "40M", "HT", "1T", "03", "46", - "ETSI", "2.4G", "40M", "HT", "1T", "03", "40", - "MKK", "2.4G", "40M", "HT", "1T", "03", "40", - "FCC", "2.4G", "40M", "HT", "1T", "04", "46", - "ETSI", "2.4G", "40M", "HT", "1T", "04", "40", - "MKK", "2.4G", "40M", "HT", "1T", "04", "40", - "FCC", "2.4G", "40M", "HT", "1T", "05", "46", - "ETSI", "2.4G", "40M", "HT", "1T", "05", "40", - "MKK", "2.4G", "40M", "HT", "1T", "05", "40", - "FCC", "2.4G", "40M", "HT", "1T", "06", "46", - "ETSI", "2.4G", "40M", "HT", "1T", "06", "40", - "MKK", "2.4G", "40M", "HT", "1T", "06", "40", - "FCC", "2.4G", "40M", "HT", "1T", "07", "46", - "ETSI", "2.4G", "40M", "HT", "1T", "07", "40", - "MKK", "2.4G", "40M", "HT", "1T", "07", "40", - "FCC", "2.4G", "40M", "HT", "1T", "08", "46", - "ETSI", "2.4G", "40M", "HT", "1T", "08", "40", - "MKK", "2.4G", "40M", "HT", "1T", "08", "40", - "FCC", "2.4G", "40M", "HT", "1T", "09", "46", - "ETSI", "2.4G", "40M", "HT", "1T", "09", "40", - "MKK", "2.4G", "40M", "HT", "1T", "09", "40", - "FCC", "2.4G", "40M", "HT", "1T", "10", "46", - "ETSI", "2.4G", "40M", "HT", "1T", "10", "40", - "MKK", "2.4G", "40M", "HT", "1T", "10", "40", - "FCC", "2.4G", "40M", "HT", "1T", "11", "46", - "ETSI", "2.4G", "40M", "HT", "1T", "11", "40", - "MKK", "2.4G", "40M", "HT", "1T", "11", "40", - "FCC", "2.4G", "40M", "HT", "1T", "12", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "12", "40", - "MKK", "2.4G", "40M", "HT", "1T", "12", "40", - "FCC", "2.4G", "40M", "HT", "1T", "13", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "13", "40", - "MKK", "2.4G", "40M", "HT", "1T", "13", "40", - "FCC", "2.4G", "40M", "HT", "1T", "14", "63", - "ETSI", "2.4G", "40M", "HT", "1T", "14", "63", - "MKK", "2.4G", "40M", "HT", "1T", "14", "63", - "FCC", "2.4G", "40M", "HT", "2T", "01", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "01", "63", - "MKK", "2.4G", "40M", "HT", "2T", "01", "63", - "FCC", "2.4G", "40M", "HT", "2T", "02", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "02", "63", - "MKK", "2.4G", "40M", "HT", "2T", "02", "63", - "FCC", "2.4G", "40M", "HT", "2T", "03", "46", - "ETSI", "2.4G", "40M", "HT", "2T", "03", "40", - "MKK", "2.4G", "40M", "HT", "2T", "03", "40", - "FCC", "2.4G", "40M", "HT", "2T", "04", "46", - "ETSI", "2.4G", "40M", "HT", "2T", "04", "40", - "MKK", "2.4G", "40M", "HT", "2T", "04", "40", - "FCC", "2.4G", "40M", "HT", "2T", "05", "46", - "ETSI", "2.4G", "40M", "HT", "2T", "05", "40", - "MKK", "2.4G", "40M", "HT", "2T", "05", "40", - "FCC", "2.4G", "40M", "HT", "2T", "06", "46", - "ETSI", "2.4G", "40M", "HT", "2T", "06", "40", - "MKK", "2.4G", "40M", "HT", "2T", "06", "40", - "FCC", "2.4G", "40M", "HT", "2T", "07", "46", - "ETSI", "2.4G", "40M", "HT", "2T", "07", "40", - "MKK", "2.4G", "40M", "HT", "2T", "07", "40", - "FCC", "2.4G", "40M", "HT", "2T", "08", "46", - "ETSI", "2.4G", "40M", "HT", "2T", "08", "40", - "MKK", "2.4G", "40M", "HT", "2T", "08", "40", - "FCC", "2.4G", "40M", "HT", "2T", "09", "46", - "ETSI", "2.4G", "40M", "HT", "2T", "09", "40", - "MKK", "2.4G", "40M", "HT", "2T", "09", "40", - "FCC", "2.4G", "40M", "HT", "2T", "10", "46", - "ETSI", "2.4G", "40M", "HT", "2T", "10", "40", - "MKK", "2.4G", "40M", "HT", "2T", "10", "40", - "FCC", "2.4G", "40M", "HT", "2T", "11", "46", - "ETSI", "2.4G", "40M", "HT", "2T", "11", "40", - "MKK", "2.4G", "40M", "HT", "2T", "11", "40", - "FCC", "2.4G", "40M", "HT", "2T", "12", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "12", "40", - "MKK", "2.4G", "40M", "HT", "2T", "12", "40", - "FCC", "2.4G", "40M", "HT", "2T", "13", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "13", "40", - "MKK", "2.4G", "40M", "HT", "2T", "13", "40", - "FCC", "2.4G", "40M", "HT", "2T", "14", "63", - "ETSI", "2.4G", "40M", "HT", "2T", "14", "63", - "MKK", "2.4G", "40M", "HT", "2T", "14", "63", - "FCC", "2.4G", "40M", "HT", "3T", "01", "63", - "ETSI", "2.4G", "40M", "HT", "3T", "01", "63", - "MKK", "2.4G", "40M", "HT", "3T", "01", "63", - "FCC", "2.4G", "40M", "HT", "3T", "02", "63", - "ETSI", "2.4G", "40M", "HT", "3T", "02", "63", - "MKK", "2.4G", "40M", "HT", "3T", "02", "63", - "FCC", "2.4G", "40M", "HT", "3T", "03", "46", - "ETSI", "2.4G", "40M", "HT", "3T", "03", "40", - "MKK", "2.4G", "40M", "HT", "3T", "03", "40", - "FCC", "2.4G", "40M", "HT", "3T", "04", "46", - "ETSI", "2.4G", "40M", "HT", "3T", "04", "40", - "MKK", "2.4G", "40M", "HT", "3T", "04", "40", - "FCC", "2.4G", "40M", "HT", "3T", "05", "46", - "ETSI", "2.4G", "40M", "HT", "3T", "05", "40", - "MKK", "2.4G", "40M", "HT", "3T", "05", "40", - "FCC", "2.4G", "40M", "HT", "3T", "06", "46", - "ETSI", "2.4G", "40M", "HT", "3T", "06", "40", - "MKK", "2.4G", "40M", "HT", "3T", "06", "40", - "FCC", "2.4G", "40M", "HT", "3T", "07", "46", - "ETSI", "2.4G", "40M", "HT", "3T", "07", "40", - "MKK", "2.4G", "40M", "HT", "3T", "07", "40", - "FCC", "2.4G", "40M", "HT", "3T", "08", "46", - "ETSI", "2.4G", "40M", "HT", "3T", "08", "40", - "MKK", "2.4G", "40M", "HT", "3T", "08", "40", - "FCC", "2.4G", "40M", "HT", "3T", "09", "46", - "ETSI", "2.4G", "40M", "HT", "3T", "09", "40", - "MKK", "2.4G", "40M", "HT", "3T", "09", "40", - "FCC", "2.4G", "40M", "HT", "3T", "10", "46", - "ETSI", "2.4G", "40M", "HT", "3T", "10", "40", - "MKK", "2.4G", "40M", "HT", "3T", "10", "40", - "FCC", "2.4G", "40M", "HT", "3T", "11", "46", - "ETSI", "2.4G", "40M", "HT", "3T", "11", "40", - "MKK", "2.4G", "40M", "HT", "3T", "11", "40", - "FCC", "2.4G", "40M", "HT", "3T", "12", "63", - "ETSI", "2.4G", "40M", "HT", "3T", "12", "40", - "MKK", "2.4G", "40M", "HT", "3T", "12", "40", - "FCC", "2.4G", "40M", "HT", "3T", "13", "63", - "ETSI", "2.4G", "40M", "HT", "3T", "13", "40", - "MKK", "2.4G", "40M", "HT", "3T", "13", "40", - "FCC", "2.4G", "40M", "HT", "3T", "14", "63", - "ETSI", "2.4G", "40M", "HT", "3T", "14", "63", - "MKK", "2.4G", "40M", "HT", "3T", "14", "63", - "FCC", "2.4G", "40M", "HT", "4T", "01", "63", - "ETSI", "2.4G", "40M", "HT", "4T", "01", "63", - "MKK", "2.4G", "40M", "HT", "4T", "01", "63", - "FCC", "2.4G", "40M", "HT", "4T", "02", "63", - "ETSI", "2.4G", "40M", "HT", "4T", "02", "63", - "MKK", "2.4G", "40M", "HT", "4T", "02", "63", - "FCC", "2.4G", "40M", "HT", "4T", "03", "46", - "ETSI", "2.4G", "40M", "HT", "4T", "03", "40", - "MKK", "2.4G", "40M", "HT", "4T", "03", "40", - "FCC", "2.4G", "40M", "HT", "4T", "04", "46", - "ETSI", "2.4G", "40M", "HT", "4T", "04", "40", - "MKK", "2.4G", "40M", "HT", "4T", "04", "40", - "FCC", "2.4G", "40M", "HT", "4T", "05", "46", - "ETSI", "2.4G", "40M", "HT", "4T", "05", "40", - "MKK", "2.4G", "40M", "HT", "4T", "05", "40", - "FCC", "2.4G", "40M", "HT", "4T", "06", "46", - "ETSI", "2.4G", "40M", "HT", "4T", "06", "40", - "MKK", "2.4G", "40M", "HT", "4T", "06", "40", - "FCC", "2.4G", "40M", "HT", "4T", "07", "46", - "ETSI", "2.4G", "40M", "HT", "4T", "07", "40", - "MKK", "2.4G", "40M", "HT", "4T", "07", "40", - "FCC", "2.4G", "40M", "HT", "4T", "08", "46", - "ETSI", "2.4G", "40M", "HT", "4T", "08", "40", - "MKK", "2.4G", "40M", "HT", "4T", "08", "40", - "FCC", "2.4G", "40M", "HT", "4T", "09", "46", - "ETSI", "2.4G", "40M", "HT", "4T", "09", "40", - "MKK", "2.4G", "40M", "HT", "4T", "09", "40", - "FCC", "2.4G", "40M", "HT", "4T", "10", "46", - "ETSI", "2.4G", "40M", "HT", "4T", "10", "40", - "MKK", "2.4G", "40M", "HT", "4T", "10", "40", - "FCC", "2.4G", "40M", "HT", "4T", "11", "46", - "ETSI", "2.4G", "40M", "HT", "4T", "11", "40", - "MKK", "2.4G", "40M", "HT", "4T", "11", "40", - "FCC", "2.4G", "40M", "HT", "4T", "12", "63", - "ETSI", "2.4G", "40M", "HT", "4T", "12", "40", - "MKK", "2.4G", "40M", "HT", "4T", "12", "40", - "FCC", "2.4G", "40M", "HT", "4T", "13", "63", - "ETSI", "2.4G", "40M", "HT", "4T", "13", "40", - "MKK", "2.4G", "40M", "HT", "4T", "13", "40", - "FCC", "2.4G", "40M", "HT", "4T", "14", "63", - "ETSI", "2.4G", "40M", "HT", "4T", "14", "63", - "MKK", "2.4G", "40M", "HT", "4T", "14", "63", - "FCC", "5G", "20M", "OFDM", "1T", "36", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "36", "40", - "MKK", "5G", "20M", "OFDM", "1T", "36", "40", - "FCC", "5G", "20M", "OFDM", "1T", "40", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "40", "40", - "MKK", "5G", "20M", "OFDM", "1T", "40", "40", - "FCC", "5G", "20M", "OFDM", "1T", "44", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "44", "40", - "MKK", "5G", "20M", "OFDM", "1T", "44", "40", - "FCC", "5G", "20M", "OFDM", "1T", "48", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "48", "40", - "MKK", "5G", "20M", "OFDM", "1T", "48", "40", - "FCC", "5G", "20M", "OFDM", "1T", "52", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "52", "40", - "MKK", "5G", "20M", "OFDM", "1T", "52", "40", - "FCC", "5G", "20M", "OFDM", "1T", "56", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "56", "40", - "MKK", "5G", "20M", "OFDM", "1T", "56", "40", - "FCC", "5G", "20M", "OFDM", "1T", "60", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "60", "40", - "MKK", "5G", "20M", "OFDM", "1T", "60", "40", - "FCC", "5G", "20M", "OFDM", "1T", "64", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "64", "40", - "MKK", "5G", "20M", "OFDM", "1T", "64", "40", - "FCC", "5G", "20M", "OFDM", "1T", "100", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "100", "40", - "MKK", "5G", "20M", "OFDM", "1T", "100", "40", - "FCC", "5G", "20M", "OFDM", "1T", "104", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "104", "40", - "MKK", "5G", "20M", "OFDM", "1T", "104", "40", - "FCC", "5G", "20M", "OFDM", "1T", "108", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "108", "40", - "MKK", "5G", "20M", "OFDM", "1T", "108", "40", - "FCC", "5G", "20M", "OFDM", "1T", "112", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "112", "40", - "MKK", "5G", "20M", "OFDM", "1T", "112", "40", - "FCC", "5G", "20M", "OFDM", "1T", "116", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "116", "40", - "MKK", "5G", "20M", "OFDM", "1T", "116", "40", - "FCC", "5G", "20M", "OFDM", "1T", "120", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "120", "40", - "MKK", "5G", "20M", "OFDM", "1T", "120", "40", - "FCC", "5G", "20M", "OFDM", "1T", "124", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "124", "40", - "MKK", "5G", "20M", "OFDM", "1T", "124", "40", - "FCC", "5G", "20M", "OFDM", "1T", "128", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "128", "40", - "MKK", "5G", "20M", "OFDM", "1T", "128", "40", - "FCC", "5G", "20M", "OFDM", "1T", "132", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "132", "40", - "MKK", "5G", "20M", "OFDM", "1T", "132", "40", - "FCC", "5G", "20M", "OFDM", "1T", "136", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "136", "40", - "MKK", "5G", "20M", "OFDM", "1T", "136", "40", - "FCC", "5G", "20M", "OFDM", "1T", "140", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "140", "40", - "MKK", "5G", "20M", "OFDM", "1T", "140", "40", - "FCC", "5G", "20M", "OFDM", "1T", "149", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "149", "40", - "MKK", "5G", "20M", "OFDM", "1T", "149", "63", - "FCC", "5G", "20M", "OFDM", "1T", "153", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "153", "40", - "MKK", "5G", "20M", "OFDM", "1T", "153", "63", - "FCC", "5G", "20M", "OFDM", "1T", "157", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "157", "40", - "MKK", "5G", "20M", "OFDM", "1T", "157", "63", - "FCC", "5G", "20M", "OFDM", "1T", "161", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "161", "40", - "MKK", "5G", "20M", "OFDM", "1T", "161", "63", - "FCC", "5G", "20M", "OFDM", "1T", "165", "46", - "ETSI", "5G", "20M", "OFDM", "1T", "165", "40", - "MKK", "5G", "20M", "OFDM", "1T", "165", "63", - "FCC", "5G", "20M", "HT", "1T", "36", "46", - "ETSI", "5G", "20M", "HT", "1T", "36", "40", - "MKK", "5G", "20M", "HT", "1T", "36", "40", - "FCC", "5G", "20M", "HT", "1T", "40", "46", - "ETSI", "5G", "20M", "HT", "1T", "40", "40", - "MKK", "5G", "20M", "HT", "1T", "40", "40", - "FCC", "5G", "20M", "HT", "1T", "44", "46", - "ETSI", "5G", "20M", "HT", "1T", "44", "40", - "MKK", "5G", "20M", "HT", "1T", "44", "40", - "FCC", "5G", "20M", "HT", "1T", "48", "46", - "ETSI", "5G", "20M", "HT", "1T", "48", "40", - "MKK", "5G", "20M", "HT", "1T", "48", "40", - "FCC", "5G", "20M", "HT", "1T", "52", "46", - "ETSI", "5G", "20M", "HT", "1T", "52", "40", - "MKK", "5G", "20M", "HT", "1T", "52", "40", - "FCC", "5G", "20M", "HT", "1T", "56", "46", - "ETSI", "5G", "20M", "HT", "1T", "56", "40", - "MKK", "5G", "20M", "HT", "1T", "56", "40", - "FCC", "5G", "20M", "HT", "1T", "60", "46", - "ETSI", "5G", "20M", "HT", "1T", "60", "40", - "MKK", "5G", "20M", "HT", "1T", "60", "40", - "FCC", "5G", "20M", "HT", "1T", "64", "46", - "ETSI", "5G", "20M", "HT", "1T", "64", "40", - "MKK", "5G", "20M", "HT", "1T", "64", "40", - "FCC", "5G", "20M", "HT", "1T", "100", "46", - "ETSI", "5G", "20M", "HT", "1T", "100", "40", - "MKK", "5G", "20M", "HT", "1T", "100", "40", - "FCC", "5G", "20M", "HT", "1T", "104", "46", - "ETSI", "5G", "20M", "HT", "1T", "104", "40", - "MKK", "5G", "20M", "HT", "1T", "104", "40", - "FCC", "5G", "20M", "HT", "1T", "108", "46", - "ETSI", "5G", "20M", "HT", "1T", "108", "40", - "MKK", "5G", "20M", "HT", "1T", "108", "40", - "FCC", "5G", "20M", "HT", "1T", "112", "46", - "ETSI", "5G", "20M", "HT", "1T", "112", "40", - "MKK", "5G", "20M", "HT", "1T", "112", "40", - "FCC", "5G", "20M", "HT", "1T", "116", "46", - "ETSI", "5G", "20M", "HT", "1T", "116", "40", - "MKK", "5G", "20M", "HT", "1T", "116", "40", - "FCC", "5G", "20M", "HT", "1T", "120", "46", - "ETSI", "5G", "20M", "HT", "1T", "120", "40", - "MKK", "5G", "20M", "HT", "1T", "120", "40", - "FCC", "5G", "20M", "HT", "1T", "124", "46", - "ETSI", "5G", "20M", "HT", "1T", "124", "40", - "MKK", "5G", "20M", "HT", "1T", "124", "40", - "FCC", "5G", "20M", "HT", "1T", "128", "46", - "ETSI", "5G", "20M", "HT", "1T", "128", "40", - "MKK", "5G", "20M", "HT", "1T", "128", "40", - "FCC", "5G", "20M", "HT", "1T", "132", "46", - "ETSI", "5G", "20M", "HT", "1T", "132", "40", - "MKK", "5G", "20M", "HT", "1T", "132", "40", - "FCC", "5G", "20M", "HT", "1T", "136", "46", - "ETSI", "5G", "20M", "HT", "1T", "136", "40", - "MKK", "5G", "20M", "HT", "1T", "136", "40", - "FCC", "5G", "20M", "HT", "1T", "140", "46", - "ETSI", "5G", "20M", "HT", "1T", "140", "40", - "MKK", "5G", "20M", "HT", "1T", "140", "40", - "FCC", "5G", "20M", "HT", "1T", "149", "46", - "ETSI", "5G", "20M", "HT", "1T", "149", "40", - "MKK", "5G", "20M", "HT", "1T", "149", "63", - "FCC", "5G", "20M", "HT", "1T", "153", "46", - "ETSI", "5G", "20M", "HT", "1T", "153", "40", - "MKK", "5G", "20M", "HT", "1T", "153", "63", - "FCC", "5G", "20M", "HT", "1T", "157", "46", - "ETSI", "5G", "20M", "HT", "1T", "157", "40", - "MKK", "5G", "20M", "HT", "1T", "157", "63", - "FCC", "5G", "20M", "HT", "1T", "161", "46", - "ETSI", "5G", "20M", "HT", "1T", "161", "40", - "MKK", "5G", "20M", "HT", "1T", "161", "63", - "FCC", "5G", "20M", "HT", "1T", "165", "46", - "ETSI", "5G", "20M", "HT", "1T", "165", "40", - "MKK", "5G", "20M", "HT", "1T", "165", "63", - "FCC", "5G", "20M", "HT", "2T", "36", "46", - "ETSI", "5G", "20M", "HT", "2T", "36", "40", - "MKK", "5G", "20M", "HT", "2T", "36", "40", - "FCC", "5G", "20M", "HT", "2T", "40", "46", - "ETSI", "5G", "20M", "HT", "2T", "40", "40", - "MKK", "5G", "20M", "HT", "2T", "40", "40", - "FCC", "5G", "20M", "HT", "2T", "44", "46", - "ETSI", "5G", "20M", "HT", "2T", "44", "40", - "MKK", "5G", "20M", "HT", "2T", "44", "40", - "FCC", "5G", "20M", "HT", "2T", "48", "46", - "ETSI", "5G", "20M", "HT", "2T", "48", "40", - "MKK", "5G", "20M", "HT", "2T", "48", "40", - "FCC", "5G", "20M", "HT", "2T", "52", "46", - "ETSI", "5G", "20M", "HT", "2T", "52", "40", - "MKK", "5G", "20M", "HT", "2T", "52", "40", - "FCC", "5G", "20M", "HT", "2T", "56", "46", - "ETSI", "5G", "20M", "HT", "2T", "56", "40", - "MKK", "5G", "20M", "HT", "2T", "56", "40", - "FCC", "5G", "20M", "HT", "2T", "60", "46", - "ETSI", "5G", "20M", "HT", "2T", "60", "40", - "MKK", "5G", "20M", "HT", "2T", "60", "40", - "FCC", "5G", "20M", "HT", "2T", "64", "46", - "ETSI", "5G", "20M", "HT", "2T", "64", "40", - "MKK", "5G", "20M", "HT", "2T", "64", "40", - "FCC", "5G", "20M", "HT", "2T", "100", "46", - "ETSI", "5G", "20M", "HT", "2T", "100", "40", - "MKK", "5G", "20M", "HT", "2T", "100", "40", - "FCC", "5G", "20M", "HT", "2T", "104", "46", - "ETSI", "5G", "20M", "HT", "2T", "104", "40", - "MKK", "5G", "20M", "HT", "2T", "104", "40", - "FCC", "5G", "20M", "HT", "2T", "108", "46", - "ETSI", "5G", "20M", "HT", "2T", "108", "40", - "MKK", "5G", "20M", "HT", "2T", "108", "40", - "FCC", "5G", "20M", "HT", "2T", "112", "46", - "ETSI", "5G", "20M", "HT", "2T", "112", "40", - "MKK", "5G", "20M", "HT", "2T", "112", "40", - "FCC", "5G", "20M", "HT", "2T", "116", "46", - "ETSI", "5G", "20M", "HT", "2T", "116", "40", - "MKK", "5G", "20M", "HT", "2T", "116", "40", - "FCC", "5G", "20M", "HT", "2T", "120", "46", - "ETSI", "5G", "20M", "HT", "2T", "120", "40", - "MKK", "5G", "20M", "HT", "2T", "120", "40", - "FCC", "5G", "20M", "HT", "2T", "124", "46", - "ETSI", "5G", "20M", "HT", "2T", "124", "40", - "MKK", "5G", "20M", "HT", "2T", "124", "40", - "FCC", "5G", "20M", "HT", "2T", "128", "46", - "ETSI", "5G", "20M", "HT", "2T", "128", "40", - "MKK", "5G", "20M", "HT", "2T", "128", "40", - "FCC", "5G", "20M", "HT", "2T", "132", "46", - "ETSI", "5G", "20M", "HT", "2T", "132", "40", - "MKK", "5G", "20M", "HT", "2T", "132", "40", - "FCC", "5G", "20M", "HT", "2T", "136", "46", - "ETSI", "5G", "20M", "HT", "2T", "136", "40", - "MKK", "5G", "20M", "HT", "2T", "136", "40", - "FCC", "5G", "20M", "HT", "2T", "140", "46", - "ETSI", "5G", "20M", "HT", "2T", "140", "40", - "MKK", "5G", "20M", "HT", "2T", "140", "40", - "FCC", "5G", "20M", "HT", "2T", "149", "46", - "ETSI", "5G", "20M", "HT", "2T", "149", "40", - "MKK", "5G", "20M", "HT", "2T", "149", "63", - "FCC", "5G", "20M", "HT", "2T", "153", "46", - "ETSI", "5G", "20M", "HT", "2T", "153", "40", - "MKK", "5G", "20M", "HT", "2T", "153", "63", - "FCC", "5G", "20M", "HT", "2T", "157", "46", - "ETSI", "5G", "20M", "HT", "2T", "157", "40", - "MKK", "5G", "20M", "HT", "2T", "157", "63", - "FCC", "5G", "20M", "HT", "2T", "161", "46", - "ETSI", "5G", "20M", "HT", "2T", "161", "40", - "MKK", "5G", "20M", "HT", "2T", "161", "63", - "FCC", "5G", "20M", "HT", "2T", "165", "46", - "ETSI", "5G", "20M", "HT", "2T", "165", "40", - "MKK", "5G", "20M", "HT", "2T", "165", "63", - "FCC", "5G", "20M", "HT", "3T", "36", "46", - "ETSI", "5G", "20M", "HT", "3T", "36", "40", - "MKK", "5G", "20M", "HT", "3T", "36", "40", - "FCC", "5G", "20M", "HT", "3T", "40", "46", - "ETSI", "5G", "20M", "HT", "3T", "40", "40", - "MKK", "5G", "20M", "HT", "3T", "40", "40", - "FCC", "5G", "20M", "HT", "3T", "44", "46", - "ETSI", "5G", "20M", "HT", "3T", "44", "40", - "MKK", "5G", "20M", "HT", "3T", "44", "40", - "FCC", "5G", "20M", "HT", "3T", "48", "46", - "ETSI", "5G", "20M", "HT", "3T", "48", "40", - "MKK", "5G", "20M", "HT", "3T", "48", "40", - "FCC", "5G", "20M", "HT", "3T", "52", "46", - "ETSI", "5G", "20M", "HT", "3T", "52", "40", - "MKK", "5G", "20M", "HT", "3T", "52", "40", - "FCC", "5G", "20M", "HT", "3T", "56", "46", - "ETSI", "5G", "20M", "HT", "3T", "56", "40", - "MKK", "5G", "20M", "HT", "3T", "56", "40", - "FCC", "5G", "20M", "HT", "3T", "60", "46", - "ETSI", "5G", "20M", "HT", "3T", "60", "40", - "MKK", "5G", "20M", "HT", "3T", "60", "40", - "FCC", "5G", "20M", "HT", "3T", "64", "46", - "ETSI", "5G", "20M", "HT", "3T", "64", "40", - "MKK", "5G", "20M", "HT", "3T", "64", "40", - "FCC", "5G", "20M", "HT", "3T", "100", "46", - "ETSI", "5G", "20M", "HT", "3T", "100", "40", - "MKK", "5G", "20M", "HT", "3T", "100", "40", - "FCC", "5G", "20M", "HT", "3T", "104", "46", - "ETSI", "5G", "20M", "HT", "3T", "104", "40", - "MKK", "5G", "20M", "HT", "3T", "104", "40", - "FCC", "5G", "20M", "HT", "3T", "108", "46", - "ETSI", "5G", "20M", "HT", "3T", "108", "40", - "MKK", "5G", "20M", "HT", "3T", "108", "40", - "FCC", "5G", "20M", "HT", "3T", "112", "46", - "ETSI", "5G", "20M", "HT", "3T", "112", "40", - "MKK", "5G", "20M", "HT", "3T", "112", "40", - "FCC", "5G", "20M", "HT", "3T", "116", "46", - "ETSI", "5G", "20M", "HT", "3T", "116", "40", - "MKK", "5G", "20M", "HT", "3T", "116", "40", - "FCC", "5G", "20M", "HT", "3T", "120", "46", - "ETSI", "5G", "20M", "HT", "3T", "120", "40", - "MKK", "5G", "20M", "HT", "3T", "120", "40", - "FCC", "5G", "20M", "HT", "3T", "124", "46", - "ETSI", "5G", "20M", "HT", "3T", "124", "40", - "MKK", "5G", "20M", "HT", "3T", "124", "40", - "FCC", "5G", "20M", "HT", "3T", "128", "46", - "ETSI", "5G", "20M", "HT", "3T", "128", "40", - "MKK", "5G", "20M", "HT", "3T", "128", "40", - "FCC", "5G", "20M", "HT", "3T", "132", "46", - "ETSI", "5G", "20M", "HT", "3T", "132", "40", - "MKK", "5G", "20M", "HT", "3T", "132", "40", - "FCC", "5G", "20M", "HT", "3T", "136", "46", - "ETSI", "5G", "20M", "HT", "3T", "136", "40", - "MKK", "5G", "20M", "HT", "3T", "136", "40", - "FCC", "5G", "20M", "HT", "3T", "140", "46", - "ETSI", "5G", "20M", "HT", "3T", "140", "40", - "MKK", "5G", "20M", "HT", "3T", "140", "40", - "FCC", "5G", "20M", "HT", "3T", "149", "46", - "ETSI", "5G", "20M", "HT", "3T", "149", "40", - "MKK", "5G", "20M", "HT", "3T", "149", "63", - "FCC", "5G", "20M", "HT", "3T", "153", "46", - "ETSI", "5G", "20M", "HT", "3T", "153", "40", - "MKK", "5G", "20M", "HT", "3T", "153", "63", - "FCC", "5G", "20M", "HT", "3T", "157", "46", - "ETSI", "5G", "20M", "HT", "3T", "157", "40", - "MKK", "5G", "20M", "HT", "3T", "157", "63", - "FCC", "5G", "20M", "HT", "3T", "161", "46", - "ETSI", "5G", "20M", "HT", "3T", "161", "40", - "MKK", "5G", "20M", "HT", "3T", "161", "63", - "FCC", "5G", "20M", "HT", "3T", "165", "46", - "ETSI", "5G", "20M", "HT", "3T", "165", "40", - "MKK", "5G", "20M", "HT", "3T", "165", "63", - "FCC", "5G", "20M", "HT", "4T", "36", "46", - "ETSI", "5G", "20M", "HT", "4T", "36", "40", - "MKK", "5G", "20M", "HT", "4T", "36", "40", - "FCC", "5G", "20M", "HT", "4T", "40", "46", - "ETSI", "5G", "20M", "HT", "4T", "40", "40", - "MKK", "5G", "20M", "HT", "4T", "40", "40", - "FCC", "5G", "20M", "HT", "4T", "44", "46", - "ETSI", "5G", "20M", "HT", "4T", "44", "40", - "MKK", "5G", "20M", "HT", "4T", "44", "40", - "FCC", "5G", "20M", "HT", "4T", "48", "46", - "ETSI", "5G", "20M", "HT", "4T", "48", "40", - "MKK", "5G", "20M", "HT", "4T", "48", "40", - "FCC", "5G", "20M", "HT", "4T", "52", "46", - "ETSI", "5G", "20M", "HT", "4T", "52", "40", - "MKK", "5G", "20M", "HT", "4T", "52", "40", - "FCC", "5G", "20M", "HT", "4T", "56", "46", - "ETSI", "5G", "20M", "HT", "4T", "56", "40", - "MKK", "5G", "20M", "HT", "4T", "56", "40", - "FCC", "5G", "20M", "HT", "4T", "60", "46", - "ETSI", "5G", "20M", "HT", "4T", "60", "40", - "MKK", "5G", "20M", "HT", "4T", "60", "40", - "FCC", "5G", "20M", "HT", "4T", "64", "46", - "ETSI", "5G", "20M", "HT", "4T", "64", "40", - "MKK", "5G", "20M", "HT", "4T", "64", "40", - "FCC", "5G", "20M", "HT", "4T", "100", "46", - "ETSI", "5G", "20M", "HT", "4T", "100", "40", - "MKK", "5G", "20M", "HT", "4T", "100", "40", - "FCC", "5G", "20M", "HT", "4T", "104", "46", - "ETSI", "5G", "20M", "HT", "4T", "104", "40", - "MKK", "5G", "20M", "HT", "4T", "104", "40", - "FCC", "5G", "20M", "HT", "4T", "108", "46", - "ETSI", "5G", "20M", "HT", "4T", "108", "40", - "MKK", "5G", "20M", "HT", "4T", "108", "40", - "FCC", "5G", "20M", "HT", "4T", "112", "46", - "ETSI", "5G", "20M", "HT", "4T", "112", "40", - "MKK", "5G", "20M", "HT", "4T", "112", "40", - "FCC", "5G", "20M", "HT", "4T", "116", "46", - "ETSI", "5G", "20M", "HT", "4T", "116", "40", - "MKK", "5G", "20M", "HT", "4T", "116", "40", - "FCC", "5G", "20M", "HT", "4T", "120", "46", - "ETSI", "5G", "20M", "HT", "4T", "120", "40", - "MKK", "5G", "20M", "HT", "4T", "120", "40", - "FCC", "5G", "20M", "HT", "4T", "124", "46", - "ETSI", "5G", "20M", "HT", "4T", "124", "40", - "MKK", "5G", "20M", "HT", "4T", "124", "40", - "FCC", "5G", "20M", "HT", "4T", "128", "46", - "ETSI", "5G", "20M", "HT", "4T", "128", "40", - "MKK", "5G", "20M", "HT", "4T", "128", "40", - "FCC", "5G", "20M", "HT", "4T", "132", "46", - "ETSI", "5G", "20M", "HT", "4T", "132", "40", - "MKK", "5G", "20M", "HT", "4T", "132", "40", - "FCC", "5G", "20M", "HT", "4T", "136", "46", - "ETSI", "5G", "20M", "HT", "4T", "136", "40", - "MKK", "5G", "20M", "HT", "4T", "136", "40", - "FCC", "5G", "20M", "HT", "4T", "140", "46", - "ETSI", "5G", "20M", "HT", "4T", "140", "40", - "MKK", "5G", "20M", "HT", "4T", "140", "40", - "FCC", "5G", "20M", "HT", "4T", "149", "46", - "ETSI", "5G", "20M", "HT", "4T", "149", "40", - "MKK", "5G", "20M", "HT", "4T", "149", "63", - "FCC", "5G", "20M", "HT", "4T", "153", "46", - "ETSI", "5G", "20M", "HT", "4T", "153", "40", - "MKK", "5G", "20M", "HT", "4T", "153", "63", - "FCC", "5G", "20M", "HT", "4T", "157", "46", - "ETSI", "5G", "20M", "HT", "4T", "157", "40", - "MKK", "5G", "20M", "HT", "4T", "157", "63", - "FCC", "5G", "20M", "HT", "4T", "161", "46", - "ETSI", "5G", "20M", "HT", "4T", "161", "40", - "MKK", "5G", "20M", "HT", "4T", "161", "63", - "FCC", "5G", "20M", "HT", "4T", "165", "46", - "ETSI", "5G", "20M", "HT", "4T", "165", "40", - "MKK", "5G", "20M", "HT", "4T", "165", "63", - "FCC", "5G", "40M", "HT", "1T", "38", "46", - "ETSI", "5G", "40M", "HT", "1T", "38", "40", - "MKK", "5G", "40M", "HT", "1T", "38", "40", - "FCC", "5G", "40M", "HT", "1T", "46", "46", - "ETSI", "5G", "40M", "HT", "1T", "46", "40", - "MKK", "5G", "40M", "HT", "1T", "46", "40", - "FCC", "5G", "40M", "HT", "1T", "54", "46", - "ETSI", "5G", "40M", "HT", "1T", "54", "40", - "MKK", "5G", "40M", "HT", "1T", "54", "40", - "FCC", "5G", "40M", "HT", "1T", "62", "46", - "ETSI", "5G", "40M", "HT", "1T", "62", "40", - "MKK", "5G", "40M", "HT", "1T", "62", "40", - "FCC", "5G", "40M", "HT", "1T", "102", "46", - "ETSI", "5G", "40M", "HT", "1T", "102", "40", - "MKK", "5G", "40M", "HT", "1T", "102", "40", - "FCC", "5G", "40M", "HT", "1T", "110", "46", - "ETSI", "5G", "40M", "HT", "1T", "110", "40", - "MKK", "5G", "40M", "HT", "1T", "110", "40", - "FCC", "5G", "40M", "HT", "1T", "118", "46", - "ETSI", "5G", "40M", "HT", "1T", "118", "40", - "MKK", "5G", "40M", "HT", "1T", "118", "40", - "FCC", "5G", "40M", "HT", "1T", "126", "46", - "ETSI", "5G", "40M", "HT", "1T", "126", "40", - "MKK", "5G", "40M", "HT", "1T", "126", "40", - "FCC", "5G", "40M", "HT", "1T", "134", "46", - "ETSI", "5G", "40M", "HT", "1T", "134", "40", - "MKK", "5G", "40M", "HT", "1T", "134", "40", - "FCC", "5G", "40M", "HT", "1T", "151", "46", - "ETSI", "5G", "40M", "HT", "1T", "151", "40", - "MKK", "5G", "40M", "HT", "1T", "151", "63", - "FCC", "5G", "40M", "HT", "1T", "159", "46", - "ETSI", "5G", "40M", "HT", "1T", "159", "40", - "MKK", "5G", "40M", "HT", "1T", "159", "63", - "FCC", "5G", "40M", "HT", "2T", "38", "46", - "ETSI", "5G", "40M", "HT", "2T", "38", "40", - "MKK", "5G", "40M", "HT", "2T", "38", "40", - "FCC", "5G", "40M", "HT", "2T", "46", "46", - "ETSI", "5G", "40M", "HT", "2T", "46", "40", - "MKK", "5G", "40M", "HT", "2T", "46", "40", - "FCC", "5G", "40M", "HT", "2T", "54", "46", - "ETSI", "5G", "40M", "HT", "2T", "54", "40", - "MKK", "5G", "40M", "HT", "2T", "54", "40", - "FCC", "5G", "40M", "HT", "2T", "62", "46", - "ETSI", "5G", "40M", "HT", "2T", "62", "40", - "MKK", "5G", "40M", "HT", "2T", "62", "40", - "FCC", "5G", "40M", "HT", "2T", "102", "46", - "ETSI", "5G", "40M", "HT", "2T", "102", "40", - "MKK", "5G", "40M", "HT", "2T", "102", "40", - "FCC", "5G", "40M", "HT", "2T", "110", "46", - "ETSI", "5G", "40M", "HT", "2T", "110", "40", - "MKK", "5G", "40M", "HT", "2T", "110", "40", - "FCC", "5G", "40M", "HT", "2T", "118", "46", - "ETSI", "5G", "40M", "HT", "2T", "118", "40", - "MKK", "5G", "40M", "HT", "2T", "118", "40", - "FCC", "5G", "40M", "HT", "2T", "126", "46", - "ETSI", "5G", "40M", "HT", "2T", "126", "40", - "MKK", "5G", "40M", "HT", "2T", "126", "40", - "FCC", "5G", "40M", "HT", "2T", "134", "46", - "ETSI", "5G", "40M", "HT", "2T", "134", "40", - "MKK", "5G", "40M", "HT", "2T", "134", "40", - "FCC", "5G", "40M", "HT", "2T", "151", "46", - "ETSI", "5G", "40M", "HT", "2T", "151", "40", - "MKK", "5G", "40M", "HT", "2T", "151", "63", - "FCC", "5G", "40M", "HT", "2T", "159", "46", - "ETSI", "5G", "40M", "HT", "2T", "159", "40", - "MKK", "5G", "40M", "HT", "2T", "159", "63", - "FCC", "5G", "40M", "HT", "3T", "38", "46", - "ETSI", "5G", "40M", "HT", "3T", "38", "40", - "MKK", "5G", "40M", "HT", "3T", "38", "40", - "FCC", "5G", "40M", "HT", "3T", "46", "46", - "ETSI", "5G", "40M", "HT", "3T", "46", "40", - "MKK", "5G", "40M", "HT", "3T", "46", "40", - "FCC", "5G", "40M", "HT", "3T", "54", "46", - "ETSI", "5G", "40M", "HT", "3T", "54", "40", - "MKK", "5G", "40M", "HT", "3T", "54", "40", - "FCC", "5G", "40M", "HT", "3T", "62", "46", - "ETSI", "5G", "40M", "HT", "3T", "62", "40", - "MKK", "5G", "40M", "HT", "3T", "62", "40", - "FCC", "5G", "40M", "HT", "3T", "102", "46", - "ETSI", "5G", "40M", "HT", "3T", "102", "40", - "MKK", "5G", "40M", "HT", "3T", "102", "40", - "FCC", "5G", "40M", "HT", "3T", "110", "46", - "ETSI", "5G", "40M", "HT", "3T", "110", "40", - "MKK", "5G", "40M", "HT", "3T", "110", "40", - "FCC", "5G", "40M", "HT", "3T", "118", "46", - "ETSI", "5G", "40M", "HT", "3T", "118", "40", - "MKK", "5G", "40M", "HT", "3T", "118", "40", - "FCC", "5G", "40M", "HT", "3T", "126", "46", - "ETSI", "5G", "40M", "HT", "3T", "126", "40", - "MKK", "5G", "40M", "HT", "3T", "126", "40", - "FCC", "5G", "40M", "HT", "3T", "134", "46", - "ETSI", "5G", "40M", "HT", "3T", "134", "40", - "MKK", "5G", "40M", "HT", "3T", "134", "40", - "FCC", "5G", "40M", "HT", "3T", "151", "46", - "ETSI", "5G", "40M", "HT", "3T", "151", "40", - "MKK", "5G", "40M", "HT", "3T", "151", "63", - "FCC", "5G", "40M", "HT", "3T", "159", "46", - "ETSI", "5G", "40M", "HT", "3T", "159", "40", - "MKK", "5G", "40M", "HT", "3T", "159", "63", - "FCC", "5G", "40M", "HT", "4T", "38", "46", - "ETSI", "5G", "40M", "HT", "4T", "38", "40", - "MKK", "5G", "40M", "HT", "4T", "38", "40", - "FCC", "5G", "40M", "HT", "4T", "46", "46", - "ETSI", "5G", "40M", "HT", "4T", "46", "40", - "MKK", "5G", "40M", "HT", "4T", "46", "40", - "FCC", "5G", "40M", "HT", "4T", "54", "46", - "ETSI", "5G", "40M", "HT", "4T", "54", "40", - "MKK", "5G", "40M", "HT", "4T", "54", "40", - "FCC", "5G", "40M", "HT", "4T", "62", "46", - "ETSI", "5G", "40M", "HT", "4T", "62", "40", - "MKK", "5G", "40M", "HT", "4T", "62", "40", - "FCC", "5G", "40M", "HT", "4T", "102", "46", - "ETSI", "5G", "40M", "HT", "4T", "102", "40", - "MKK", "5G", "40M", "HT", "4T", "102", "40", - "FCC", "5G", "40M", "HT", "4T", "110", "46", - "ETSI", "5G", "40M", "HT", "4T", "110", "40", - "MKK", "5G", "40M", "HT", "4T", "110", "40", - "FCC", "5G", "40M", "HT", "4T", "118", "46", - "ETSI", "5G", "40M", "HT", "4T", "118", "40", - "MKK", "5G", "40M", "HT", "4T", "118", "40", - "FCC", "5G", "40M", "HT", "4T", "126", "46", - "ETSI", "5G", "40M", "HT", "4T", "126", "40", - "MKK", "5G", "40M", "HT", "4T", "126", "40", - "FCC", "5G", "40M", "HT", "4T", "134", "46", - "ETSI", "5G", "40M", "HT", "4T", "134", "40", - "MKK", "5G", "40M", "HT", "4T", "134", "40", - "FCC", "5G", "40M", "HT", "4T", "151", "46", - "ETSI", "5G", "40M", "HT", "4T", "151", "40", - "MKK", "5G", "40M", "HT", "4T", "151", "63", - "FCC", "5G", "40M", "HT", "4T", "159", "46", - "ETSI", "5G", "40M", "HT", "4T", "159", "40", - "MKK", "5G", "40M", "HT", "4T", "159", "63", - "FCC", "5G", "80M", "VHT", "1T", "42", "46", - "ETSI", "5G", "80M", "VHT", "1T", "42", "40", - "MKK", "5G", "80M", "VHT", "1T", "42", "40", - "FCC", "5G", "80M", "VHT", "1T", "58", "46", - "ETSI", "5G", "80M", "VHT", "1T", "58", "40", - "MKK", "5G", "80M", "VHT", "1T", "58", "40", - "FCC", "5G", "80M", "VHT", "1T", "106", "46", - "ETSI", "5G", "80M", "VHT", "1T", "106", "40", - "MKK", "5G", "80M", "VHT", "1T", "106", "40", - "FCC", "5G", "80M", "VHT", "1T", "122", "46", - "ETSI", "5G", "80M", "VHT", "1T", "122", "40", - "MKK", "5G", "80M", "VHT", "1T", "122", "40", - "FCC", "5G", "80M", "VHT", "1T", "155", "46", - "ETSI", "5G", "80M", "VHT", "1T", "155", "40", - "MKK", "5G", "80M", "VHT", "1T", "155", "63", - "FCC", "5G", "80M", "VHT", "2T", "42", "46", - "ETSI", "5G", "80M", "VHT", "2T", "42", "40", - "MKK", "5G", "80M", "VHT", "2T", "42", "40", - "FCC", "5G", "80M", "VHT", "2T", "58", "46", - "ETSI", "5G", "80M", "VHT", "2T", "58", "40", - "MKK", "5G", "80M", "VHT", "2T", "58", "40", - "FCC", "5G", "80M", "VHT", "2T", "106", "46", - "ETSI", "5G", "80M", "VHT", "2T", "106", "40", - "MKK", "5G", "80M", "VHT", "2T", "106", "40", - "FCC", "5G", "80M", "VHT", "2T", "122", "46", - "ETSI", "5G", "80M", "VHT", "2T", "122", "40", - "MKK", "5G", "80M", "VHT", "2T", "122", "40", - "FCC", "5G", "80M", "VHT", "2T", "155", "46", - "ETSI", "5G", "80M", "VHT", "2T", "155", "40", - "MKK", "5G", "80M", "VHT", "2T", "155", "63", - "FCC", "5G", "80M", "VHT", "3T", "42", "46", - "ETSI", "5G", "80M", "VHT", "3T", "42", "40", - "MKK", "5G", "80M", "VHT", "3T", "42", "40", - "FCC", "5G", "80M", "VHT", "3T", "58", "46", - "ETSI", "5G", "80M", "VHT", "3T", "58", "40", - "MKK", "5G", "80M", "VHT", "3T", "58", "40", - "FCC", "5G", "80M", "VHT", "3T", "106", "46", - "ETSI", "5G", "80M", "VHT", "3T", "106", "40", - "MKK", "5G", "80M", "VHT", "3T", "106", "40", - "FCC", "5G", "80M", "VHT", "3T", "122", "46", - "ETSI", "5G", "80M", "VHT", "3T", "122", "40", - "MKK", "5G", "80M", "VHT", "3T", "122", "40", - "FCC", "5G", "80M", "VHT", "3T", "155", "46", - "ETSI", "5G", "80M", "VHT", "3T", "155", "40", - "MKK", "5G", "80M", "VHT", "3T", "155", "63", - "FCC", "5G", "80M", "VHT", "4T", "42", "46", - "ETSI", "5G", "80M", "VHT", "4T", "42", "40", - "MKK", "5G", "80M", "VHT", "4T", "42", "40", - "FCC", "5G", "80M", "VHT", "4T", "58", "46", - "ETSI", "5G", "80M", "VHT", "4T", "58", "40", - "MKK", "5G", "80M", "VHT", "4T", "58", "40", - "FCC", "5G", "80M", "VHT", "4T", "106", "46", - "ETSI", "5G", "80M", "VHT", "4T", "106", "40", - "MKK", "5G", "80M", "VHT", "4T", "106", "40", - "FCC", "5G", "80M", "VHT", "4T", "122", "46", - "ETSI", "5G", "80M", "VHT", "4T", "122", "40", - "MKK", "5G", "80M", "VHT", "4T", "122", "40", - "FCC", "5G", "80M", "VHT", "4T", "155", "46", - "ETSI", "5G", "80M", "VHT", "4T", "155", "40", - "MKK", "5G", "80M", "VHT", "4T", "155", "63" -}; - - -void -_odm_read_and_config_mp_8814a_txpwr_lmt_type5( - struct dm_struct * pDM_Odm -) -{ - u4Byte i = 0; - u4Byte ArrayLen = sizeof(Array_MP_8814A_TXPWR_LMT_Type5)/sizeof(pu1Byte); - pu1Byte *Array = (pu1Byte *)Array_MP_8814A_TXPWR_LMT_Type5; - -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - PADAPTER Adapter = pDM_Odm->Adapter; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - PlatformZeroMemory(pHalData->BufOfLinesPwrLmt, MAX_LINES_HWCONFIG_TXT*MAX_BYTES_LINE_HWCONFIG_TXT); - pHalData->nLinesReadPwrLmt = ArrayLen/7; -#endif - - PHYDM_DBG(pDM_Odm, ODM_COMP_INIT, "===> ODM_ReadAndConfig_MP_8814A_TXPWR_LMT_Type5\n"); - - for (i = 0; i < ArrayLen; i += 7) { - pu1Byte regulation = Array[i]; - pu1Byte band = Array[i+1]; - pu1Byte bandwidth = Array[i+2]; - pu1Byte rate = Array[i+3]; - pu1Byte rfPath = Array[i+4]; - pu1Byte chnl = Array[i+5]; - pu1Byte val = Array[i+6]; - - odm_ConfigBB_TXPWR_LMT_8814A(pDM_Odm, regulation, band, bandwidth, rate, rfPath, chnl, val); -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - rsprintf((char *)pHalData->BufOfLinesPwrLmt[i/7], 100, "\"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\",", - regulation, band, bandwidth, rate, rfPath, chnl, val); -#endif - } - -} -*/ - -#endif /* end of HWIMG_SUPPORT*/ - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_rf.h b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_rf.h deleted file mode 100644 index 27707510ed6cfc..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/halhwimg8814a_rf.h +++ /dev/null @@ -1,149 +0,0 @@ -/****************************************************************************** -* -* Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., -* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA -* -* -******************************************************************************/ - -/*Image2HeaderVersion: 2.19*/ -#if (RTL8814A_SUPPORT == 1) -#ifndef __INC_MP_RF_HW_IMG_8814A_H -#define __INC_MP_RF_HW_IMG_8814A_H - - -/****************************************************************************** -* RadioA.TXT -******************************************************************************/ - -void -odm_read_and_config_mp_8814a_radioa(/* TC: Test Chip, MP: MP Chip*/ - struct dm_struct *pDM_Odm -); -u4Byte ODM_GetVersion_MP_8814A_RadioA(void); - -/****************************************************************************** -* RadioB.TXT -******************************************************************************/ - -void -odm_read_and_config_mp_8814a_radiob(/* TC: Test Chip, MP: MP Chip*/ - struct dm_struct *pDM_Odm -); -u4Byte ODM_GetVersion_MP_8814A_RadioB(void); - -/****************************************************************************** -* RadioC.TXT -******************************************************************************/ - -void -odm_read_and_config_mp_8814a_radioc(/* TC: Test Chip, MP: MP Chip*/ - struct dm_struct *pDM_Odm -); -u4Byte ODM_GetVersion_MP_8814A_RadioC(void); - -/****************************************************************************** -* RadioD.TXT -******************************************************************************/ - -void -odm_read_and_config_mp_8814a_radiod(/* TC: Test Chip, MP: MP Chip*/ - struct dm_struct *pDM_Odm -); -u4Byte ODM_GetVersion_MP_8814A_RadioD(void); - -/****************************************************************************** -* TxPowerTrack.TXT -******************************************************************************/ - -void -odm_read_and_config_mp_8814a_txpowertrack(/* TC: Test Chip, MP: MP Chip*/ - struct dm_struct *pDM_Odm -); -u4Byte ODM_GetVersion_MP_8814A_TxPowerTrack(void); - -/****************************************************************************** -* TxPowerTrack_Type0.TXT -******************************************************************************/ - -void -odm_read_and_config_mp_8814a_txpowertrack_type0(/* TC: Test Chip, MP: MP Chip*/ - struct dm_struct *pDM_Odm -); -u4Byte ODM_GetVersion_MP_8814A_TxPowerTrack_Type0(void); - -/****************************************************************************** -* TxPowerTrack_Type2.TXT -******************************************************************************/ - -void -odm_read_and_config_mp_8814a_txpowertrack_type2(/* TC: Test Chip, MP: MP Chip*/ - struct dm_struct *pDM_Odm -); -u4Byte ODM_GetVersion_MP_8814A_TxPowerTrack_Type2(void); - -/****************************************************************************** -* TxPowerTrack_Type5.TXT -******************************************************************************/ - -void -odm_read_and_config_mp_8814a_txpowertrack_type5(/* TC: Test Chip, MP: MP Chip*/ - struct dm_struct *pDM_Odm -); -u4Byte ODM_GetVersion_MP_8814A_TxPowerTrack_Type5(void); - -/****************************************************************************** -* TXPWR_LMT.TXT -******************************************************************************/ - -void -odm_read_and_config_mp_8814a_txpwr_lmt(/* TC: Test Chip, MP: MP Chip*/ - struct dm_struct *pDM_Odm -); -u4Byte ODM_GetVersion_MP_8814A_TXPWR_LMT(void); - -/****************************************************************************** -* TXPWR_LMT_type2.TXT -******************************************************************************/ - -void -odm_read_and_config_mp_8814a_txpwr_lmt_type2(/* TC: Test Chip, MP: MP Chip*/ - struct dm_struct *pDM_Odm -); -u4Byte ODM_GetVersion_MP_8814A_TXPWR_LMT_type2(void); - -/****************************************************************************** -* TXPWR_LMT_Type3.TXT -******************************************************************************/ - -void -odm_read_and_config_mp_8814a_txpwr_lmt_type3(/* TC: Test Chip, MP: MP Chip*/ - struct dm_struct *pDM_Odm -); -u4Byte ODM_GetVersion_MP_8814A_TXPWR_LMT_Type3(void); - -/****************************************************************************** -* TXPWR_LMT_Type5.TXT -******************************************************************************/ - -void -odm_read_and_config_mp_8814a_txpwr_lmt_type5(/* TC: Test Chip, MP: MP Chip*/ - struct dm_struct *pDM_Odm -); -u4Byte ODM_GetVersion_MP_8814A_TXPWR_LMT_Type5(void); - -#endif -#endif /* end of HWIMG_SUPPORT*/ - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_ap.c b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_ap.c deleted file mode 100644 index adf2cd9c66ccbe..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_ap.c +++ /dev/null @@ -1,1751 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -#if !defined(__ECOS) && !defined(CONFIG_COMPAT_WIRELESS) -#include "mp_precomp.h" -#else -#include "../mp_precomp.h" -#endif -#include "../phydm_precomp.h" - - - -/*---------------------------Define Local Constant---------------------------*/ -// 2010/04/25 MH Define the max tx power tracking tx agc power. -#define ODM_TXPWRTRACK_MAX_IDX8814A 6 - -/*---------------------------Define Local Constant---------------------------*/ - - -//3============================================================ -//3 Tx Power Tracking -//3============================================================ - -u8 -CheckRFGainOffset( - struct dm_struct *pDM_Odm, - PWRTRACK_METHOD Method, - u8 RFPath - ) -{ - s1Byte UpperBound = 10, LowerBound = -5; // 4'b1010 = 10 - s1Byte Final_RF_Index = 0; - BOOLEAN bPositive = FALSE; - u32 bitMask = 0; - u8 Final_OFDM_Swing_Index = 0, TxScalingUpperBound = 28, TxScalingLowerBound = 4;// upper bound +2dB, lower bound -9dB - PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - - if(Method == MIX_MODE) //normal Tx power tracking - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("is 8814 MP chip\n")); - bitMask = BIT19; - pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] = pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] + pRFCalibrateInfo->KfreeOffset[RFPath]; - - if( pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] >= 0) // check if RF_Index is positive or not - bPositive = TRUE; - else - bPositive = FALSE; - - ODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, bPositive); - - bitMask = BIT18|BIT17|BIT16|BIT15; - Final_RF_Index = pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] / 2; /*TxBB 1 step equal 1dB, BB swing 1step equal 0.5dB*/ - - } - - if(Final_RF_Index > UpperBound) //Upper bound = 10dB, if more htan upper bound, then move to bb swing max = +2dB - { - ODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, UpperBound); //set RF Reg0x55 per path - - Final_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex + (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] - (UpperBound << 1)); - - if(Final_OFDM_Swing_Index > TxScalingUpperBound) // bb swing upper bound = +2dB - Final_OFDM_Swing_Index = TxScalingUpperBound; - - return Final_OFDM_Swing_Index; - } - else if(Final_RF_Index < LowerBound) // lower bound = -5dB - { - ODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, (-1)*(LowerBound)); //set RF Reg0x55 per path - - Final_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex - ((LowerBound<<1) - pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath]); - - if(Final_OFDM_Swing_Index < TxScalingLowerBound) // bb swing lower bound = -10dB - Final_OFDM_Swing_Index = TxScalingLowerBound; - return Final_OFDM_Swing_Index; - } - else // normal case - { - - if(bPositive == TRUE) - ODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, Final_RF_Index); //set RF Reg0x55 per path - else - ODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, bitMask, (-1)*Final_RF_Index); //set RF Reg0x55 per path - - Final_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex + (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath])%2; - return Final_OFDM_Swing_Index; - } - - return FALSE; -} - - -VOID -ODM_TxPwrTrackSetPwr8814A( - struct dm_struct *pDM_Odm, - PWRTRACK_METHOD Method, - u8 RFPath, - u8 ChannelMappedIndex - ) -{ -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - PADAPTER Adapter = pDM_Odm->Adapter; - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); -#endif - u8 Final_OFDM_Swing_Index = 0; - PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - - if (Method == MIX_MODE) - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("pDM_Odm->DefaultOfdmIndex=%d, pDM_Odm->Absolute_OFDMSwingIdx[RFPath]=%d, RF_Path = %d\n", - pRFCalibrateInfo->DefaultOfdmIndex, pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath], RFPath)); - - Final_OFDM_Swing_Index = CheckRFGainOffset(pDM_Odm, MIX_MODE, RFPath); - } - else if(Method == TSSI_MODE) - { - ODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, BIT18|BIT17|BIT16|BIT15, 0); - } - else if(Method == BBSWING) // use for mp driver clean power tracking status - { - pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] = pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] + pRFCalibrateInfo->KfreeOffset[RFPath]; - - Final_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex + (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath]); - - ODM_SetRFReg(pDM_Odm, RFPath, rRF_TxGainOffset, BIT18|BIT17|BIT16|BIT15, 0); - } - - if((Method == MIX_MODE) || (Method == BBSWING)) - { - switch(RFPath) - { - case ODM_RF_PATH_A: - - ODM_SetBBReg(pDM_Odm, rA_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); //set BBswing - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("******Path_A Compensate with BBSwing , Final_OFDM_Swing_Index = %d \n", Final_OFDM_Swing_Index)); - break; - - case ODM_RF_PATH_B: - - ODM_SetBBReg(pDM_Odm, rB_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); //set BBswing - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("******Path_B Compensate with BBSwing , Final_OFDM_Swing_Index = %d \n", Final_OFDM_Swing_Index)); - break; - - case ODM_RF_PATH_C: - - ODM_SetBBReg(pDM_Odm, rC_TxScale_Jaguar2, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); //set BBswing - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("******Path_C Compensate with BBSwing , Final_OFDM_Swing_Index = %d \n", Final_OFDM_Swing_Index)); - break; - - case ODM_RF_PATH_D: - - ODM_SetBBReg(pDM_Odm, rD_TxScale_Jaguar2, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); //set BBswing - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("******Path_D Compensate with BBSwing , Final_OFDM_Swing_Index = %d \n", Final_OFDM_Swing_Index)); - break; - - default: - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("Wrong Path name!!!! \n")); - - break; - } - } - return; -} // ODM_TxPwrTrackSetPwr8814A - -VOID -GetDeltaSwingTable_8814A( - IN struct dm_struct *pDM_Odm, - OUT pu8 *TemperatureUP_A, - OUT pu8 *TemperatureDOWN_A, - OUT pu8 *TemperatureUP_B, - OUT pu8 *TemperatureDOWN_B - ) -{ - PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - u2Byte rate = *(pDM_Odm->pForcedDataRate); - u8 channel = *(pDM_Odm->pChannel); - - if ( 1 <= channel && channel <= 14) { - if (IS_CCK_RATE(rate)) { - *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P; - *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N; - *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P; - *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N; - } else { - *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P; - *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N; - *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P; - *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N; - } - } else if ( 36 <= channel && channel <= 64) { - *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[0]; - *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[0]; - *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[0]; - *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[0]; - } else if ( 100 <= channel && channel <= 140) { - *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[1]; - *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[1]; - *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[1]; - *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[1]; - } else if ( 149 <= channel && channel <= 173) { - *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[2]; - *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[2]; - *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[2]; - *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[2]; - } else { - *TemperatureUP_A = (pu8)DeltaSwingTableIdx_2GA_P_DEFAULT; - *TemperatureDOWN_A = (pu8)DeltaSwingTableIdx_2GA_N_DEFAULT; - *TemperatureUP_B = (pu8)DeltaSwingTableIdx_2GA_P_DEFAULT; - *TemperatureDOWN_B = (pu8)DeltaSwingTableIdx_2GA_N_DEFAULT; - } - - return; -} - - -VOID -GetDeltaSwingTable_8814A_PathCD( - IN struct dm_struct *pDM_Odm, - OUT pu8 *TemperatureUP_C, - OUT pu8 *TemperatureDOWN_C, - OUT pu8 *TemperatureUP_D, - OUT pu8 *TemperatureDOWN_D - ) -{ - PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - u2Byte rate = *(pDM_Odm->pForcedDataRate); - u8 channel = *(pDM_Odm->pChannel); - - if ( 1 <= channel && channel <= 14) { - if (IS_CCK_RATE(rate)) { - *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKC_P; - *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKC_N; - *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKD_P; - *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKD_N; - } else { - *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GC_P; - *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GC_N; - *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GD_P; - *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GD_N; - } - } else if ( 36 <= channel && channel <= 64) { - *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P[0]; - *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N[0]; - *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P[0]; - *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N[0]; - } else if ( 100 <= channel && channel <= 140) { - *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P[1]; - *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N[1]; - *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P[1]; - *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N[1]; - } else if ( 149 <= channel && channel <= 173) { - *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P[2]; - *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N[2]; - *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P[2]; - *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N[2]; - } else { - *TemperatureUP_C = (pu8)DeltaSwingTableIdx_2GA_P_DEFAULT; - *TemperatureDOWN_C = (pu8)DeltaSwingTableIdx_2GA_N_DEFAULT; - *TemperatureUP_D = (pu8)DeltaSwingTableIdx_2GA_P_DEFAULT; - *TemperatureDOWN_D = (pu8)DeltaSwingTableIdx_2GA_N_DEFAULT; - } - - return; -} - - -void ConfigureTxpowerTrack_8814A( - IN PTXPWRTRACK_CFG pConfig - ) -{ - pConfig->SwingTableSize_CCK = ODM_CCK_TABLE_SIZE; - pConfig->SwingTableSize_OFDM = ODM_OFDM_TABLE_SIZE; - pConfig->Threshold_IQK = 8; - pConfig->AverageThermalNum = AVG_THERMAL_NUM_8814A; - pConfig->RfPathCount = MAX_PATH_NUM_8814A; - pConfig->ThermalRegAddr = RF_T_METER_8814A; - - pConfig->ODM_TxPwrTrackSetPwr = ODM_TxPwrTrackSetPwr8814A; - pConfig->PHY_LCCalibrate = PHY_LCCalibrate_8814A; - pConfig->DoIQK = DoIQK_8814A; - pConfig->GetDeltaSwingTable = GetDeltaSwingTable_8814A; - pConfig->GetDeltaSwingTable8814only = GetDeltaSwingTable_8814A_PathCD; -} - - - -//1 7. IQK - - - -// -// 2011/07/26 MH Add an API for testing IQK fail case. -// -// MP Already declare in odm.c -#if 0 //!(DM_ODM_SUPPORT_TYPE & ODM_WIN) -BOOLEAN -ODM_CheckPowerStatus( - IN PADAPTER Adapter) -{ - /* - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct dm_struct *pDM_Odm = &pHalData->DM_OutSrc; - RT_RF_POWER_STATE rtState; - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - - // 2011/07/27 MH We are not testing ready~~!! We may fail to get correct value when init sequence. - if (pMgntInfo->init_adpt_in_progress == TRUE) - { - ODM_RT_TRACE(pDM_Odm,COMP_INIT, DBG_LOUD, ("ODM_CheckPowerStatus Return TRUE, due to initadapter")); - return TRUE; - } - - // - // 2011/07/19 MH We can not execute tx pwoer tracking/ LLC calibrate or IQK. - // - Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_RF_STATE, (pu8)(&rtState)); - if(Adapter->bDriverStopped || Adapter->bDriverIsGoingToPnpSetPowerSleep || rtState == eRfOff) - { - ODM_RT_TRACE(pDM_Odm,COMP_INIT, DBG_LOUD, ("ODM_CheckPowerStatus Return FALSE, due to %d/%d/%d\n", - Adapter->bDriverStopped, Adapter->bDriverIsGoingToPnpSetPowerSleep, rtState)); - return FALSE; - } - */ - return TRUE; -} -#endif - -VOID - _PHY_SaveADDARegisters_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN pu32 ADDAReg, - IN pu32 ADDABackup, - IN u32 RegisterNum - ) -{ - u32 i; -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); -#if (DM_ODM_SUPPORT_TYPE == ODM_CE) - PDM_ODM_T pDM_Odm = &pHalData->odmpriv; -#endif -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; -#endif - - if (ODM_CheckPowerStatus(pAdapter) == FALSE) - return; -#endif - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Save ADDA parameters.\n")); - for( i = 0 ; i < RegisterNum ; i++){ - ADDABackup[i] = ODM_GetBBReg(pDM_Odm, ADDAReg[i], bMaskDWord); - } -} - - -VOID - _PHY_SaveMACRegisters_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN pu32 MACReg, - IN pu32 MACBackup - ) -{ - u32 i; -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); -#if (DM_ODM_SUPPORT_TYPE == ODM_CE) - PDM_ODM_T pDM_Odm = &pHalData->odmpriv; -#endif -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; -#endif -#endif - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Save MAC parameters.\n")); - for( i = 0 ; i < (IQK_MAC_REG_NUM - 1); i++){ - MACBackup[i] = ODM_Read1Byte(pDM_Odm, MACReg[i]); - } - MACBackup[i] = ODM_Read4Byte(pDM_Odm, MACReg[i]); - -} - - -VOID - _PHY_ReloadADDARegisters_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN pu32 ADDAReg, - IN pu32 ADDABackup, - IN u32 RegiesterNum - ) -{ - u32 i; -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); -#if (DM_ODM_SUPPORT_TYPE == ODM_CE) - PDM_ODM_T pDM_Odm = &pHalData->odmpriv; -#endif -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; -#endif -#endif - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Reload ADDA power saving parameters !\n")); - for(i = 0 ; i < RegiesterNum; i++) - { - ODM_SetBBReg(pDM_Odm, ADDAReg[i], bMaskDWord, ADDABackup[i]); - } -} - -VOID - _PHY_ReloadMACRegisters_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN pu32 MACReg, - IN pu32 MACBackup - ) -{ - u32 i; -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); -#if (DM_ODM_SUPPORT_TYPE == ODM_CE) - PDM_ODM_T pDM_Odm = &pHalData->odmpriv; -#endif -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; -#endif -#endif - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Reload MAC parameters !\n")); - for(i = 0 ; i < (IQK_MAC_REG_NUM - 1); i++){ - ODM_Write1Byte(pDM_Odm, MACReg[i], (u8)MACBackup[i]); - } - ODM_Write4Byte(pDM_Odm, MACReg[i], MACBackup[i]); -} - - - -VOID - _PHY_MACSettingCalibration_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN pu32 MACReg, - IN pu32 MACBackup - ) -{ - u32 i = 0; -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); -#if (DM_ODM_SUPPORT_TYPE == ODM_CE) - PDM_ODM_T pDM_Odm = &pHalData->odmpriv; -#endif -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; -#endif -#endif - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("MAC settings for Calibration.\n")); - - ODM_Write1Byte(pDM_Odm, MACReg[i], 0x3F); - - for(i = 1 ; i < (IQK_MAC_REG_NUM - 1); i++){ - ODM_Write1Byte(pDM_Odm, MACReg[i], (u8)(MACBackup[i]&(~BIT3))); - } - ODM_Write1Byte(pDM_Odm, MACReg[i], (u8)(MACBackup[i]&(~BIT5))); - -} - -#if 0 -#define BW_20M 0 -#define BW_40M 1 -#define BW_80M 2 -#endif - -VOID - phy_LCCalibrate_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN BOOLEAN is2T - ) -{ - u32 /*RF_Amode=0, RF_Bmode=0,*/ LC_Cal = 0, tmp = 0; - u32 cnt; - - //Check continuous TX and Packet TX - u32 reg0x914 = ODM_Read4Byte(pDM_Odm, rSingleTone_ContTx_Jaguar);; - - // Backup RF reg18. - - if((reg0x914 & 0x70000) == 0) - ODM_Write1Byte(pDM_Odm, REG_TXPAUSE_8812, 0xFF); - - //3 3. Read RF reg18 - LC_Cal = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask); - - //3 4. Set LC calibration begin bit15 - ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x8000, 0x1); - - ODM_delay_ms(100); - - for (cnt = 0; cnt < 100; cnt++) { - if (ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x8000) != 0x1) - break; - ODM_delay_ms(10); - } - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("retry cnt = %d\n", cnt)); - - - //3 Restore original situation - if((reg0x914 & 70000) == 0) - ODM_Write1Byte(pDM_Odm, REG_TXPAUSE_8812, 0x00); - - // Recover channel number - ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, LC_Cal); -} - -//Analog Pre-distortion calibration -#define APK_BB_REG_NUM 8 -#define APK_CURVE_REG_NUM 4 -#define PATH_NUM 2 - -VOID - phy_APCalibrate_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN s1Byte delta, - IN BOOLEAN is2T - ) -{ -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); -#if (DM_ODM_SUPPORT_TYPE == ODM_CE) - PDM_ODM_T pDM_Odm = &pHalData->odmpriv; -#endif -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; -#endif -#endif - u32 regD[PATH_NUM]; - u32 tmpReg, index, offset, apkbound; - u8 path, i, pathbound = PATH_NUM; - u32 BB_backup[APK_BB_REG_NUM]; - u32 BB_REG[APK_BB_REG_NUM] = { - rFPGA1_TxBlock, rOFDM0_TRxPathEnable, - rFPGA0_RFMOD, rOFDM0_TRMuxPar, - rFPGA0_XCD_RFInterfaceSW, rFPGA0_XAB_RFInterfaceSW, - rFPGA0_XA_RFInterfaceOE, rFPGA0_XB_RFInterfaceOE }; - u32 BB_AP_MODE[APK_BB_REG_NUM] = { - 0x00000020, 0x00a05430, 0x02040000, - 0x000800e4, 0x00204000 }; - u32 BB_normal_AP_MODE[APK_BB_REG_NUM] = { - 0x00000020, 0x00a05430, 0x02040000, - 0x000800e4, 0x22204000 }; - - u32 AFE_backup[IQK_ADDA_REG_NUM]; - u32 AFE_REG[IQK_ADDA_REG_NUM] = { - rFPGA0_XCD_SwitchControl, rBlue_Tooth, - rRx_Wait_CCA, rTx_CCK_RFON, - rTx_CCK_BBON, rTx_OFDM_RFON, - rTx_OFDM_BBON, rTx_To_Rx, - rTx_To_Tx, rRx_CCK, - rRx_OFDM, rRx_Wait_RIFS, - rRx_TO_Rx, rStandby, - rSleep, rPMPD_ANAEN }; - - u32 MAC_backup[IQK_MAC_REG_NUM]; - u32 MAC_REG[IQK_MAC_REG_NUM] = { - REG_TXPAUSE, REG_BCN_CTRL, - REG_BCN_CTRL_1, REG_GPIO_MUXCFG}; - - u32 APK_RF_init_value[PATH_NUM][APK_BB_REG_NUM] = { - {0x0852c, 0x1852c, 0x5852c, 0x1852c, 0x5852c}, - {0x2852e, 0x0852e, 0x3852e, 0x0852e, 0x0852e} - }; - - u32 APK_normal_RF_init_value[PATH_NUM][APK_BB_REG_NUM] = { - {0x0852c, 0x0a52c, 0x3a52c, 0x5a52c, 0x5a52c}, //path settings equal to path b settings - {0x0852c, 0x0a52c, 0x5a52c, 0x5a52c, 0x5a52c} - }; - - u32 APK_RF_value_0[PATH_NUM][APK_BB_REG_NUM] = { - {0x52019, 0x52014, 0x52013, 0x5200f, 0x5208d}, - {0x5201a, 0x52019, 0x52016, 0x52033, 0x52050} - }; - - u32 APK_normal_RF_value_0[PATH_NUM][APK_BB_REG_NUM] = { - {0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a}, //path settings equal to path b settings - {0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a} - }; - - u32 AFE_on_off[PATH_NUM] = { - 0x04db25a4, 0x0b1b25a4}; //path A on path B off / path A off path B on - - u32 APK_offset[PATH_NUM] = { - rConfig_AntA, rConfig_AntB}; - - u32 APK_normal_offset[PATH_NUM] = { - rConfig_Pmpd_AntA, rConfig_Pmpd_AntB}; - - u32 APK_value[PATH_NUM] = { - 0x92fc0000, 0x12fc0000}; - - u32 APK_normal_value[PATH_NUM] = { - 0x92680000, 0x12680000}; - - s1Byte APK_delta_mapping[APK_BB_REG_NUM][13] = { - {-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6}, - {-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6}, - {-6, -4, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6}, - {-1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6}, - {-11, -9, -7, -5, -3, -1, 0, 0, 0, 0, 0, 0, 0} - }; - - u32 APK_normal_setting_value_1[13] = { - 0x01017018, 0xf7ed8f84, 0x1b1a1816, 0x2522201e, 0x322e2b28, - 0x433f3a36, 0x5b544e49, 0x7b726a62, 0xa69a8f84, 0xdfcfc0b3, - 0x12680000, 0x00880000, 0x00880000 - }; - - u32 APK_normal_setting_value_2[16] = { - 0x01c7021d, 0x01670183, 0x01000123, 0x00bf00e2, 0x008d00a3, - 0x0068007b, 0x004d0059, 0x003a0042, 0x002b0031, 0x001f0025, - 0x0017001b, 0x00110014, 0x000c000f, 0x0009000b, 0x00070008, - 0x00050006 - }; - - u32 APK_result[PATH_NUM][APK_BB_REG_NUM]; //val_1_1a, val_1_2a, val_2a, val_3a, val_4a - // u32 AP_curve[PATH_NUM][APK_CURVE_REG_NUM]; - - s4Byte BB_offset, delta_V, delta_offset; - -#if defined(MP_DRIVER) && (MP_DRIVER == 1) -#if (DM_ODM_SUPPORT_TYPE == ODM_CE) - PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx); -#else - PMPT_CONTEXT pMptCtx = &(pAdapter->MptCtx); -#endif - pMptCtx->APK_bound[0] = 45; - pMptCtx->APK_bound[1] = 52; - -#endif - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("==>phy_APCalibrate_8814A() delta %d\n", delta)); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("AP Calibration for %s\n", (is2T ? "2T2R" : "1T1R"))); - if(!is2T) - pathbound = 1; - - //2 FOR NORMAL CHIP SETTINGS - - // Temporarily do not allow normal driver to do the following settings because these offset - // and value will cause RF internal PA to be unpredictably disabled by HW, such that RF Tx signal - // will disappear after disable/enable card many times on 88CU. RF SD and DD have not find the - // root cause, so we remove these actions temporarily. Added by tynli and SD3 Allen. 2010.05.31. -#if !defined(MP_DRIVER) || (MP_DRIVER != 1) - return; -#endif - //settings adjust for normal chip - for(index = 0; index < PATH_NUM; index ++) - { - APK_offset[index] = APK_normal_offset[index]; - APK_value[index] = APK_normal_value[index]; - AFE_on_off[index] = 0x6fdb25a4; - } - - for(index = 0; index < APK_BB_REG_NUM; index ++) - { - for(path = 0; path < pathbound; path++) - { - APK_RF_init_value[path][index] = APK_normal_RF_init_value[path][index]; - APK_RF_value_0[path][index] = APK_normal_RF_value_0[path][index]; - } - BB_AP_MODE[index] = BB_normal_AP_MODE[index]; - } - - apkbound = 6; - - //save BB default value - for(index = 0; index < APK_BB_REG_NUM ; index++) - { - if(index == 0) //skip - continue; - BB_backup[index] = ODM_GetBBReg(pDM_Odm, BB_REG[index], bMaskDWord); - } - - //save MAC default value -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - _PHY_SaveMACRegisters_8814A(pAdapter, MAC_REG, MAC_backup); - - //save AFE default value - _PHY_SaveADDARegisters_8814A(pAdapter, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM); -#else - _PHY_SaveMACRegisters_8814A(pDM_Odm, MAC_REG, MAC_backup); - - //save AFE default value - _PHY_SaveADDARegisters_8814A(pDM_Odm, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM); -#endif - - for(path = 0; path < pathbound; path++) - { - - - if(path == RF_PATH_A) - { - //path A APK - //load APK setting - //path-A - offset = rPdp_AntA; - for(index = 0; index < 11; index ++) - { - ODM_SetBBReg(pDM_Odm, offset, bMaskDWord, APK_normal_setting_value_1[index]); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x%x value 0x%x\n", offset, ODM_GetBBReg(pDM_Odm, offset, bMaskDWord))); - - offset += 0x04; - } - - ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x12680000); - - offset = rConfig_AntA; - for(; index < 13; index ++) - { - ODM_SetBBReg(pDM_Odm, offset, bMaskDWord, APK_normal_setting_value_1[index]); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x%x value 0x%x\n", offset, ODM_GetBBReg(pDM_Odm, offset, bMaskDWord))); - - offset += 0x04; - } - - //page-B1 - ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000); - - //path A - offset = rPdp_AntA; - for(index = 0; index < 16; index++) - { - ODM_SetBBReg(pDM_Odm, offset, bMaskDWord, APK_normal_setting_value_2[index]); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x%x value 0x%x\n", offset, ODM_GetBBReg(pDM_Odm, offset, bMaskDWord))); - - offset += 0x04; - } - ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000); - } - else if(path == RF_PATH_B) - { - //path B APK - //load APK setting - //path-B - offset = rPdp_AntB; - for(index = 0; index < 10; index ++) - { - ODM_SetBBReg(pDM_Odm, offset, bMaskDWord, APK_normal_setting_value_1[index]); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x%x value 0x%x\n", offset, ODM_GetBBReg(pDM_Odm, offset, bMaskDWord))); - - offset += 0x04; - } - ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntA, bMaskDWord, 0x12680000); - ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x12680000); - - offset = rConfig_AntA; - index = 11; - for(; index < 13; index ++) //offset 0xb68, 0xb6c - { - ODM_SetBBReg(pDM_Odm, offset, bMaskDWord, APK_normal_setting_value_1[index]); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x%x value 0x%x\n", offset, ODM_GetBBReg(pDM_Odm, offset, bMaskDWord))); - - offset += 0x04; - } - - //page-B1 - ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000); - - //path B - offset = 0xb60; - for(index = 0; index < 16; index++) - { - ODM_SetBBReg(pDM_Odm, offset, bMaskDWord, APK_normal_setting_value_2[index]); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x%x value 0x%x\n", offset, ODM_GetBBReg(pDM_Odm, offset, bMaskDWord))); - - offset += 0x04; - } - ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0); - } - - //save RF default value -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - regD[path] = PHY_QueryRFReg(pAdapter, path, RF_TXBIAS_A, bMaskDWord); -#else - regD[path] = ODM_GetRFReg(pDM_Odm, path, RF_TXBIAS_A, bMaskDWord); -#endif - - //Path A AFE all on, path B AFE All off or vise versa - for(index = 0; index < IQK_ADDA_REG_NUM ; index++) - ODM_SetBBReg(pDM_Odm, AFE_REG[index], bMaskDWord, AFE_on_off[path]); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0xe70 %x\n", ODM_GetBBReg(pDM_Odm, rRx_Wait_CCA, bMaskDWord))); - - //BB to AP mode - if(path == 0) - { - for(index = 0; index < APK_BB_REG_NUM ; index++) - { - - if(index == 0) //skip - continue; - else if (index < 5) - ODM_SetBBReg(pDM_Odm, BB_REG[index], bMaskDWord, BB_AP_MODE[index]); - else if (BB_REG[index] == 0x870) - ODM_SetBBReg(pDM_Odm, BB_REG[index], bMaskDWord, BB_backup[index]|BIT10|BIT26); - else - ODM_SetBBReg(pDM_Odm, BB_REG[index], BIT10, 0x0); - } - - ODM_SetBBReg(pDM_Odm, rTx_IQK_Tone_A, bMaskDWord, 0x01008c00); - ODM_SetBBReg(pDM_Odm, rRx_IQK_Tone_A, bMaskDWord, 0x01008c00); - } - else //path B - { - ODM_SetBBReg(pDM_Odm, rTx_IQK_Tone_B, bMaskDWord, 0x01008c00); - ODM_SetBBReg(pDM_Odm, rRx_IQK_Tone_B, bMaskDWord, 0x01008c00); - - } - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x800 %x\n", ODM_GetBBReg(pDM_Odm, 0x800, bMaskDWord))); - - //MAC settings -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - _PHY_MACSettingCalibration_8814A(pAdapter, MAC_REG, MAC_backup); -#else - _PHY_MACSettingCalibration_8814A(pDM_Odm, MAC_REG, MAC_backup); -#endif - - if(path == RF_PATH_A) //Path B to standby mode - { - ODM_SetRFReg(pDM_Odm, RF_PATH_B, RF_AC, bMaskDWord, 0x10000); - } - else //Path A to standby mode - { - ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_AC, bMaskDWord, 0x10000); - ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_MODE1, bMaskDWord, 0x1000f); - ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_MODE2, bMaskDWord, 0x20103); - } - - delta_offset = ((delta+14)/2); - if(delta_offset < 0) - delta_offset = 0; - else if (delta_offset > 12) - delta_offset = 12; - - //AP calibration - for(index = 0; index < APK_BB_REG_NUM; index++) - { - if(index != 1) //only DO PA11+PAD01001, AP RF setting - continue; - - tmpReg = APK_RF_init_value[path][index]; -#if 1 - if(!pDM_Odm->RFCalibrateInfo.bAPKThermalMeterIgnore) - { - BB_offset = (tmpReg & 0xF0000) >> 16; - - if(!(tmpReg & BIT15)) //sign bit 0 - { - BB_offset = -BB_offset; - } - - delta_V = APK_delta_mapping[index][delta_offset]; - - BB_offset += delta_V; - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() APK index %d tmpReg 0x%x delta_V %d delta_offset %d\n", index, tmpReg, (int)delta_V, (int)delta_offset)); - - if(BB_offset < 0) - { - tmpReg = tmpReg & (~BIT15); - BB_offset = -BB_offset; - } - else - { - tmpReg = tmpReg | BIT15; - } - tmpReg = (tmpReg & 0xFFF0FFFF) | (BB_offset << 16); - } -#endif - - ODM_SetRFReg(pDM_Odm, path, RF_IPA_A, bMaskDWord, 0x8992e); -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0xc %x\n", PHY_QueryRFReg(pAdapter, path, RF_IPA_A, bMaskDWord))); - ODM_SetRFReg(pDM_Odm, path, RF_AC, bMaskDWord, APK_RF_value_0[path][index]); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x0 %x\n", PHY_QueryRFReg(pAdapter, path, RF_AC, bMaskDWord))); - ODM_SetRFReg(pDM_Odm, path, RF_TXBIAS_A, bMaskDWord, tmpReg); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0xd %x\n", PHY_QueryRFReg(pAdapter, path, RF_TXBIAS_A, bMaskDWord))); -#else - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0xc %x\n", ODM_GetRFReg(pDM_Odm, path, RF_IPA_A, bMaskDWord))); - ODM_SetRFReg(pDM_Odm, path, RF_AC, bMaskDWord, APK_RF_value_0[path][index]); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x0 %x\n", ODM_GetRFReg(pDM_Odm, path, RF_AC, bMaskDWord))); - ODM_SetRFReg(pDM_Odm, path, RF_TXBIAS_A, bMaskDWord, tmpReg); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0xd %x\n", ODM_GetRFReg(pDM_Odm, path, RF_TXBIAS_A, bMaskDWord))); -#endif - - // PA11+PAD01111, one shot - i = 0; - do - { - ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80000000); - { - ODM_SetBBReg(pDM_Odm, APK_offset[path], bMaskDWord, APK_value[0]); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x%x value 0x%x\n", APK_offset[path], ODM_GetBBReg(pDM_Odm, APK_offset[path], bMaskDWord))); - ODM_delay_ms(3); - ODM_SetBBReg(pDM_Odm, APK_offset[path], bMaskDWord, APK_value[1]); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0x%x value 0x%x\n", APK_offset[path], ODM_GetBBReg(pDM_Odm, APK_offset[path], bMaskDWord))); - - ODM_delay_ms(20); - } - ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000); - - if(path == RF_PATH_A) - tmpReg = ODM_GetBBReg(pDM_Odm, rAPK, 0x03E00000); - else - tmpReg = ODM_GetBBReg(pDM_Odm, rAPK, 0xF8000000); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_APCalibrate_8814A() offset 0xbd8[25:21] %x\n", tmpReg)); - - - i++; - } - while(tmpReg > apkbound && i < 4); - - APK_result[path][index] = tmpReg; - } - } - - //reload MAC default value -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - _PHY_ReloadMACRegisters_8814A(pAdapter, MAC_REG, MAC_backup); -#else - _PHY_ReloadMACRegisters_8814A(pDM_Odm, MAC_REG, MAC_backup); -#endif - - //reload BB default value - for(index = 0; index < APK_BB_REG_NUM ; index++) - { - - if(index == 0) //skip - continue; - ODM_SetBBReg(pDM_Odm, BB_REG[index], bMaskDWord, BB_backup[index]); - } - - //reload AFE default value -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - _PHY_ReloadADDARegisters_8814A(pAdapter, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM); -#else - _PHY_ReloadADDARegisters_8814A(pDM_Odm, AFE_REG, AFE_backup, IQK_ADDA_REG_NUM); -#endif - - //reload RF path default value - for(path = 0; path < pathbound; path++) - { - ODM_SetRFReg(pDM_Odm, path, 0xd, bMaskDWord, regD[path]); - if(path == RF_PATH_B) - { - ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_MODE1, bMaskDWord, 0x1000f); - ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_MODE2, bMaskDWord, 0x20101); - } - - //note no index == 0 - if (APK_result[path][1] > 6) - APK_result[path][1] = 6; - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("apk path %d result %d 0x%x \t", path, 1, APK_result[path][1])); - } - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("\n")); - - - for(path = 0; path < pathbound; path++) - { - ODM_SetRFReg(pDM_Odm, path, 0x3, bMaskDWord, - ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (APK_result[path][1] << 5) | APK_result[path][1])); - if(path == RF_PATH_A) - ODM_SetRFReg(pDM_Odm, path, 0x4, bMaskDWord, - ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (0x00 << 5) | 0x05)); - else - ODM_SetRFReg(pDM_Odm, path, 0x4, bMaskDWord, - ((APK_result[path][1] << 15) | (APK_result[path][1] << 10) | (0x02 << 5) | 0x05)); -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - ODM_SetRFReg(pDM_Odm, path, RF_BS_PA_APSET_G9_G11, bMaskDWord, - ((0x08 << 15) | (0x08 << 10) | (0x08 << 5) | 0x08)); -#endif - } - - pDM_Odm->RFCalibrateInfo.bAPKdone = TRUE; - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("<==phy_APCalibrate_8814A()\n")); -} - - - - - - -VOID -PHY_LCCalibrate_8814A( - IN PDM_ODM_T pDM_Odm - ) -{ - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("===> PHY_LCCalibrate_8814A\n")); - phy_LCCalibrate_8814A(pDM_Odm, TRUE); - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("<=== PHY_LCCalibrate_8814A\n")); -} - -VOID - PHY_APCalibrate_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN s1Byte delta - ) -{ -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); -#if (DM_ODM_SUPPORT_TYPE == ODM_CE) - PDM_ODM_T pDM_Odm = &pHalData->odmpriv; -#endif -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; -#endif -#endif -#ifdef DISABLE_BB_RF - return; -#endif - - return; -#if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_AP)) - if(!(pDM_Odm->SupportAbility & ODM_RF_CALIBRATION)) - { - return; - } -#endif - -#if defined(FOR_BRAZIL_PRETEST) && (FOR_BRAZIL_PRETEST != 1) - if(pDM_Odm->RFCalibrateInfo.bAPKdone) -#endif - return; - -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - if(IS_92C_SERIAL( pHalData->VersionID)){ - phy_APCalibrate_8814A(pAdapter, delta, TRUE); - } - else -#endif - { - // For 88C 1T1R -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - phy_APCalibrate_8814A(pAdapter, delta, FALSE); -#else - phy_APCalibrate_8814A(pDM_Odm, delta, FALSE); -#endif - } -} - VOID phy_SetRFPathSwitch_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN BOOLEAN bMain, - IN BOOLEAN is2T - ) -{ -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); -#if (DM_ODM_SUPPORT_TYPE == ODM_CE) - PDM_ODM_T pDM_Odm = &pHalData->odmpriv; -#elif (DM_ODM_SUPPORT_TYPE == ODM_WIN) - PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; -#endif - -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - if(!pAdapter->bHWInitReady) -#elif (DM_ODM_SUPPORT_TYPE == ODM_CE) - if(pAdapter->hw_init_completed == _FALSE) -#endif - { - u8 u1bTmp; - u1bTmp = ODM_Read1Byte(pDM_Odm, REG_LEDCFG2) | BIT7; - ODM_Write1Byte(pDM_Odm, REG_LEDCFG2, u1bTmp); - //ODM_SetBBReg(pDM_Odm, REG_LEDCFG0, BIT23, 0x01); - ODM_SetBBReg(pDM_Odm, rFPGA0_XAB_RFParameter, BIT13, 0x01); - } - -#endif - - if(is2T) //92C - { - if(bMain) - ODM_SetBBReg(pDM_Odm, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6, 0x1); //92C_Path_A - else - ODM_SetBBReg(pDM_Odm, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6, 0x2); //BT - } - else //88C - { - - if(bMain) - ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, BIT8|BIT9, 0x2); //Main - else - ODM_SetBBReg(pDM_Odm, rFPGA0_XA_RFInterfaceOE, BIT8|BIT9, 0x1); //Aux - } -} - VOID PHY_SetRFPathSwitch_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN BOOLEAN bMain - ) -{ - //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - -#ifdef DISABLE_BB_RF - return; -#endif - -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - if (IS_92C_SERIAL(pHalData->VersionID)) - { - phy_SetRFPathSwitch_8814A(pAdapter, bMain, TRUE); - } - else -#endif - { - // For 88C 1T1R -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - phy_SetRFPathSwitch_8814A(pAdapter, bMain, FALSE); -#else - phy_SetRFPathSwitch_8814A(pDM_Odm, bMain, FALSE); -#endif - } -} - - -#define DP_BB_REG_NUM 7 -#define DP_RF_REG_NUM 1 -#define DP_RETRY_LIMIT 10 -#define DP_PATH_NUM 2 -#define DP_DPK_NUM 3 -#define DP_DPK_VALUE_NUM 2 - -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) -//digital predistortion -VOID - phy_DigitalPredistortion_8814A( -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PADAPTER pAdapter, -#else - IN PDM_ODM_T pDM_Odm, -#endif - IN BOOLEAN is2T - ) -{ -#if (RT_PLATFORM == PLATFORM_WINDOWS) -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); -#if (DM_ODM_SUPPORT_TYPE == ODM_CE) - PDM_ODM_T pDM_Odm = &pHalData->odmpriv; -#endif -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; -#endif -#endif - - u32 tmpReg, tmpReg2, index, i; - u8 path, pathbound = PATH_NUM; - u32 AFE_backup[IQK_ADDA_REG_NUM]; - u32 AFE_REG[IQK_ADDA_REG_NUM] = { - rFPGA0_XCD_SwitchControl, rBlue_Tooth, - rRx_Wait_CCA, rTx_CCK_RFON, - rTx_CCK_BBON, rTx_OFDM_RFON, - rTx_OFDM_BBON, rTx_To_Rx, - rTx_To_Tx, rRx_CCK, - rRx_OFDM, rRx_Wait_RIFS, - rRx_TO_Rx, rStandby, - rSleep, rPMPD_ANAEN }; - - u32 BB_backup[DP_BB_REG_NUM]; - u32 BB_REG[DP_BB_REG_NUM] = { - rOFDM0_TRxPathEnable, rFPGA0_RFMOD, - rOFDM0_TRMuxPar, rFPGA0_XCD_RFInterfaceSW, - rFPGA0_XAB_RFInterfaceSW, rFPGA0_XA_RFInterfaceOE, - rFPGA0_XB_RFInterfaceOE}; - u32 BB_settings[DP_BB_REG_NUM] = { - 0x00a05430, 0x02040000, 0x000800e4, 0x22208000, - 0x0, 0x0, 0x0}; - - u32 RF_backup[DP_PATH_NUM][DP_RF_REG_NUM]; - u32 RF_REG[DP_RF_REG_NUM] = { - RF_TXBIAS_A}; - - u32 MAC_backup[IQK_MAC_REG_NUM]; - u32 MAC_REG[IQK_MAC_REG_NUM] = { - REG_TXPAUSE, REG_BCN_CTRL, - REG_BCN_CTRL_1, REG_GPIO_MUXCFG}; - - u32 Tx_AGC[DP_DPK_NUM][DP_DPK_VALUE_NUM] = { - {0x1e1e1e1e, 0x03901e1e}, - {0x18181818, 0x03901818}, - {0x0e0e0e0e, 0x03900e0e} - }; - - u32 AFE_on_off[PATH_NUM] = { - 0x04db25a4, 0x0b1b25a4}; //path A on path B off / path A off path B on - - u8 RetryCount = 0; - - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("==>phy_DigitalPredistortion_8814A()\n")); - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("phy_DigitalPredistortion_8814A for %s %s\n", (is2T ? "2T2R" : "1T1R"))); - - //save BB default value - for(index=0; index tx_agc 1f ~11 - // PA gain = 11 & PAD2 => tx_agc 10~0e - // PA gain = 01 => tx_agc 0b~0d - // PA gain = 00 => tx_agc 0a~00 - ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000); - ODM_SetBBReg(pDM_Odm, 0xbc0, bMaskDWord, 0x0005361f); - ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000); - - //do inner loopback DPK 3 times - for(i = 0; i < 3; i++) - { - //PA gain = 11 & PAD2 => tx_agc = 0x0f/0x0c/0x07 - for(index = 0; index < 3; index++) - ODM_SetBBReg(pDM_Odm, 0xe00+index*4, bMaskDWord, Tx_AGC[i][0]); - ODM_SetBBReg(pDM_Odm,0xe00+index*4, bMaskDWord, Tx_AGC[i][1]); - for(index = 0; index < 4; index++) - ODM_SetBBReg(pDM_Odm,0xe10+index*4, bMaskDWord, Tx_AGC[i][0]); - - // PAGE_B for Path-A inner loopback DPK setting - ODM_SetBBReg(pDM_Odm,rPdp_AntA, bMaskDWord, 0x02097098); - ODM_SetBBReg(pDM_Odm,rPdp_AntA_4, bMaskDWord, 0xf76d9f84); - ODM_SetBBReg(pDM_Odm,rConfig_Pmpd_AntA, bMaskDWord, 0x0004ab87); - ODM_SetBBReg(pDM_Odm,rConfig_AntA, bMaskDWord, 0x00880000); - - //----send one shot signal----// - // Path A - ODM_SetBBReg(pDM_Odm,rConfig_Pmpd_AntA, bMaskDWord, 0x80047788); - ODM_delay_ms(1); - ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntA, bMaskDWord, 0x00047788); - ODM_delay_ms(50); - } - - //PA gain = 11 => tx_agc = 1a - for(index = 0; index < 3; index++) - ODM_SetBBReg(pDM_Odm,0xe00+index*4, bMaskDWord, 0x34343434); - ODM_SetBBReg(pDM_Odm,0xe08+index*4, bMaskDWord, 0x03903434); - for(index = 0; index < 4; index++) - ODM_SetBBReg(pDM_Odm,0xe10+index*4, bMaskDWord, 0x34343434); - - //==================================== - // PAGE_B for Path-A DPK setting - //==================================== - // open inner loopback @ b00[19]:10 od 0xb00 0x01097018 - ODM_SetBBReg(pDM_Odm,rPdp_AntA, bMaskDWord, 0x02017098); - ODM_SetBBReg(pDM_Odm,rPdp_AntA_4, bMaskDWord, 0xf76d9f84); - ODM_SetBBReg(pDM_Odm,rConfig_Pmpd_AntA, bMaskDWord, 0x0004ab87); - ODM_SetBBReg(pDM_Odm,rConfig_AntA, bMaskDWord, 0x00880000); - - //rf_lpbk_setup - //1.rf 00:5205a, rf 0d:0e52c - ODM_SetRFReg(pDM_Odm, RF_PATH_A, 0x0c, bMaskDWord, 0x8992b); - ODM_SetRFReg(pDM_Odm, RF_PATH_A, 0x0d, bMaskDWord, 0x0e52c); - ODM_SetRFReg(pDM_Odm, RF_PATH_A, 0x00, bMaskDWord, 0x5205a ); - - //----send one shot signal----// - // Path A - ODM_SetBBReg(pDM_Odm,rConfig_Pmpd_AntA, bMaskDWord, 0x800477c0); - ODM_delay_ms(1); - ODM_SetBBReg(pDM_Odm,rConfig_Pmpd_AntA, bMaskDWord, 0x000477c0); - ODM_delay_ms(50); - - while(RetryCount < DP_RETRY_LIMIT && !pDM_Odm->RFCalibrateInfo.bDPPathAOK) - { - //----read back measurement results----// - ODM_SetBBReg(pDM_Odm, rPdp_AntA, bMaskDWord, 0x0c297018); - tmpReg = ODM_GetBBReg(pDM_Odm, 0xbe0, bMaskDWord); - ODM_delay_ms(10); - ODM_SetBBReg(pDM_Odm, rPdp_AntA, bMaskDWord, 0x0c29701f); - tmpReg2 = ODM_GetBBReg(pDM_Odm, 0xbe8, bMaskDWord); - ODM_delay_ms(10); - - tmpReg = (tmpReg & bMaskHWord) >> 16; - tmpReg2 = (tmpReg2 & bMaskHWord) >> 16; - if(tmpReg < 0xf0 || tmpReg > 0x105 || tmpReg2 > 0xff ) - { - ODM_SetBBReg(pDM_Odm, rPdp_AntA, bMaskDWord, 0x02017098); - - ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80000000); - ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000); - ODM_delay_ms(1); - ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntA, bMaskDWord, 0x800477c0); - ODM_delay_ms(1); - ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntA, bMaskDWord, 0x000477c0); - ODM_delay_ms(50); - RetryCount++; - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("path A DPK RetryCount %d 0xbe0[31:16] %x 0xbe8[31:16] %x\n", RetryCount, tmpReg, tmpReg2)); - } - else - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("path A DPK Sucess\n")); - pDM_Odm->RFCalibrateInfo.bDPPathAOK = TRUE; - break; - } - } - RetryCount = 0; - - //DPP path A - if(pDM_Odm->RFCalibrateInfo.bDPPathAOK) - { - // DP settings - ODM_SetBBReg(pDM_Odm, rPdp_AntA, bMaskDWord, 0x01017098); - ODM_SetBBReg(pDM_Odm, rPdp_AntA_4, bMaskDWord, 0x776d9f84); - ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntA, bMaskDWord, 0x0004ab87); - ODM_SetBBReg(pDM_Odm, rConfig_AntA, bMaskDWord, 0x00880000); - ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000); - - for(i=rPdp_AntA; i<=0xb3c; i+=4) - { - ODM_SetBBReg(pDM_Odm, i, bMaskDWord, 0x40004000); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("path A ofsset = 0x%x\n", i)); - } - - //pwsf - ODM_SetBBReg(pDM_Odm, 0xb40, bMaskDWord, 0x40404040); - ODM_SetBBReg(pDM_Odm, 0xb44, bMaskDWord, 0x28324040); - ODM_SetBBReg(pDM_Odm, 0xb48, bMaskDWord, 0x10141920); - - for(i=0xb4c; i<=0xb5c; i+=4) - { - ODM_SetBBReg(pDM_Odm, i, bMaskDWord, 0x0c0c0c0c); - } - - //TX_AGC boundary - ODM_SetBBReg(pDM_Odm, 0xbc0, bMaskDWord, 0x0005361f); - ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000); - } - else - { - ODM_SetBBReg(pDM_Odm, rPdp_AntA, bMaskDWord, 0x00000000); - ODM_SetBBReg(pDM_Odm, rPdp_AntA_4, bMaskDWord, 0x00000000); - } - - //DPK path B - if(is2T) - { - //Path A to standby mode - ODM_SetRFReg(pDM_Odm, RF_PATH_A, RF_AC, bMaskDWord, 0x10000); - - // LUTs => tx_agc - // PA gain = 11 & PAD1, => tx_agc 1f ~11 - // PA gain = 11 & PAD2, => tx_agc 10 ~0e - // PA gain = 01 => tx_agc 0b ~0d - // PA gain = 00 => tx_agc 0a ~00 - ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000); - ODM_SetBBReg(pDM_Odm, 0xbc4, bMaskDWord, 0x0005361f); - ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000); - - //do inner loopback DPK 3 times - for(i = 0; i < 3; i++) - { - //PA gain = 11 & PAD2 => tx_agc = 0x0f/0x0c/0x07 - for(index = 0; index < 4; index++) - ODM_SetBBReg(pDM_Odm, 0x830+index*4, bMaskDWord, Tx_AGC[i][0]); - for(index = 0; index < 2; index++) - ODM_SetBBReg(pDM_Odm, 0x848+index*4, bMaskDWord, Tx_AGC[i][0]); - for(index = 0; index < 2; index++) - ODM_SetBBReg(pDM_Odm, 0x868+index*4, bMaskDWord, Tx_AGC[i][0]); - - // PAGE_B for Path-A inner loopback DPK setting - ODM_SetBBReg(pDM_Odm, rPdp_AntB, bMaskDWord, 0x02097098); - ODM_SetBBReg(pDM_Odm, rPdp_AntB_4, bMaskDWord, 0xf76d9f84); - ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x0004ab87); - ODM_SetBBReg(pDM_Odm, rConfig_AntB, bMaskDWord, 0x00880000); - - //----send one shot signal----// - // Path B - ODM_SetBBReg(pDM_Odm,rConfig_Pmpd_AntB, bMaskDWord, 0x80047788); - ODM_delay_ms(1); - ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x00047788); - ODM_delay_ms(50); - } - - // PA gain = 11 => tx_agc = 1a - for(index = 0; index < 4; index++) - ODM_SetBBReg(pDM_Odm, 0x830+index*4, bMaskDWord, 0x34343434); - for(index = 0; index < 2; index++) - ODM_SetBBReg(pDM_Odm, 0x848+index*4, bMaskDWord, 0x34343434); - for(index = 0; index < 2; index++) - ODM_SetBBReg(pDM_Odm, 0x868+index*4, bMaskDWord, 0x34343434); - - // PAGE_B for Path-B DPK setting - ODM_SetBBReg(pDM_Odm, rPdp_AntB, bMaskDWord, 0x02017098); - ODM_SetBBReg(pDM_Odm, rPdp_AntB_4, bMaskDWord, 0xf76d9f84); - ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x0004ab87); - ODM_SetBBReg(pDM_Odm, rConfig_AntB, bMaskDWord, 0x00880000); - - // RF lpbk switches on - ODM_SetBBReg(pDM_Odm, 0x840, bMaskDWord, 0x0101000f); - ODM_SetBBReg(pDM_Odm, 0x840, bMaskDWord, 0x01120103); - - //Path-B RF lpbk - ODM_SetRFReg(pDM_Odm, RF_PATH_B, 0x0c, bMaskDWord, 0x8992b); - ODM_SetRFReg(pDM_Odm, RF_PATH_B, 0x0d, bMaskDWord, 0x0e52c); - ODM_SetRFReg(pDM_Odm, RF_PATH_B, RF_AC, bMaskDWord, 0x5205a); - - //----send one shot signal----// - ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x800477c0); - ODM_delay_ms(1); - ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x000477c0); - ODM_delay_ms(50); - - while(RetryCount < DP_RETRY_LIMIT && !pDM_Odm->RFCalibrateInfo.bDPPathBOK) - { - //----read back measurement results----// - ODM_SetBBReg(pDM_Odm, rPdp_AntB, bMaskDWord, 0x0c297018); - tmpReg = ODM_GetBBReg(pDM_Odm, 0xbf0, bMaskDWord); - ODM_SetBBReg(pDM_Odm, rPdp_AntB, bMaskDWord, 0x0c29701f); - tmpReg2 = ODM_GetBBReg(pDM_Odm, 0xbf8, bMaskDWord); - - tmpReg = (tmpReg & bMaskHWord) >> 16; - tmpReg2 = (tmpReg2 & bMaskHWord) >> 16; - - if(tmpReg < 0xf0 || tmpReg > 0x105 || tmpReg2 > 0xff) - { - ODM_SetBBReg(pDM_Odm, rPdp_AntB, bMaskDWord, 0x02017098); - - ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x80000000); - ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000); - ODM_delay_ms(1); - ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x800477c0); - ODM_delay_ms(1); - ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x000477c0); - ODM_delay_ms(50); - RetryCount++; - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("path B DPK RetryCount %d 0xbf0[31:16] %x, 0xbf8[31:16] %x\n", RetryCount , tmpReg, tmpReg2)); - } - else - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("path B DPK Success\n")); - pDM_Odm->RFCalibrateInfo.bDPPathBOK = TRUE; - break; - } - } - - //DPP path B - if(pDM_Odm->RFCalibrateInfo.bDPPathBOK) - { - // DP setting - // LUT by SRAM - ODM_SetBBReg(pDM_Odm, rPdp_AntB, bMaskDWord, 0x01017098); - ODM_SetBBReg(pDM_Odm, rPdp_AntB_4, bMaskDWord, 0x776d9f84); - ODM_SetBBReg(pDM_Odm, rConfig_Pmpd_AntB, bMaskDWord, 0x0004ab87); - ODM_SetBBReg(pDM_Odm, rConfig_AntB, bMaskDWord, 0x00880000); - - ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x40000000); - for(i=0xb60; i<=0xb9c; i+=4) - { - ODM_SetBBReg(pDM_Odm, i, bMaskDWord, 0x40004000); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("path B ofsset = 0x%x\n", i)); - } - - // PWSF - ODM_SetBBReg(pDM_Odm, 0xba0, bMaskDWord, 0x40404040); - ODM_SetBBReg(pDM_Odm, 0xba4, bMaskDWord, 0x28324050); - ODM_SetBBReg(pDM_Odm, 0xba8, bMaskDWord, 0x0c141920); - - for(i=0xbac; i<=0xbbc; i+=4) - { - ODM_SetBBReg(pDM_Odm, i, bMaskDWord, 0x0c0c0c0c); - } - - // tx_agc boundary - ODM_SetBBReg(pDM_Odm, 0xbc4, bMaskDWord, 0x0005361f); - ODM_SetBBReg(pDM_Odm, rFPGA0_IQK, bMaskDWord, 0x00000000); - - } - else - { - ODM_SetBBReg(pDM_Odm, rPdp_AntB, bMaskDWord, 0x00000000); - ODM_SetBBReg(pDM_Odm, rPdp_AntB_4, bMaskDWord, 0x00000000); - } - } - - //reload BB default value - for(index=0; indexRFCalibrateInfo.bDPdone = TRUE; - ODM_RT_TRACE(pDM_Odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("<==phy_DigitalPredistortion_8814A()\n")); -#endif -} - -VOID - phy_DigitalPredistortion_8814A_8814A( -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PADAPTER pAdapter -#else - IN PDM_ODM_T pDM_Odm -#endif - ) -{ -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); -#if (DM_ODM_SUPPORT_TYPE == ODM_CE) - PDM_ODM_T pDM_Odm = &pHalData->odmpriv; -#endif -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; -#endif -#endif -#if DISABLE_BB_RF - return; -#endif - - return; - - if(pDM_Odm->RFCalibrateInfo.bDPdone) - return; -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - - if(IS_92C_SERIAL( pHalData->VersionID)){ - phy_DigitalPredistortion_8814A(pAdapter, TRUE); - } - else -#endif - { - // For 88C 1T1R - phy_DigitalPredistortion_8814A(pAdapter, FALSE); - } -} - - - -//return value TRUE => Main; FALSE => Aux - - BOOLEAN phy_QueryRFPathSwitch_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN BOOLEAN is2T - ) -{ -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); -#if (DM_ODM_SUPPORT_TYPE == ODM_CE) - PDM_ODM_T pDM_Odm = &pHalData->odmpriv; -#endif -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc; -#endif -#endif - if(!pAdapter->bHWInitReady) - { - u8 u1bTmp; - u1bTmp = ODM_Read1Byte(pDM_Odm, REG_LEDCFG2) | BIT7; - ODM_Write1Byte(pDM_Odm, REG_LEDCFG2, u1bTmp); - //ODM_SetBBReg(pDM_Odm, REG_LEDCFG0, BIT23, 0x01); - ODM_SetBBReg(pDM_Odm, rFPGA0_XAB_RFParameter, BIT13, 0x01); - } - - if(is2T) // - { - if(ODM_GetBBReg(pDM_Odm, rFPGA0_XB_RFInterfaceOE, BIT5|BIT6) == 0x01) - return TRUE; - else - return FALSE; - } - else - { - if((ODM_GetBBReg(pDM_Odm, rFPGA0_XB_RFInterfaceOE, BIT5|BIT4|BIT3) == 0x0) || - (ODM_GetBBReg(pDM_Odm, rConfig_ram64x16, BIT31) == 0x0)) - return TRUE; - else - return FALSE; - } -} - - - -//return value TRUE => Main; FALSE => Aux - BOOLEAN PHY_QueryRFPathSwitch_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm -#else - IN PADAPTER pAdapter -#endif - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - -#if DISABLE_BB_RF - return TRUE; -#endif -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - - //if(IS_92C_SERIAL( pHalData->VersionID)){ - if(IS_2T2R( pHalData->VersionID)){ - return phy_QueryRFPathSwitch_8814A(pAdapter, TRUE); - } - else -#endif - { - // For 88C 1T1R -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - return phy_QueryRFPathSwitch_8814A(pAdapter, FALSE); -#else - return phy_QueryRFPathSwitch_8814A(pDM_Odm, FALSE); -#endif - } -} -#endif - - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_ap.h b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_ap.h deleted file mode 100644 index cbb1ced957c99e..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_ap.h +++ /dev/null @@ -1,164 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -#ifndef __HAL_PHY_RF_8814A_H__ -#define __HAL_PHY_RF_8814A_H__ - -/*--------------------------Define Parameters-------------------------------*/ -#define IQK_DELAY_TIME_8814A 10 //ms -#define index_mapping_NUM_8814A 15 -#define AVG_THERMAL_NUM_8814A 4 -#define RF_T_METER_8814A 0x42 -#define MAX_PATH_NUM_8814A 4 - -#include "../halphyrf_ap.h" - - -void ConfigureTxpowerTrack_8814A( - PTXPWRTRACK_CFG pConfig - ); - -VOID -GetDeltaSwingTable_8814A( - struct dm_struct *pDM_Odm, - u8* *TemperatureUP_A, - u8* *TemperatureDOWN_A, - u8* *TemperatureUP_B, - u8* *TemperatureDOWN_B - ); - -VOID -GetDeltaSwingTable_8814A_PathCD( - struct dm_struct *pDM_Odm, - u8* *TemperatureUP_C, - u8* *TemperatureDOWN_C, - u8* *TemperatureUP_D, - u8* *TemperatureDOWN_D - ); - -VOID -ConfigureTxpowerTrack_8814A( - IN PTXPWRTRACK_CFG pConfig - ); - - -VOID -ODM_TxPwrTrackSetPwr8814A( - IN PDM_ODM_T pDM_Odm, - IN PWRTRACK_METHOD Method, - IN u1Byte RFPath, - IN u1Byte ChannelMappedIndex - ); - - -u1Byte -CheckRFGainOffset( - PDM_ODM_T pDM_Odm, - PWRTRACK_METHOD Method, - u1Byte RFPath - ); - - -// -// LC calibrate -// -void -PHY_LCCalibrate_8814A( - IN PDM_ODM_T pDM_Odm -); - -void -phy_LCCalibrate_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN BOOLEAN is2T -); - - -// -// AP calibrate -// -void -PHY_APCalibrate_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN s1Byte delta); -void -PHY_DigitalPredistortion_8814A( IN PADAPTER pAdapter); - - -#if 0 //FOR_8814_IQK -VOID -_PHY_SaveADDARegisters( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN pu4Byte ADDAReg, - IN pu4Byte ADDABackup, - IN u4Byte RegisterNum - ); - -VOID -_PHY_PathADDAOn( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN pu4Byte ADDAReg, - IN BOOLEAN isPathAOn, - IN BOOLEAN is2T - ); - -VOID -_PHY_MACSettingCalibration( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN pu4Byte MACReg, - IN pu4Byte MACBackup - ); - - - -VOID -_PHY_PathAStandBy( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm -#else - IN PADAPTER pAdapter -#endif - ); - -#endif - - -#endif // #ifndef __HAL_PHY_RF_8814A_H__ - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_win.c b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_win.c deleted file mode 100644 index eb91c4d8af7aad..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_win.c +++ /dev/null @@ -1,528 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -#include "mp_precomp.h" -#include "../phydm_precomp.h" - -#if (RTL8814A_SUPPORT == 1) - - -/*---------------------------Define Local Constant---------------------------*/ -// 2010/04/25 MH Define the max tx power tracking tx agc power. -#define ODM_TXPWRTRACK_MAX_IDX_8814A 6 - -/*---------------------------Define Local Constant---------------------------*/ - -//3============================================================ -//3 Tx Power Tracking -//3============================================================ - -// Add CheckRFGainOffset By YuChen to make sure that RF gain offset will not over upperbound 4'b1010 - -u1Byte -CheckRFGainOffset( - PDM_ODM_T pDM_Odm, - u1Byte RFPath - ) -{ - u1Byte UpperBound = 10; // 4'b1010 = 10 - u1Byte Final_RF_Index = 0; - BOOLEAN bPositive = FALSE; - PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - - if( pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] >= 0) // check if RF_Index is positive or not - { - Final_RF_Index = pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] >> 1; - bPositive = TRUE; - ODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)RFPath, rRF_TxGainOffset, BIT15, bPositive); - } - else - { - Final_RF_Index = (-1)*pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] >> 1; - bPositive = FALSE; - ODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)RFPath, rRF_TxGainOffset, BIT15, bPositive); - } - - if(bPositive == TRUE) - { - if(Final_RF_Index >= UpperBound) - { - ODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)RFPath, rRF_TxGainOffset, 0xF0000, UpperBound); //set RF Reg0x55 per path - return UpperBound; - } - else - { - ODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)RFPath, rRF_TxGainOffset, 0xF0000, Final_RF_Index); //set RF Reg0x55 per path - return Final_RF_Index; - } - } - else - { - ODM_SetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)RFPath, rRF_TxGainOffset, 0xF0000, Final_RF_Index); //set RF Reg0x55 per path - return Final_RF_Index; - - } - - return FALSE; - -} - - - - -VOID -ODM_TxPwrTrackSetPwr8814A( - PDM_ODM_T pDM_Odm, - PWRTRACK_METHOD Method, - u1Byte RFPath, - u1Byte ChannelMappedIndex - ) -{ - u1Byte Final_OFDM_Swing_Index = 0; - u1Byte Final_CCK_Swing_Index = 0; - u1Byte Final_RF_Index = 0; - u1Byte UpperBound = 10, TxScalingUpperBound = 28; // Upperbound = 4'b1010, TxScalingUpperBound = +2 dB - PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - - - if (Method == MIX_MODE) - { - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("pRFCalibrateInfo->DefaultOfdmIndex=%d, pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath]=%d, RF_Path = %d\n", - pRFCalibrateInfo->DefaultOfdmIndex, pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath], RFPath)); - - Final_CCK_Swing_Index = pRFCalibrateInfo->DefaultCckIndex + pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath]; - Final_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex + (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath])%2; - - Final_RF_Index = CheckRFGainOffset(pDM_Odm, RFPath); // check if Final_RF_Index >= 10 - - if((Final_RF_Index == UpperBound) && (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] >= 0)) // check BBSW is not over +2dB - { - Final_OFDM_Swing_Index = pRFCalibrateInfo->DefaultOfdmIndex + (pRFCalibrateInfo->Absolute_OFDMSwingIdx[RFPath] - (UpperBound << 1)); - if(Final_OFDM_Swing_Index > TxScalingUpperBound) - Final_OFDM_Swing_Index = TxScalingUpperBound; - } - - switch(RFPath) - { - case ODM_RF_PATH_A: - - ODM_SetBBReg(pDM_Odm, rA_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); //set BBswing - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("******Path_A Compensate with BBSwing , Final_OFDM_Swing_Index = %d, Final_RF_Index = %d \n", Final_OFDM_Swing_Index, Final_RF_Index)); - break; - - case ODM_RF_PATH_B: - - ODM_SetBBReg(pDM_Odm, rB_TxScale_Jaguar, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); //set BBswing - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("******Path_B Compensate with BBSwing , Final_OFDM_Swing_Index = %d, Final_RF_Index = %d \n", Final_OFDM_Swing_Index, Final_RF_Index)); - break; - - case ODM_RF_PATH_C: - - ODM_SetBBReg(pDM_Odm, rC_TxScale_Jaguar2, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); //set BBswing - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("******Path_C Compensate with BBSwing , Final_OFDM_Swing_Index = %d, Final_RF_Index = %d \n", Final_OFDM_Swing_Index, Final_RF_Index)); - break; - - case ODM_RF_PATH_D: - - ODM_SetBBReg(pDM_Odm, rD_TxScale_Jaguar2, 0xFFE00000, TxScalingTable_Jaguar[Final_OFDM_Swing_Index]); //set BBswing - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("******Path_D Compensate with BBSwing , Final_OFDM_Swing_Index = %d, Final_RF_Index = %d \n", Final_OFDM_Swing_Index, Final_RF_Index)); - break; - - default: - ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, - ("Wrong Path name!!!! \n")); - - break; - } - - - } - - return; -} // ODM_TxPwrTrackSetPwr8814A - - -VOID -GetDeltaSwingTable_8814A( - IN PDM_ODM_T pDM_Odm, - OUT pu1Byte *TemperatureUP_A, - OUT pu1Byte *TemperatureDOWN_A, - OUT pu1Byte *TemperatureUP_B, - OUT pu1Byte *TemperatureDOWN_B - ) -{ - PADAPTER Adapter = pDM_Odm->Adapter; - PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u1Byte TxRate = 0xFF; - u1Byte channel = pHalData->CurrentChannel; - - - if (pDM_Odm->mp_mode == TRUE) { - #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE)) - #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) - #if (MP_DRIVER == 1) - PMPT_CONTEXT pMptCtx = &(Adapter->MptCtx); - - TxRate = MptToMgntRate(pMptCtx->MptRateIndex); - #endif - #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) - PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.MptCtx); - - TxRate = MptToMgntRate(pMptCtx->MptRateIndex); - #endif - #endif - } else { - u2Byte rate = *(pDM_Odm->pForcedDataRate); - - if (!rate) { /*auto rate*/ - if (rate != 0xFF) { - #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) - TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate); - #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) - TxRate = HwRateToMRate(pDM_Odm->TxRate); - #endif - } - } else { /*force rate*/ - TxRate = (u1Byte)rate; - } - } - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("Power Tracking TxRate=0x%X\n", TxRate)); - - if (1 <= channel && channel <= 14) { - if (IS_CCK_RATE(TxRate)) { - *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P; - *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N; - *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P; - *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N; - } else { - *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P; - *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N; - *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P; - *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N; - } - } else if (36 <= channel && channel <= 64) { - *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[0]; - *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[0]; - *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[0]; - *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[0]; - } else if (100 <= channel && channel <= 144) { - *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[1]; - *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[1]; - *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[1]; - *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[1]; - } else if (149 <= channel && channel <= 173) { - *TemperatureUP_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[2]; - *TemperatureDOWN_A = pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[2]; - *TemperatureUP_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[2]; - *TemperatureDOWN_B = pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[2]; - } else { - *TemperatureUP_A = (pu1Byte)DeltaSwingTableIdx_2GA_P_8188E; - *TemperatureDOWN_A = (pu1Byte)DeltaSwingTableIdx_2GA_N_8188E; - *TemperatureUP_B = (pu1Byte)DeltaSwingTableIdx_2GA_P_8188E; - *TemperatureDOWN_B = (pu1Byte)DeltaSwingTableIdx_2GA_N_8188E; - } - - - return; -} - - -VOID -GetDeltaSwingTable_8814A_PathCD( - IN PDM_ODM_T pDM_Odm, - OUT pu1Byte *TemperatureUP_C, - OUT pu1Byte *TemperatureDOWN_C, - OUT pu1Byte *TemperatureUP_D, - OUT pu1Byte *TemperatureDOWN_D - ) -{ - PADAPTER Adapter = pDM_Odm->Adapter; - PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u1Byte TxRate = 0xFF; - u1Byte channel = pHalData->CurrentChannel; - - if (pDM_Odm->mp_mode == TRUE) { - #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE)) - #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) - #if (MP_DRIVER == 1) - PMPT_CONTEXT pMptCtx = &(Adapter->MptCtx); - - TxRate = MptToMgntRate(pMptCtx->MptRateIndex); - #endif - #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) - PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.MptCtx); - - TxRate = MptToMgntRate(pMptCtx->MptRateIndex); - #endif - #endif - } else { - u2Byte rate = *(pDM_Odm->pForcedDataRate); - - if (!rate) { /*auto rate*/ - if (rate != 0xFF) { - #if (DM_ODM_SUPPORT_TYPE & ODM_WIN) - TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate); - #elif (DM_ODM_SUPPORT_TYPE & ODM_CE) - TxRate = HwRateToMRate(pDM_Odm->TxRate); - #endif - } - } else { /*force rate*/ - TxRate = (u1Byte)rate; - } - } - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("Power Tracking TxRate=0x%X\n", TxRate)); - - - if ( 1 <= channel && channel <= 14) { - if (IS_CCK_RATE(TxRate)) { - *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKC_P; - *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKC_N; - *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKD_P; - *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKD_N; - } else { - *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GC_P; - *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_2GC_N; - *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GD_P; - *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_2GD_N; - } - } else if (36 <= channel && channel <= 64) { - *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P[0]; - *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N[0]; - *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P[0]; - *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N[0]; - } else if (100 <= channel && channel <= 144) { - *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P[1]; - *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N[1]; - *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P[1]; - *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N[1]; - } else if (149 <= channel && channel <= 173) { - *TemperatureUP_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_P[2]; - *TemperatureDOWN_C = pRFCalibrateInfo->DeltaSwingTableIdx_5GC_N[2]; - *TemperatureUP_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_P[2]; - *TemperatureDOWN_D = pRFCalibrateInfo->DeltaSwingTableIdx_5GD_N[2]; - } else { - *TemperatureUP_C = (pu1Byte)DeltaSwingTableIdx_2GA_P_8188E; - *TemperatureDOWN_C = (pu1Byte)DeltaSwingTableIdx_2GA_N_8188E; - *TemperatureUP_D = (pu1Byte)DeltaSwingTableIdx_2GA_P_8188E; - *TemperatureDOWN_D = (pu1Byte)DeltaSwingTableIdx_2GA_N_8188E; - } - - - return; -} - -void ConfigureTxpowerTrack_8814A( - PTXPWRTRACK_CFG pConfig - ) -{ - pConfig->SwingTableSize_CCK = CCK_TABLE_SIZE; - pConfig->SwingTableSize_OFDM = OFDM_TABLE_SIZE; - pConfig->Threshold_IQK = 8; - pConfig->AverageThermalNum = AVG_THERMAL_NUM_8814A; - pConfig->RfPathCount = MAX_PATH_NUM_8814A; - pConfig->ThermalRegAddr = RF_T_METER_88E; - - pConfig->ODM_TxPwrTrackSetPwr = ODM_TxPwrTrackSetPwr8814A; - pConfig->DoIQK = DoIQK_8814A; - pConfig->PHY_LCCalibrate = PHY_LCCalibrate_8814A; - pConfig->GetDeltaSwingTable = GetDeltaSwingTable_8814A; - pConfig->GetDeltaSwingTable8814only = GetDeltaSwingTable_8814A_PathCD; -} - -VOID -phy_LCCalibrate_8814A( - IN PDM_ODM_T pDM_Odm, - IN BOOLEAN is2T - ) -{ - u4Byte LC_Cal = 0, cnt; - - //Check continuous TX and Packet TX - u4Byte reg0x914 = ODM_Read4Byte(pDM_Odm, rSingleTone_ContTx_Jaguar);; - - // Backup RF reg18. - LC_Cal = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask); - - if((reg0x914 & 0x70000) == 0) - ODM_Write1Byte(pDM_Odm, REG_TXPAUSE_8812A, 0xFF); - - //3 3. Read RF reg18 - LC_Cal = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask); - - //3 4. Set LC calibration begin bit15 - ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, LC_Cal|0x08000); - - ODM_delay_ms(100); - - for (cnt = 0; cnt < 100; cnt++) { - if (ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, 0x8000) != 0x1) - break; - ODM_delay_ms(10); - } - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("retry cnt = %d\n", cnt)); - - - - //3 Restore original situation - if((reg0x914 & 70000) == 0) - ODM_Write1Byte(pDM_Odm, REG_TXPAUSE_8812A, 0x00); - - // Recover channel number - ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, LC_Cal); - - DbgPrint("Call %s\n", __FUNCTION__); -} - - -VOID -phy_APCalibrate_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN s1Byte delta, - IN BOOLEAN is2T - ) -{ -} - - -VOID -PHY_LCCalibrate_8814A( - IN PDM_ODM_T pDM_Odm - ) -{ - -#if !(DM_ODM_SUPPORT_TYPE & ODM_AP) - PADAPTER pAdapter = pDM_Odm->Adapter; - -#if (MP_DRIVER == 1) -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - PMPT_CONTEXT pMptCtx = &(pAdapter->MptCtx); -#else - PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx); -#endif -#endif -#endif - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("===> PHY_LCCalibrate_8814A\n")); - -//#if (MP_DRIVER == 1) - phy_LCCalibrate_8814A(pDM_Odm, TRUE); -//#endif - - ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("<=== PHY_LCCalibrate_8814A\n")); - -} - -VOID -PHY_APCalibrate_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN s1Byte delta - ) -{ - -} - - -VOID -PHY_DPCalibrate_8814A( - IN PDM_ODM_T pDM_Odm - ) -{ -} - - -BOOLEAN -phy_QueryRFPathSwitch_8814A( - IN PADAPTER pAdapter - ) -{ - return TRUE; -} - - -BOOLEAN PHY_QueryRFPathSwitch_8814A( - IN PADAPTER pAdapter - ) -{ - -#if DISABLE_BB_RF - return TRUE; -#endif - - return phy_QueryRFPathSwitch_8814A(pAdapter); -} - - -VOID phy_SetRFPathSwitch_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN BOOLEAN bMain, - IN BOOLEAN is2T - ) -{ -} -VOID PHY_SetRFPathSwitch_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN BOOLEAN bMain - ) -{ -} - - - - -#else /* (RTL8814A_SUPPORT == 0)*/ -VOID -PHY_LCCalibrate_8814A( - IN PDM_ODM_T pDM_Odm - ){} - -VOID -PHY_IQCalibrate_8814A( - IN PDM_ODM_T pDM_Odm, - IN BOOLEAN bReCovery - ){} -#endif /* (RTL8814A_SUPPORT == 0)*/ diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_win.h b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_win.h deleted file mode 100644 index 658d6f063c0fec..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/halphyrf_8814a_win.h +++ /dev/null @@ -1,106 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -#ifndef __HAL_PHY_RF_8814A_H__ -#define __HAL_PHY_RF_8814A_H__ - -/*--------------------------Define Parameters-------------------------------*/ -#define AVG_THERMAL_NUM_8814A 4 - -#include "halphyrf_win.h" - -void ConfigureTxpowerTrack_8814A( - PTXPWRTRACK_CFG pConfig - ); - -VOID -GetDeltaSwingTable_8814A( - IN PDM_ODM_T pDM_Odm, - OUT pu1Byte *TemperatureUP_A, - OUT pu1Byte *TemperatureDOWN_A, - OUT pu1Byte *TemperatureUP_B, - OUT pu1Byte *TemperatureDOWN_B - ); - -VOID -GetDeltaSwingTable_8814A_PathCD( - IN PDM_ODM_T pDM_Odm, - OUT pu1Byte *TemperatureUP_C, - OUT pu1Byte *TemperatureDOWN_C, - OUT pu1Byte *TemperatureUP_D, - OUT pu1Byte *TemperatureDOWN_D - ); - - -VOID -ODM_TxPwrTrackSetPwr8814A( - PDM_ODM_T pDM_Odm, - PWRTRACK_METHOD Method, - u1Byte RFPath, - u1Byte ChannelMappedIndex - ); - -u1Byte -CheckRFGainOffset( - PDM_ODM_T pDM_Odm, - u1Byte RFPath - ); - - -// -// LC calibrate -// -void -PHY_LCCalibrate_8814A( - IN PDM_ODM_T pDM_Odm - ); - -// -// AP calibrate -// -void -PHY_APCalibrate_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN s1Byte delta - ); - - -VOID -PHY_DPCalibrate_8814A( - IN PDM_ODM_T pDM_Odm - ); - - -VOID PHY_SetRFPathSwitch_8814A( -#if (DM_ODM_SUPPORT_TYPE & ODM_AP) - IN PDM_ODM_T pDM_Odm, -#else - IN PADAPTER pAdapter, -#endif - IN BOOLEAN bMain - ); - - -#endif // #ifndef __HAL_PHY_RF_8188E_H__ - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/phydm_regconfig8814a.c b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/phydm_regconfig8814a.c deleted file mode 100644 index 2e3f20622117cf..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/phydm_regconfig8814a.c +++ /dev/null @@ -1,219 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -#include "mp_precomp.h" -#include "../phydm_precomp.h" - -#if (RTL8814A_SUPPORT == 1) - -void -odm_ConfigRFReg_8814A( - struct dm_struct *pDM_Odm, - u32 Addr, - u32 Data, - enum rf_path RF_PATH, - u32 RegAddr - ) -{ - if(Addr == 0xfe || Addr == 0xffe) - { - #ifdef CONFIG_LONG_DELAY_ISSUE - ODM_sleep_ms(50); - #else - ODM_delay_ms(50); - #endif - } - else - { - odm_set_rf_reg(pDM_Odm, RF_PATH, RegAddr, bRFRegOffsetMask, Data); - // Add 1us delay between BB/RF register setting. - ODM_delay_us(1); - } -} - - -void -odm_ConfigRF_RadioA_8814A( - struct dm_struct *pDM_Odm, - u32 Addr, - u32 Data - ) -{ - u4Byte content = 0x1000; // RF_Content: radioa_txt - u4Byte maskforPhySet= (u4Byte)(content&0xE000); - - odm_ConfigRFReg_8814A(pDM_Odm, Addr, Data, RF_PATH_A, Addr|maskforPhySet); - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ConfigRFWithHeaderFile: [RadioA] %08X %08X\n", Addr, Data)); -} - -void -odm_ConfigRF_RadioB_8814A( - struct dm_struct *pDM_Odm, - u32 Addr, - u32 Data - ) -{ - u4Byte content = 0x1001; // RF_Content: radiob_txt - u4Byte maskforPhySet= (u4Byte)(content&0xE000); - - odm_ConfigRFReg_8814A(pDM_Odm, Addr, Data, RF_PATH_B, Addr|maskforPhySet); - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ConfigRFWithHeaderFile: [RadioB] %08X %08X\n", Addr, Data)); - -} - -void -odm_ConfigRF_RadioC_8814A( - struct dm_struct *pDM_Odm, - u32 Addr, - u32 Data - ) -{ - u4Byte content = 0x1001; // RF_Content: radiob_txt - u4Byte maskforPhySet= (u4Byte)(content&0xE000); - - odm_ConfigRFReg_8814A(pDM_Odm, Addr, Data, RF_PATH_C, Addr|maskforPhySet); - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ConfigRFWithHeaderFile: [RadioC] %08X %08X\n", Addr, Data)); - -} - -void -odm_ConfigRF_RadioD_8814A( - struct dm_struct *pDM_Odm, - u32 Addr, - u32 Data - ) -{ - u4Byte content = 0x1001; // RF_Content: radiob_txt - u4Byte maskforPhySet= (u4Byte)(content&0xE000); - - odm_ConfigRFReg_8814A(pDM_Odm, Addr, Data, RF_PATH_D, Addr|maskforPhySet); - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ConfigRFWithHeaderFile: [RadioD] %08X %08X\n", Addr, Data)); - -} - -void -odm_ConfigMAC_8814A( - struct dm_struct *pDM_Odm, - u32 Addr, - IN u1Byte Data - ) -{ - odm_write_1byte(pDM_Odm, Addr, Data); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ConfigMACWithHeaderFile: [MAC_REG] %08X %08X\n", Addr, Data)); -} - -void -odm_ConfigBB_AGC_8814A( - struct dm_struct *pDM_Odm, - u32 Addr, - u32 Bitmask, - u32 Data - ) -{ - odm_set_bb_reg(pDM_Odm, Addr, Bitmask, Data); - // Add 1us delay between BB/RF register setting. - ODM_delay_us(1); - - ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ConfigBBWithHeaderFile: [AGC_TAB] %08X %08X\n", Addr, Data)); -} - -void -odm_ConfigBB_PHY_REG_PG_8814A( - struct dm_struct *pDM_Odm, - u32 Band, - u32 RfPath, - u32 TxNum, - u32 Addr, - u32 Bitmask, - u32 Data - ) -{ - if (Addr == 0xfe || Addr == 0xffe) - #ifdef CONFIG_LONG_DELAY_ISSUE - ODM_sleep_ms(50); - #else - ODM_delay_ms(50); - #endif - else - { -#if !(DM_ODM_SUPPORT_TYPE&ODM_AP) - phy_store_tx_power_by_rate(pDM_Odm->adapter, Band, RfPath, TxNum, Addr, Bitmask, Data); -#endif - } - ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ConfigBBWithHeaderFile: [PHY_REG] %08X %08X %08X\n", Addr, Bitmask, Data)); -} - -void -odm_ConfigBB_PHY_8814A( - struct dm_struct *pDM_Odm, - u32 Addr, - u32 Bitmask, - u32 Data - ) -{ - if (Addr == 0xfe) - #ifdef CONFIG_LONG_DELAY_ISSUE - ODM_sleep_ms(50); - #else - ODM_delay_ms(50); - #endif - else if (Addr == 0xfd) - ODM_delay_ms(5); - else if (Addr == 0xfc) - ODM_delay_ms(1); - else if (Addr == 0xfb) - ODM_delay_us(50); - else if (Addr == 0xfa) - ODM_delay_us(5); - else if (Addr == 0xf9) - ODM_delay_us(1); - else - { - odm_set_bb_reg(pDM_Odm, Addr, Bitmask, Data); - } - - // Add 1us delay between BB/RF register setting. - ODM_delay_us(1); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_INIT, ODM_DBG_TRACE, ("===> ODM_ConfigBBWithHeaderFile: [PHY_REG] %08X %08X\n", Addr, Data)); -} - -void -odm_ConfigBB_TXPWR_LMT_8814A( - struct dm_struct *pDM_Odm, - u8* Regulation, - u8* Band, - u8* Bandwidth, - u8* RateSection, - u8* RfPath, - u8* Channel, - u8* PowerLimit - ) -{ -#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE)) - phy_set_tx_power_limit(pDM_Odm, Regulation, Band, - Bandwidth, RateSection, RfPath, Channel, PowerLimit); -#endif -} -#endif - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/phydm_regconfig8814a.h b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/phydm_regconfig8814a.h deleted file mode 100644 index bc3f9434e25b48..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/phydm_regconfig8814a.h +++ /dev/null @@ -1,109 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __INC_ODM_REGCONFIG_H_8814A -#define __INC_ODM_REGCONFIG_H_8814A - -#if (RTL8814A_SUPPORT == 1) - -void -odm_ConfigRFReg_8814A( - struct dm_struct *pDM_Odm, - u32 Addr, - u32 Data, - enum rf_path RF_PATH, - u32 RegAddr - ); - -void -odm_ConfigRF_RadioA_8814A( - struct dm_struct *pDM_Odm, - u32 Addr, - u32 Data - ); - -void -odm_ConfigRF_RadioB_8814A( - struct dm_struct *pDM_Odm, - u32 Addr, - u32 Data - ); - -void -odm_ConfigRF_RadioC_8814A( - struct dm_struct *pDM_Odm, - u32 Addr, - u32 Data - ); - -void -odm_ConfigRF_RadioD_8814A( - struct dm_struct *pDM_Odm, - u32 Addr, - u32 Data - ); - -void -odm_ConfigMAC_8814A( - struct dm_struct *pDM_Odm, - u32 Addr, - IN u1Byte Data - ); - -void -odm_ConfigBB_AGC_8814A( - struct dm_struct *pDM_Odm, - u32 Addr, - u32 Bitmask, - u32 Data - ); - -void -odm_ConfigBB_PHY_REG_PG_8814A( - struct dm_struct *pDM_Odm, - u32 Band, - u32 RfPath, - u32 TxNum, - u32 Addr, - u32 Bitmask, - u32 Data - ); - -void -odm_ConfigBB_PHY_8814A( - struct dm_struct *pDM_Odm, - u32 Addr, - u32 Bitmask, - u32 Data - ); - -void -odm_ConfigBB_TXPWR_LMT_8814A( - struct dm_struct *pDM_Odm, - u8* Regulation, - u8* Band, - u8* Bandwidth, - u8* RateSection, - u8* RfPath, - u8* Channel, - u8* PowerLimit - ); -#endif -#endif // end of SUPPORT - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/phydm_rtl8814a.c b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/phydm_rtl8814a.c deleted file mode 100644 index 885e063368e24d..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/phydm_rtl8814a.c +++ /dev/null @@ -1,503 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -//============================================================ -// include files -//============================================================ - -#include "mp_precomp.h" -#include "../phydm_precomp.h" - -#if (RTL8814A_SUPPORT == 1) -s8 phydm_cck_rssi_8814a(struct dm_struct *dm, u16 lna_idx, u8 vga_idx) -{ - s8 rx_pwr_all = 0; - - switch (lna_idx) { - case 7: - if (vga_idx <= 27) - rx_pwr_all = -94 + 2 * (27 - vga_idx); - else - rx_pwr_all = -94; - break; - case 6: - rx_pwr_all = -42 + 2 * (2 - vga_idx); - break; - case 5: - rx_pwr_all = -36 + 2 * (7 - vga_idx); - break; - case 4: - rx_pwr_all = -30 + 2 * (7 - vga_idx); - break; - case 3: - rx_pwr_all = -18 + 2 * (7 - vga_idx); - break; - case 2: - rx_pwr_all = 2 * (5 - vga_idx); - break; - case 1: - rx_pwr_all = 14 - 2 * vga_idx; - break; - case 0: - rx_pwr_all = 20 - 2 * vga_idx; - break; - default: - break; - } - - return rx_pwr_all; -} -#ifdef PHYDM_PRIMARY_CCA -VOID -odm_Write_Dynamic_CCA_8814A( - struct dm_struct *pDM_Odm, - u8 CurrentMFstate - ) -{ - struct phydm_pri_cca_struct* PrimaryCCA = &(pDM_Odm->dm_pri_cca); - - if (PrimaryCCA->MF_state != CurrentMFstate){ - - ODM_SetBBReg(pDM_Odm, ODM_REG_L1SBD_PD_CH_11N, BIT8|BIT7, CurrentMFstate); - } - - PrimaryCCA->MF_state = CurrentMFstate; - -} - -VOID -odm_PrimaryCCA_Check_Init_8814A( - struct dm_struct *pDM_Odm) -{ -#if ((DM_ODM_SUPPORT_TYPE == ODM_WIN) || (DM_ODM_SUPPORT_TYPE == ODM_AP)) - PADAPTER pAdapter = pDM_Odm->Adapter; - struct phydm_pri_cca_struct* PrimaryCCA = &(pDM_Odm->dm_pri_cca); - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - - pHalData->RTSEN = 0; - PrimaryCCA->DupRTS_flag = 0; - PrimaryCCA->intf_flag = 0; - PrimaryCCA->intf_type = 0; - PrimaryCCA->Monitor_flag = 0; - PrimaryCCA->PriCCA_flag = 0; - PrimaryCCA->CH_offset = 0; - PrimaryCCA->MF_state = 0; -#endif /*((DM_ODM_SUPPORT_TYPE==ODM_WIN) ||(DM_ODM_SUPPORT_TYPE==ODM_AP)) */ -} - -VOID -odm_DynamicPrimaryCCA_Check_8814A( - struct dm_struct *pDM_Odm - ) -{ - if(pDM_Odm->SupportICType != ODM_RTL8814A) - return; - - switch (pDM_Odm->SupportPlatform) - { - case ODM_WIN: - -#if(DM_ODM_SUPPORT_TYPE==ODM_WIN) - odm_DynamicPrimaryCCAMP_8814A(pDM_Odm); -#endif - break; - - case ODM_CE: -#if(DM_ODM_SUPPORT_TYPE==ODM_CE) - -#endif - break; - - case ODM_AP: -#if (DM_ODM_SUPPORT_TYPE == ODM_AP) - odm_DynamicPrimaryCCAAP_8814A(pDM_Odm); -#endif - break; - } - -} - - -#if(DM_ODM_SUPPORT_TYPE==ODM_WIN) - -VOID -odm_DynamicPrimaryCCAMP_8814A( - struct dm_struct *pDM_Odm - ) -{ - PADAPTER pAdapter = pDM_Odm->Adapter; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - PFALSE_ALARM_STATISTICS FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT); - struct phydm_pri_cca_struct* PrimaryCCA = &(pDM_Odm->dm_pri_cca); - BOOLEAN Is40MHz = FALSE; - u8Byte OFDM_CCA, OFDM_FA, BW_USC_Cnt, BW_LSC_Cnt; - u8 SecCHOffset; - u8 CurMFstate; - static u8 CountDown = Monitor_TIME; - - OFDM_CCA = FalseAlmCnt->Cnt_OFDM_CCA; - OFDM_FA = FalseAlmCnt->Cnt_Ofdm_fail; - BW_USC_Cnt = FalseAlmCnt->Cnt_BW_USC; - BW_LSC_Cnt = FalseAlmCnt->Cnt_BW_LSC; - ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("8814A: OFDM CCA=%d\n", OFDM_CCA)); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("8814A: OFDM FA=%d\n", OFDM_FA)); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("8814A: BW_USC=%d\n", BW_USC_Cnt)); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("8814A: BW_LSC=%d\n", BW_LSC_Cnt)); - Is40MHz = *(pDM_Odm->pBandWidth); - SecCHOffset = *(pDM_Odm->pSecChOffset); // NIC: 2: sec is below, 1: sec is above - //DbgPrint("8814A: SecCHOffset = %d\n", SecCHOffset); - if(!pDM_Odm->bLinked){ - return; - } - else{ - - if(Is40MHz){ - ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("8814A: Cont Down= %d\n", CountDown)); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("8814A: Primary_CCA_flag=%d\n", PrimaryCCA->PriCCA_flag)); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("8814A: Intf_Type=%d\n", PrimaryCCA->intf_type)); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("8814A: Intf_flag=%d\n", PrimaryCCA->intf_flag )); - ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("8814A: Duplicate RTS Flag=%d\n", PrimaryCCA->DupRTS_flag)); - //DbgPrint("8814A RTS_EN=%d\n", pHalData->RTSEN); - - if(PrimaryCCA->PriCCA_flag == 0){ - - if(SecCHOffset == 2){ // Primary channel is above NOTE: duplicate CTS can remove this condition - - if((OFDM_CCA > OFDMCCA_TH) && (BW_LSC_Cnt>(BW_USC_Cnt + BW_Ind_Bias)) - && (OFDM_FA>(OFDM_CCA>>1))){ - - PrimaryCCA->intf_type = 1; - PrimaryCCA->intf_flag = 1; - CurMFstate = MF_USC; - odm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate); - PrimaryCCA->PriCCA_flag = 1; - } - else if((OFDM_CCA > OFDMCCA_TH) && (BW_LSC_Cnt>(BW_USC_Cnt + BW_Ind_Bias)) - && (OFDM_FA < (OFDM_CCA>>1))){ - - PrimaryCCA->intf_type = 2; - PrimaryCCA->intf_flag = 1; - CurMFstate = MF_USC; - odm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate); - PrimaryCCA->PriCCA_flag = 1; - PrimaryCCA->DupRTS_flag = 1; - pHalData->RTSEN = 1; - } - else{ - - PrimaryCCA->intf_type = 0; - PrimaryCCA->intf_flag = 0; - CurMFstate = MF_USC_LSC; - odm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate); - pHalData->RTSEN = 0; - PrimaryCCA->DupRTS_flag = 0; - } - - } - else if (SecCHOffset == 1){ - - if((OFDM_CCA > OFDMCCA_TH) && (BW_USC_Cnt > (BW_LSC_Cnt + BW_Ind_Bias)) - && (OFDM_FA > (OFDM_CCA>>1))){ - - PrimaryCCA->intf_type = 1; - PrimaryCCA->intf_flag = 1; - CurMFstate = MF_LSC; - odm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate); - PrimaryCCA->PriCCA_flag = 1; - } - else if((OFDM_CCA > OFDMCCA_TH) && (BW_USC_Cnt>(BW_LSC_Cnt + BW_Ind_Bias)) - && (OFDM_FA < (OFDM_CCA>>1))){ - - PrimaryCCA->intf_type = 2; - PrimaryCCA->intf_flag = 1; - CurMFstate = MF_LSC; - odm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate); - PrimaryCCA->PriCCA_flag = 1; - PrimaryCCA->DupRTS_flag = 1; - pHalData->RTSEN = 1; - } - else{ - - PrimaryCCA->intf_type = 0; - PrimaryCCA->intf_flag = 0; - CurMFstate = MF_USC_LSC; - odm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate); - pHalData->RTSEN = 0; - PrimaryCCA->DupRTS_flag = 0; - } - - } - - } - else{ // PrimaryCCA->PriCCA_flag==1 - - CountDown--; - if(CountDown == 0){ - CountDown = Monitor_TIME; - PrimaryCCA->PriCCA_flag = 0; - CurMFstate = MF_USC_LSC; - odm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate); /* default*/ - pHalData->RTSEN = 0; - PrimaryCCA->DupRTS_flag = 0; - PrimaryCCA->intf_type = 0; - PrimaryCCA->intf_flag = 0; - } - - } - - } - else{ - - return; - } - } - -} - -#elif(DM_ODM_SUPPORT_TYPE == ODM_AP) - -VOID -odm_DynamicPrimaryCCAAP_8814A( - struct dm_struct *pDM_Odm - ) -{ - PADAPTER Adapter = pDM_Odm->Adapter; - prtl8192cd_priv priv = pDM_Odm->priv; - PFALSE_ALARM_STATISTICS FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT); - struct phydm_pri_cca_struct* PrimaryCCA = &(pDM_Odm->dm_pri_cca); - - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 i; - static u4Byte Count_Down = Monitor_TIME; - BOOLEAN STA_BW = FALSE, STA_BW_pre = FALSE, STA_BW_TMP = FALSE; - BOOLEAN bConnected = FALSE; - BOOLEAN Is40MHz = FALSE; - u8 SecCHOffset; - u8 CurMFstate; - PSTA_INFO_T pstat; - - Is40MHz = *(pDM_Odm->pBandWidth); - SecCHOffset = *(pDM_Odm->pSecChOffset); // AP: 1: sec is below, 2: sec is above - - - for(i=0; ipODM_StaInfo[i]; - if(IS_STA_VALID(pstat)){ - - STA_BW_TMP = pstat->tx_bw; - if(STA_BW_TMP > STA_BW){ - STA_BW = STA_BW_TMP; - } - bConnected = TRUE; - } - } - - if(Is40MHz){ - - if(PrimaryCCA->PriCCA_flag == 0){ - - if(bConnected){ - - if(STA_BW == 0){ //2 STA BW=20M - - PrimaryCCA->PriCCA_flag = 1; - if(SecCHOffset==1){ - CurMFstate = MF_USC; - odm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate); - } - else if(SecCHOffset==2){ - CurMFstate = MF_USC; - odm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate); - } - } - else{ //2 STA BW=40M - if(PrimaryCCA->intf_flag == 0){ - - odm_Intf_Detection(pDM_Odm); - } - else{ // intf_flag = 1 - - if(PrimaryCCA->intf_type == 1){ - - if(PrimaryCCA->CH_offset == 1){ - - CurMFstate = MF_USC; - if(SecCHOffset == 1){ // AP, 1: primary is above 2: primary is below - odm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate); - } - } - else if(PrimaryCCA->CH_offset == 2){ - - CurMFstate = MF_LSC; - if(SecCHOffset == 2){ - odm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate); - } - } - } - else if(PrimaryCCA->intf_type==2){ - - if(PrimaryCCA->CH_offset==1){ - - //ODM_SetBBReg(pDM_Odm, ODM_REG_L1SBD_PD_CH_11N, BIT8|BIT7, MF_USC); - pHalData->RTSEN = 1; - } - else if(PrimaryCCA->CH_offset==2){ - - //ODM_SetBBReg(pDM_Odm, ODM_REG_L1SBD_PD_CH_11N, BIT8|BIT7, MF_LSC); - pHalData->RTSEN = 1; - } - - } - } - } - - } - else{ // disconnected interference detection - - odm_Intf_Detection(pDM_Odm); - }// end of disconnected - - - } - else{ // PrimaryCCA->PriCCA_flag == 1 - - if(STA_BW==0){ - - STA_BW_pre = STA_BW; - return; - } - - Count_Down--; - if((Count_Down == 0) || ((STA_BW & STA_BW_pre) != 1)){ - - Count_Down = Monitor_TIME; - PrimaryCCA->PriCCA_flag = 0; - PrimaryCCA->intf_type = 0; - PrimaryCCA->intf_flag = 0; - CurMFstate = MF_USC_LSC; - odm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate); /* default*/ - pHalData->RTSEN = 0; - - } - - } - - STA_BW_pre = STA_BW; - - } - else{ - //2 Reset - odm_PrimaryCCA_Check_Init(pDM_Odm); - CurMFstate = MF_USC_LSC; - odm_Write_Dynamic_CCA_8814A(pDM_Odm, CurMFstate); - Count_Down = Monitor_TIME; - } - -} - - -VOID -odm_Intf_Detection_8814A( - struct dm_struct *pDM_Odm - ) -{ - PFALSE_ALARM_STATISTICS FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm, PHYDM_FALSEALMCNT); - struct phydm_pri_cca_struct* PrimaryCCA = &(pDM_Odm->dm_pri_cca); - - if((FalseAlmCnt->Cnt_OFDM_CCA>OFDMCCA_TH) - &&(FalseAlmCnt->Cnt_BW_LSC>(FalseAlmCnt->Cnt_BW_USC+BW_Ind_Bias))){ - - PrimaryCCA->intf_flag = 1; - PrimaryCCA->CH_offset = 1; // 1:LSC, 2:USC - if(FalseAlmCnt->Cnt_Ofdm_fail>(FalseAlmCnt->Cnt_OFDM_CCA>>1)){ - PrimaryCCA->intf_type = 1; - } - else{ - PrimaryCCA->intf_type = 2; - } - } - else if((FalseAlmCnt->Cnt_OFDM_CCA>OFDMCCA_TH) - &&(FalseAlmCnt->Cnt_BW_USC>(FalseAlmCnt->Cnt_BW_LSC+BW_Ind_Bias))){ - - PrimaryCCA->intf_flag = 1; - PrimaryCCA->CH_offset = 2; // 1:LSC, 2:USC - if(FalseAlmCnt->Cnt_Ofdm_fail>(FalseAlmCnt->Cnt_OFDM_CCA>>1)){ - PrimaryCCA->intf_type = 1; - } - else{ - PrimaryCCA->intf_type = 2; - } - } - else{ - PrimaryCCA->intf_flag = 0; - PrimaryCCA->intf_type = 0; - PrimaryCCA->CH_offset = 0; - } - -} - -#endif -#endif /* #ifdef PHYDM_PRIMARY_CCA */ - -u8 -phydm_spur_nbi_setting_8814a( - struct dm_struct *pDM_Odm - ) -{ - u8 set_result = 0; - - /*pDM_Odm->pChannel means central frequency, so we can use 20M as input*/ - if (pDM_Odm->rfe_type == 0 || pDM_Odm->rfe_type == 1 || pDM_Odm->rfe_type == 6) { - /*channel asked by RF Jeff*/ - if (*pDM_Odm->channel == 14) - set_result = phydm_nbi_setting(pDM_Odm, FUNC_ENABLE, *pDM_Odm->channel, 40, 2480, PHYDM_DONT_CARE); - else if (*pDM_Odm->channel >= 4 || *pDM_Odm->channel <= 8) - set_result = phydm_nbi_setting(pDM_Odm, FUNC_ENABLE, *pDM_Odm->channel, 40, 2440, PHYDM_DONT_CARE); - else - set_result = phydm_nbi_setting(pDM_Odm, FUNC_ENABLE, *pDM_Odm->channel, 40, 2440, PHYDM_DONT_CARE); - } - ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("%s, set_result = 0x%d, pChannel = %d\n", __func__, set_result, *pDM_Odm->channel)); - //printk("%s, set_result = 0x%d, pChannel = %d\n", __func__, set_result, *pDM_Odm->channel); - pDM_Odm->nbi_set_result = set_result; - return set_result; - -} - -void odm_hw_setting_8814a( - struct dm_struct *p_dm_odm - ) -{ -#ifdef PHYDM_PRIMARY_CCA - odm_PrimaryCCA_Check_Init_8814A(p_dm_odm); - odm_DynamicPrimaryCCA_Check_8814A(p_dm_odm); - odm_Intf_Detection_8814A(p_dm_odm); -#endif -} - - -#endif // RTL8814A_SUPPORT == 1 - - - - - - - - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/phydm_rtl8814a.h b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/phydm_rtl8814a.h deleted file mode 100644 index a7ff6757dfa12b..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/phydm_rtl8814a.h +++ /dev/null @@ -1,78 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#ifndef __ODM_RTL8814A_H__ -#define __ODM_RTL8814A_H__ - -#define OFDMCCA_TH 500 -#define BW_Ind_Bias 500 -#define MF_USC 2 -#define MF_LSC 1 -#define MF_USC_LSC 0 -#define Monitor_TIME 30 - -s8 phydm_cck_rssi_8814a(struct dm_struct *dm, u16 lna_idx, u8 vga_idx); - -VOID -odm_Write_Dynamic_CCA_8814A( - struct dm_struct *pDM_Odm, - u8 CurrentMFstate - ); - -VOID -odm_PrimaryCCA_Check_Init_8814A( - struct dm_struct *pDM_Odm - ); - -VOID -odm_DynamicPrimaryCCA_Check_8814A( - struct dm_struct *pDM_Odm - ); - -#if (DM_ODM_SUPPORT_TYPE == ODM_WIN) - -VOID -odm_DynamicPrimaryCCAMP_8814A( - struct dm_struct *pDM_Odm - ); - -#elif (DM_ODM_SUPPORT_TYPE == ODM_AP) - -VOID -odm_DynamicPrimaryCCAAP_8814A( - struct dm_struct *pDM_Odm - ); - -VOID -odm_Intf_Detection_8814A( - struct dm_struct *pDM_Odm - ); - -#endif - -u1Byte -phydm_spur_nbi_setting_8814a( - struct dm_struct *pDM_Odm -); - -void odm_hw_setting_8814a( - struct dm_struct *p_dm_odm - ); - -#endif diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/version_rtl8814a.h b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/version_rtl8814a.h deleted file mode 100644 index e9c28bfb7560c0..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8814a/version_rtl8814a.h +++ /dev/null @@ -1,10 +0,0 @@ -/*RTL8814A PHY Parameters*/ -/* -[Caution] - Since 01/Aug/2015, the commit rules will be simplified. - You do not need to fill up the version.h anymore, - only the maintenance supervisor fills it before formal release. -*/ -#define RELEASE_DATE_8814A 20150908 -#define COMMIT_BY_8814A "BB_LUKE" -#define RELEASE_VERSION_8814A 81 diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8821a/phydm_regconfig8821a.h b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8821a/phydm_regconfig8821a.h deleted file mode 100644 index cf5eeeb198134c..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8821a/phydm_regconfig8821a.h +++ /dev/null @@ -1,90 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2017 Realtek Corporation. - * - * 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 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 __INC_ODM_REGCONFIG_H_8821A -#define __INC_ODM_REGCONFIG_H_8821A - -#if (RTL8821A_SUPPORT == 1) - -void -odm_config_rf_reg_8821a( - struct dm_struct *dm, - u32 addr, - u32 data, - enum rf_path RF_PATH, - u32 reg_addr -); - -void -odm_config_rf_radio_a_8821a( - struct dm_struct *dm, - u32 addr, - u32 data -); - -void -odm_config_rf_radio_b_8821a( - struct dm_struct *dm, - u32 addr, - u32 data -); - -void -odm_config_mac_8821a( - struct dm_struct *dm, - u32 addr, - u8 data -); - -void -odm_config_bb_agc_8821a( - struct dm_struct *dm, - u32 addr, - u32 bitmask, - u32 data -); - -void -odm_config_bb_phy_reg_pg_8821a( - struct dm_struct *dm, - u32 band, - u32 rf_path, - u32 tx_num, - u32 addr, - u32 bitmask, - u32 data -); - -void -odm_config_bb_phy_8821a( - struct dm_struct *dm, - u32 addr, - u32 bitmask, - u32 data -); - -void -odm_config_bb_txpwr_lmt_8821a( - struct dm_struct *dm, - u8 *regulation, - u8 *band, - u8 *bandwidth, - u8 *rate_section, - u8 *rf_path, - u8 *channel, - u8 *power_limit -); - -#endif -#endif /* end of SUPPORT */ diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8821a/phydm_rtl8821a.c b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8821a/phydm_rtl8821a.c deleted file mode 100644 index 5de0754daddaf6..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/rtl8821a/phydm_rtl8821a.c +++ /dev/null @@ -1,129 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2017 Realtek Corporation. - * - * 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 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. - * - *****************************************************************************/ - -/* ************************************************************ - * include files - * ************************************************************ */ - -#include "mp_precomp.h" - -#include "../phydm_precomp.h" - -#if (RTL8821A_SUPPORT == 1) -s8 phydm_cck_rssi_8821a(struct dm_struct *dm, u16 lna_idx, u8 vga_idx) -{ - s8 rx_pwr_all = 0; - - switch (lna_idx) { - case 7: - if (vga_idx <= 27) - rx_pwr_all = -94 + 2 * (27 - vga_idx); - else - rx_pwr_all = -94; - break; - case 6: - rx_pwr_all = -42 + 2 * (2 - vga_idx); - break; - case 5: - rx_pwr_all = -36 + 2 * (7 - vga_idx); - break; - case 4: - rx_pwr_all = -30 + 2 * (7 - vga_idx); - break; - case 3: - rx_pwr_all = -18 + 2 * (7 - vga_idx); - break; - case 2: - rx_pwr_all = 2 * (5 - vga_idx); - break; - case 1: - rx_pwr_all = 14 - 2 * vga_idx; - break; - case 0: - rx_pwr_all = 20 - 2 * vga_idx; - break; - default: - break; - } - - return rx_pwr_all; -} - -void -phydm_set_ext_band_switch_8821A( - void *dm_void, - u32 band -) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - - /*Output Pin Settings*/ - odm_set_mac_reg(dm, 0x4C, BIT(23), 0); /*select DPDT_P and DPDT_N as output pin*/ - odm_set_mac_reg(dm, 0x4C, BIT(24), 1); /*by WLAN control*/ - - odm_set_bb_reg(dm, 0xCB4, 0xF, 7); /*DPDT_P = 1b'0*/ - odm_set_bb_reg(dm, 0xCB4, 0xF0, 7); /*DPDT_N = 1b'0*/ - - if (band == ODM_BAND_2_4G) { - odm_set_bb_reg(dm, 0xCB4, (BIT(29) | BIT(28)), 1); - PHYDM_DBG(dm, DBG_ANT_DIV, "***8821A set band switch = 2b'01\n"); - } else { - odm_set_bb_reg(dm, 0xCB4, BIT(29) | BIT(28), 2); - PHYDM_DBG(dm, DBG_ANT_DIV, "***8821A set band switch = 2b'10\n"); - } -} - - -void -odm_dynamic_try_state_agg_8821a( - struct dm_struct *dm -) -{ - if ((dm->support_ic_type & ODM_RTL8821) && (dm->support_interface == ODM_ITRF_USB)) { - if (dm->rssi_min > 25) - odm_write_1byte(dm, 0x4CF, 0x02); - else if (dm->rssi_min < 20) - odm_write_1byte(dm, 0x4CF, 0x00); - } -} - -void -odm_dynamic_packet_detection_th_8821a( - struct dm_struct *dm -) -{ - if (dm->support_ic_type & ODM_RTL8821) { - if (dm->rssi_min <= 25) { - /*odm_set_bb_reg(dm, REG_PWED_TH_JAGUAR, MASKDWORD, 0x2aaaf1a8);*/ - odm_set_bb_reg(dm, REG_PWED_TH_JAGUAR, 0x1ff0, 0x11a); - odm_set_bb_reg(dm, REG_BW_INDICATION_JAGUAR, BIT(26), 1); - } else if (dm->rssi_min >= 30) { - /*odm_set_bb_reg(dm, REG_PWED_TH_JAGUAR, MASKDWORD, 0x2aaaeec8);*/ - odm_set_bb_reg(dm, REG_PWED_TH_JAGUAR, 0x1ff0, 0xec); - odm_set_bb_reg(dm, REG_BW_INDICATION_JAGUAR, BIT(26), 0); - } - } -} - -void -odm_hw_setting_8821a( - struct dm_struct *dm -) -{ - odm_dynamic_try_state_agg_8821a(dm); - odm_dynamic_packet_detection_th_8821a(dm); -} - -#endif /* #if (RTL8821A_SUPPORT == 1) */ diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/txbf/phydm_hal_txbf_api.c b/drivers/net/wireless/realtek/rtl8812au/hal/phydm/txbf/phydm_hal_txbf_api.c deleted file mode 100644 index a7f7e14fb9a6f4..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/phydm/txbf/phydm_hal_txbf_api.c +++ /dev/null @@ -1,425 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2017 Realtek Corporation. - * - * 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 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. - * - *****************************************************************************/ - -#include "mp_precomp.h" -#include "phydm_precomp.h" - -#if (defined(CONFIG_BB_TXBF_API)) -#if (RTL8822B_SUPPORT == 1 || RTL8192F_SUPPORT == 1 ||\ - RTL8822C_SUPPORT == 1 || RTL8198F_SUPPORT == 1 || RTL8814B_SUPPORT == 1) -/*@Add by YuChen for 8822B MU-MIMO API*/ - -/*this function is only used for BFer*/ -u8 phydm_get_ndpa_rate(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - u8 ndpa_rate = ODM_RATE6M; - - if (dm->rssi_min >= 30) /*@link RSSI > 30%*/ - ndpa_rate = ODM_RATE24M; - else if (dm->rssi_min <= 25) - ndpa_rate = ODM_RATE6M; - - PHYDM_DBG(dm, DBG_TXBF, "[%s] ndpa_rate = 0x%x\n", __func__, ndpa_rate); - - return ndpa_rate; -} - -/*this function is only used for BFer*/ -u8 phydm_get_beamforming_sounding_info(void *dm_void, u16 *throughput, - u8 total_bfee_num, u8 *tx_rate) -{ - u8 idx = 0; - u8 snddecision = 0xff; - struct dm_struct *dm = (struct dm_struct *)dm_void; - - for (idx = 0; idx < total_bfee_num; idx++) { - if (dm->support_ic_type & (ODM_RTL8814A)) { - if ((tx_rate[idx] >= ODM_RATEVHTSS3MCS7 && - tx_rate[idx] <= ODM_RATEVHTSS3MCS9)) - snddecision = snddecision & ~(1 << idx); - } else if (dm->support_ic_type & (ODM_RTL8822B | ODM_RTL8822C | - ODM_RTL8812 | ODM_RTL8192F)) { - if ((tx_rate[idx] >= ODM_RATEVHTSS2MCS7 && - tx_rate[idx] <= ODM_RATEVHTSS2MCS9)) - snddecision = snddecision & ~(1 << idx); - } else if (dm->support_ic_type & (ODM_RTL8814B)) { - if ((tx_rate[idx] >= ODM_RATEVHTSS4MCS7 && - tx_rate[idx] <= ODM_RATEVHTSS4MCS9)) - snddecision = snddecision & ~(1 << idx); - } - } - - for (idx = 0; idx < total_bfee_num; idx++) { - if (throughput[idx] <= 10) - snddecision = snddecision & ~(1 << idx); - } - - PHYDM_DBG(dm, DBG_TXBF, "[%s] soundingdecision = 0x%x\n", __func__, - snddecision); - - return snddecision; -} - -/*this function is only used for BFer*/ -u8 phydm_get_mu_bfee_snding_decision(void *dm_void, u16 throughput) -{ - u8 snding_score = 0; - struct dm_struct *dm = (struct dm_struct *)dm_void; - - /*throughput unit is Mbps*/ - if (throughput >= 500) - snding_score = 100; - else if (throughput >= 450) - snding_score = 90; - else if (throughput >= 400) - snding_score = 80; - else if (throughput >= 350) - snding_score = 70; - else if (throughput >= 300) - snding_score = 60; - else if (throughput >= 250) - snding_score = 50; - else if (throughput >= 200) - snding_score = 40; - else if (throughput >= 150) - snding_score = 30; - else if (throughput >= 100) - snding_score = 20; - else if (throughput >= 50) - snding_score = 10; - else - snding_score = 0; - - PHYDM_DBG(dm, DBG_TXBF, "[%s] snding_score = 0x%x\n", __func__, - snding_score); - - return snding_score; -} - -#endif -#if (DM_ODM_SUPPORT_TYPE != ODM_AP) -u8 beamforming_get_htndp_tx_rate(void *dm_void, u8 bfer_str_num) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - u8 nr_index = 0; - u8 ndp_tx_rate; -/*@Find nr*/ -#if (RTL8814A_SUPPORT == 1) - if (dm->support_ic_type & ODM_RTL8814A) - nr_index = tx_bf_nr(hal_txbf_8814a_get_ntx(dm), bfer_str_num); - else -#endif - nr_index = tx_bf_nr(1, bfer_str_num); - - switch (nr_index) { - case 1: - ndp_tx_rate = ODM_MGN_MCS8; - break; - - case 2: - ndp_tx_rate = ODM_MGN_MCS16; - break; - - case 3: - ndp_tx_rate = ODM_MGN_MCS24; - break; - - default: - ndp_tx_rate = ODM_MGN_MCS8; - break; - } - - return ndp_tx_rate; -} - -u8 beamforming_get_vht_ndp_tx_rate(void *dm_void, u8 bfer_str_num) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - u8 nr_index = 0; - u8 ndp_tx_rate; -/*@Find nr*/ -#if (RTL8814A_SUPPORT == 1) - if (dm->support_ic_type & ODM_RTL8814A) - nr_index = tx_bf_nr(hal_txbf_8814a_get_ntx(dm), bfer_str_num); - else -#endif - nr_index = tx_bf_nr(1, bfer_str_num); - - switch (nr_index) { - case 1: - ndp_tx_rate = ODM_MGN_VHT2SS_MCS0; - break; - - case 2: - ndp_tx_rate = ODM_MGN_VHT3SS_MCS0; - break; - - case 3: - ndp_tx_rate = ODM_MGN_VHT4SS_MCS0; - break; - - default: - ndp_tx_rate = ODM_MGN_VHT2SS_MCS0; - break; - } - - return ndp_tx_rate; -} -#endif -#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT -/*this function is only used for BFer*/ -void phydm_txbf_rfmode(void *dm_void, u8 su_bfee_cnt, u8 mu_bfee_cnt) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - u8 i; - - if (dm->rf_type == RF_1T1R) - return; -#if (RTL8822C_SUPPORT == 1) - if (dm->support_ic_type == ODM_RTL8822C) { - if (su_bfee_cnt > 0 || mu_bfee_cnt > 0) { - for (i = RF_PATH_A; i <= RF_PATH_B; i++) { - /*RF mode table write enable*/ - odm_set_rf_reg(dm, (enum rf_path)i, RF_0xef, - BIT(19), 0x1); - /*Select RX mode*/ - odm_set_rf_reg(dm, (enum rf_path)i, RF_0x33, - 0xF, 3); - /*Set Table data*/ - odm_set_rf_reg(dm, (enum rf_path)i, RF_0x3e, - 0x3, 0x2); - /*Set Table data*/ - odm_set_rf_reg(dm, (enum rf_path)i, RF_0x3f, - 0xfffff, 0x61AFF); - /*RF mode table write disable*/ - odm_set_rf_reg(dm, (enum rf_path)i, RF_0xef, - BIT(19), 0x0); - } - } - /*@if Nsts > Nc, don't apply V matrix*/ - odm_set_bb_reg(dm, R_0x1e24, BIT(11), 1); - - if (su_bfee_cnt > 0 || mu_bfee_cnt > 0) { - /*@enable BB TxBF ant mapping register*/ - odm_set_bb_reg(dm, R_0x1e24, BIT(28) | BIT29, 0x2); - odm_set_bb_reg(dm, R_0x1e24, BIT(30), 1); - - /* logic mapping */ - /* TX BF logic map and TX path en for Nsts = 1~2 */ - odm_set_bb_reg(dm, R_0x820, 0xffff0000, 0x33); - odm_set_bb_reg(dm, R_0x1e30, 0xffff, 0x404); - } else { - /*@Disable BB TxBF ant mapping register*/ - odm_set_bb_reg(dm, R_0x1e24, BIT(28) | BIT29, 0x0); - odm_set_bb_reg(dm, R_0x1e24, BIT(31), 0); - /*@1SS~2ss A, AB*/ - odm_set_bb_reg(dm, R_0x820, 0xff, 0x31); - odm_set_bb_reg(dm, R_0x1e2c, 0xffff, 0x400); - } - } -#endif -#if (RTL8814B_SUPPORT) - if (dm->support_ic_type == ODM_RTL8814B) { - if (su_bfee_cnt > 0 || mu_bfee_cnt > 0) { - for (i = RF_PATH_A; i <= RF_PATH_D; i++) { - /*RF mode table write enable*/ - odm_set_rf_reg(dm, (enum rf_path)i, RF_0xef, - BIT(19), 0x1); - /*Select RX mode*/ - odm_set_rf_reg(dm, (enum rf_path)i, RF_0x33, - 0xF, 2); - /*Set Table data*/ - odm_set_rf_reg(dm, (enum rf_path)i, RF_0x3e, - 0xfffff, 0x3fc); - /*Set Table data*/ - odm_set_rf_reg(dm, (enum rf_path)i, RF_0x3f, - 0xfffff, 0x280f7); - /*Select RX mode*/ - odm_set_rf_reg(dm, (enum rf_path)i, RF_0x33, - 0xF, 3); - /*Set Table data*/ - odm_set_rf_reg(dm, (enum rf_path)i, RF_0x3e, - 0xfffff, 0x365); - /*Set Table data*/ - odm_set_rf_reg(dm, (enum rf_path)i, RF_0x3f, - 0xfffff, 0xafcf7); - /*RF mode table write disable*/ - odm_set_rf_reg(dm, (enum rf_path)i, RF_0xef, - BIT(19), 0x0); - } - } - /*@if Nsts > Nc, don't apply V matrix*/ - odm_set_bb_reg(dm, R_0x1e24, BIT(11), 1); - - if (su_bfee_cnt > 0 || mu_bfee_cnt > 0) { - /*@enable BB TxBF ant mapping register*/ - odm_set_bb_reg(dm, R_0x1e24, BIT(28) | BIT29, 0x2); - odm_set_bb_reg(dm, R_0x1e24, BIT(30), 1); - - /* logic mapping */ - /* TX BF logic map and TX path en for Nsts = 1~4 */ - odm_set_bb_reg(dm, R_0x820, 0xffff0000, 0xff55); - /*verification path-AC*/ - odm_set_bb_reg(dm, R_0x1e30, 0xffffffff, 0xe4e41010); - } else { - /*@Disable BB TxBF ant mapping register*/ - odm_set_bb_reg(dm, R_0x1e24, BIT(28) | BIT29, 0x0); - odm_set_bb_reg(dm, R_0x1e24, BIT(31), 0); - /*@1SS~4ss A, AB, ABC, ABCD*/ - odm_set_bb_reg(dm, R_0x820, 0xffff, 0xf731); - odm_set_bb_reg(dm, R_0x1e2c, 0xffffffff, 0xe4240400); - } - } -#endif -#if (RTL8198F_SUPPORT) - if (dm->support_ic_type == ODM_RTL8198F) { - if (su_bfee_cnt > 0 || mu_bfee_cnt > 0) { - for (i = RF_PATH_A; i <= RF_PATH_D; i++) { - /*RF mode table write enable*/ - odm_set_rf_reg(dm, (enum rf_path)i, RF_0xef, - BIT(19), 0x1); - /*Select RX mode*/ - odm_set_rf_reg(dm, (enum rf_path)i, RF_0x30, - 0xfffff, 0x18000); - /*Set Table data*/ - odm_set_rf_reg(dm, (enum rf_path)i, RF_0x31, - 0xfffff, 0x4f); - /*Select RX mode*/ - odm_set_rf_reg(dm, (enum rf_path)i, RF_0x32, - 0xfffff, 0x71fc0); - /*RF mode table write disable*/ - odm_set_rf_reg(dm, (enum rf_path)i, RF_0xef, - BIT(19), 0x0); - } - } - /*@if Nsts > Nc, don't apply V matrix*/ - odm_set_bb_reg(dm, R_0x1e24, BIT(11), 1); - - if (su_bfee_cnt > 0 || mu_bfee_cnt > 0) { - /*@enable BB TxBF ant mapping register*/ - odm_set_bb_reg(dm, R_0x1e24, BIT(28) | BIT29, 0x2); - odm_set_bb_reg(dm, R_0x1e24, BIT(30), 1); - - /* logic mapping */ - /* TX BF logic map and TX path en for Nsts = 1~4 */ - odm_set_bb_reg(dm, R_0x820, 0xffff0000, 0xffff); - odm_set_bb_reg(dm, R_0x1e30, 0xffffffff, 0xe4e4e4e4); - } else { - /*@Disable BB TxBF ant mapping register*/ - odm_set_bb_reg(dm, R_0x1e24, BIT(28) | BIT29, 0x0); - odm_set_bb_reg(dm, R_0x1e24, BIT(31), 0); - /*@1SS~4ss A, AB, ABC, ABCD*/ - odm_set_bb_reg(dm, R_0x820, 0xffff, 0xf731); - odm_set_bb_reg(dm, R_0x1e2c, 0xffffffff, 0xe4240400); - } - } -#endif -} - -void phydm_txbf_avoid_hang(void *dm_void) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - - /* avoid CCK CCA hang when the BF mode */ - odm_set_bb_reg(dm, R_0x1e6c, 0x100000, 0x1); -} - -#if (RTL8814B_SUPPORT == 1) -void phydm_txbf_80p80_rfmode(void *dm_void, u8 su_bfee_cnt, u8 mu_bfee_cnt) -{ - struct dm_struct *dm = (struct dm_struct *)dm_void; - u8 i; - - if (dm->rf_type == RF_1T1R) - return; - - if (su_bfee_cnt > 0 || mu_bfee_cnt > 0) { - for (i = RF_PATH_A; i <= RF_PATH_D; i += 3) { - /*RF mode table write enable*/ - odm_set_rf_reg(dm, (enum rf_path)i, RF_0xef, BIT(19), - 0x1); - /*Select RX mode*/ - odm_set_rf_reg(dm, (enum rf_path)i, RF_0x33, 0xF, 2); - /*Set Table data*/ - odm_set_rf_reg(dm, (enum rf_path)i, RF_0x3e, 0xfffff, - 0x3fc); - /*Set Table data*/ - odm_set_rf_reg(dm, (enum rf_path)i, RF_0x3f, 0xfffff, - 0x280f7); - /*Select RX mode*/ - odm_set_rf_reg(dm, (enum rf_path)i, RF_0x33, 0xF, 3); - /*Set Table data*/ - odm_set_rf_reg(dm, (enum rf_path)i, RF_0x3e, 0xfffff, - 0x365); - /*Set Table data*/ - odm_set_rf_reg(dm, (enum rf_path)i, RF_0x3f, 0xfffff, - 0xafcf7); - /*RF mode table write disable*/ - odm_set_rf_reg(dm, (enum rf_path)i, RF_0xef, BIT(19), - 0x0); - } - for (i = RF_PATH_B; i <= RF_PATH_C; i++) { - /*RF mode table write enable*/ - odm_set_rf_reg(dm, (enum rf_path)i, RF_0xef, BIT(19), - 0x1); - /*Select RX mode*/ - odm_set_rf_reg(dm, (enum rf_path)i, RF_0x33, 0xF, 2); - /*Set Table data*/ - odm_set_rf_reg(dm, (enum rf_path)i, RF_0x3f, 0xfffff, - 0x280c7); - /*Set Table data*/ - odm_set_rf_reg(dm, (enum rf_path)i, RF_0x3f, 0xfffff, - 0x280c7); - /*Select RX mode*/ - odm_set_rf_reg(dm, (enum rf_path)i, RF_0x33, 0xF, 3); - /*Set Table data*/ - odm_set_rf_reg(dm, (enum rf_path)i, RF_0x3e, 0xfffff, - 0x365); - /*Set Table data*/ - odm_set_rf_reg(dm, (enum rf_path)i, RF_0x3f, 0xfffff, - 0xafcc7); - /*RF mode table write disable*/ - odm_set_rf_reg(dm, (enum rf_path)i, RF_0xef, BIT(19), - 0x0); - } - } - /*@if Nsts > Nc, don't apply V matrix*/ - odm_set_bb_reg(dm, R_0x1e24, BIT(11), 1); - - if (su_bfee_cnt > 0 || mu_bfee_cnt > 0) { - /*@enable BB TxBF ant mapping register*/ - odm_set_bb_reg(dm, R_0x1e24, BIT(28) | BIT29, 0x2); - odm_set_bb_reg(dm, R_0x1e24, BIT(30), 1); - - /* logic mapping */ - /* TX BF logic map and TX path en for Nsts = 1~2 */ - odm_set_bb_reg(dm, R_0x820, 0xff0000, 0x33); /*seg0*/ - odm_set_bb_reg(dm, R_0x824, 0xff00, 0xcc); /*seg1*/ - odm_set_bb_reg(dm, R_0x1e30, 0xffff, 0xe4e4); - - } else { - /*@Disable BB TxBF ant mapping register*/ - odm_set_bb_reg(dm, R_0x1e24, BIT(28) | BIT29, 0x0); - odm_set_bb_reg(dm, R_0x1e24, BIT(31), 0); - /*@1SS~2ss A, AB*/ - odm_set_bb_reg(dm, R_0x820, 0xff, 0x31); /*seg0*/ - odm_set_bb_reg(dm, R_0x824, 0xff, 0xc8); /*seg1*/ - odm_set_bb_reg(dm, R_0x1e2c, 0xffff, 0xe420); - } -} -#endif -#endif /*PHYSTS_3RD_TYPE_IC*/ -#endif /*CONFIG_BB_TXBF_API*/ diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/Hal8814PwrSeq.c b/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/Hal8814PwrSeq.c deleted file mode 100644 index c11a36e96f777d..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/Hal8814PwrSeq.c +++ /dev/null @@ -1,98 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ - -#include "Hal8814PwrSeq.h" -#include - -/* - drivers should parse below arrays and do the corresponding actions -*/ -//3 Power on Array -WLAN_PWR_CFG rtl8814A_power_on_flow[RTL8814A_TRANS_CARDEMU_TO_ACT_STEPS+RTL8814A_TRANS_END_STEPS]= -{ - RTL8814A_TRANS_CARDEMU_TO_ACT - RTL8814A_TRANS_END -}; - -//3Radio off GPIO Array -WLAN_PWR_CFG rtl8814A_radio_off_flow[RTL8814A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8814A_TRANS_END_STEPS]= -{ - RTL8814A_TRANS_ACT_TO_CARDEMU - RTL8814A_TRANS_END -}; - -//3Card Disable Array -WLAN_PWR_CFG rtl8814A_card_disable_flow[RTL8814A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8814A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8814A_TRANS_END_STEPS]= -{ - RTL8814A_TRANS_ACT_TO_CARDEMU - RTL8814A_TRANS_CARDEMU_TO_CARDDIS - RTL8814A_TRANS_END -}; - -//3 Card Enable Array -WLAN_PWR_CFG rtl8814A_card_enable_flow[RTL8814A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8814A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8814A_TRANS_END_STEPS]= -{ - RTL8814A_TRANS_CARDDIS_TO_CARDEMU - RTL8814A_TRANS_CARDEMU_TO_ACT - RTL8814A_TRANS_END -}; - -//3Suspend Array -WLAN_PWR_CFG rtl8814A_suspend_flow[RTL8814A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8814A_TRANS_CARDEMU_TO_SUS_STEPS+RTL8814A_TRANS_END_STEPS]= -{ - RTL8814A_TRANS_ACT_TO_CARDEMU - RTL8814A_TRANS_CARDEMU_TO_SUS - RTL8814A_TRANS_END -}; - -//3 Resume Array -WLAN_PWR_CFG rtl8814A_resume_flow[RTL8814A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8814A_TRANS_CARDEMU_TO_SUS_STEPS+RTL8814A_TRANS_END_STEPS]= -{ - RTL8814A_TRANS_SUS_TO_CARDEMU - RTL8814A_TRANS_CARDEMU_TO_ACT - RTL8814A_TRANS_END -}; - - - -//3HWPDN Array -WLAN_PWR_CFG rtl8814A_hwpdn_flow[RTL8814A_TRANS_ACT_TO_CARDEMU_STEPS+RTL8814A_TRANS_CARDEMU_TO_PDN_STEPS+RTL8814A_TRANS_END_STEPS]= -{ - RTL8814A_TRANS_ACT_TO_CARDEMU - RTL8814A_TRANS_CARDEMU_TO_PDN - RTL8814A_TRANS_END -}; - -//3 Enter LPS -WLAN_PWR_CFG rtl8814A_enter_lps_flow[RTL8814A_TRANS_ACT_TO_LPS_STEPS+RTL8814A_TRANS_END_STEPS]= -{ - //FW behavior - RTL8814A_TRANS_ACT_TO_LPS - RTL8814A_TRANS_END -}; - -//3 Leave LPS -WLAN_PWR_CFG rtl8814A_leave_lps_flow[RTL8814A_TRANS_LPS_TO_ACT_STEPS+RTL8814A_TRANS_END_STEPS]= -{ - //FW behavior - RTL8814A_TRANS_LPS_TO_ACT - RTL8814A_TRANS_END -}; - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/hal8814a_fw.c b/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/hal8814a_fw.c deleted file mode 100644 index fb01dd8c5aa9af..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/hal8814a_fw.c +++ /dev/null @@ -1,7741 +0,0 @@ -/****************************************************************************** -* -* Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., -* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA -* -* -******************************************************************************/ - -#include "drv_types.h" - -#if (RTL8814A_SUPPORT == 1) -#if(DM_ODM_SUPPORT_TYPE & (ODM_AP)) - - -u8 array_mp_8814a_fw_ap[] = { -0x14, 0x88, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x42, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x0A, 0x1C, 0x13, 0x30, 0xDF, 0x07, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -0x00, 0x00, 0x20, 0x80, 0xE8, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x68, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x12, 0x80, 0x00, 0x00, 0x00, 0x80, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0x02, 0x00, 0x80, 0xF9, 0x02, 0x00, 0x80, -0x09, 0x03, 0x00, 0x80, 0x19, 0x03, 0x00, 0x80, 0x29, 0x03, 0x00, 0x80, 0x39, 0x03, 0x00, 0x80, -0x49, 0x03, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, -0x35, 0x04, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, -0x35, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x11, 0x00, 0x00, 0x06, 0x09, 0x0C, 0x12, -0x18, 0x24, 0x30, 0x36, 0x01, 0x02, 0x05, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x08, 0x03, 0x03, -0x00, 0x04, 0x09, 0x07, 0x03, 0x03, 0x00, 0x04, 0x08, 0x06, 0x03, 0x02, 0x00, 0x04, 0x08, 0x05, -0x03, 0x01, 0x00, 0x04, 0x0D, 0x0A, 0x07, 0x05, 0x00, 0x08, 0x0C, 0x0A, 0x07, 0x04, 0x00, 0x08, -0x0B, 0x0A, 0x06, 0x05, 0x00, 0x08, 0x0B, 0x0A, 0x05, 0x03, 0x00, 0x08, 0x0B, 0x0A, 0x03, 0x02, -0x00, 0x08, 0x14, 0x12, 0x0C, 0x04, 0x00, 0x10, 0x14, 0x12, 0x09, 0x04, 0x00, 0x10, 0x24, 0x22, -0x1C, 0x12, 0x00, 0x20, 0x24, 0x22, 0x18, 0x0C, 0x00, 0x20, 0x24, 0x22, 0x14, 0x06, 0x00, 0x20, -0x24, 0x22, 0x0F, 0x04, 0x00, 0x20, 0x24, 0x21, 0x0A, 0x04, 0x00, 0x20, 0x23, 0x21, 0x0C, 0x04, -0x00, 0x20, 0x23, 0x1F, 0x0A, 0x04, 0x00, 0x20, 0x22, 0x1F, 0x0F, 0x04, 0x00, 0x20, 0x21, 0x1F, -0x16, 0x0C, 0x00, 0x20, 0x31, 0x2F, 0x20, 0x14, 0x00, 0x30, 0x31, 0x2F, 0x18, 0x10, 0x00, 0x30, -0x31, 0x2C, 0x18, 0x0C, 0x00, 0x30, 0x31, 0x2A, 0x14, 0x0C, 0x00, 0x30, 0x31, 0x28, 0x14, 0x00, -0x00, 0x30, 0x31, 0x24, 0x14, 0x00, 0x00, 0x30, 0x31, 0x1E, 0x14, 0x00, 0x00, 0x30, 0x31, 0x18, -0x0A, 0x00, 0x00, 0x30, 0x02, 0x02, 0x02, 0x04, 0x02, 0x04, 0x06, 0x06, 0x08, 0x08, 0x09, 0x09, -0x04, 0x08, 0x08, 0x08, 0x0C, 0x10, 0x10, 0x18, 0x04, 0x08, 0x08, 0x08, 0x0C, 0x10, 0x10, 0x18, -0x05, 0x08, 0x08, 0x09, 0x10, 0x14, 0x1C, 0x20, 0x04, 0x06, 0x08, 0x0A, 0x10, 0x18, 0x18, 0x20, -0x03, 0x05, 0x08, 0x09, 0x10, 0x14, 0x1C, 0x24, 0x2A, 0x2C, 0x05, 0x07, 0x09, 0x0A, 0x10, 0x14, -0x1C, 0x28, 0x2C, 0x30, 0x06, 0x08, 0x0A, 0x0C, 0x12, 0x18, 0x1E, 0x30, 0x38, 0x42, 0x0A, 0x0C, -0x0C, 0x12, 0x16, 0x1C, 0x20, 0x24, 0x24, 0x30, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, 0x04, -0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x02, 0x04, 0x06, 0x07, -0x08, 0x0A, 0x0B, 0x0C, 0x03, 0x05, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x05, 0x06, 0x07, 0x08, -0x09, 0x0A, 0x0B, 0x0C, 0x02, 0x04, 0x06, 0x07, 0x08, 0x09, 0x0B, 0x0C, 0x0C, 0x0C, 0x03, 0x05, -0x06, 0x07, 0x08, 0x09, 0x0B, 0x0C, 0x0C, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, -0x0C, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0C, 0x0C, 0x01, 0x02, 0x03, 0x06, -0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x2C, 0x2D, 0xFF, 0xFF, 0x2E, 0xFF, 0xFF, 0x37, 0x2F, -0xFF, 0x41, 0x38, 0x30, 0x39, 0x42, 0x31, 0x42, 0x3A, 0x32, 0x43, 0x3A, 0x33, 0x43, 0x3A, 0x34, -0x3A, 0x44, 0x35, 0x44, 0x3B, 0xFF, 0x37, 0x2E, 0x40, 0x38, 0x30, 0x41, 0x39, 0x42, 0x31, 0x3A, -0x43, 0x32, 0x3B, 0x43, 0x35, 0x3C, 0x44, 0xFF, 0x3D, 0x45, 0xFF, 0x3E, 0x45, 0xFF, 0x45, 0x3F, -0xFF, 0x46, 0xFF, 0xFF, 0x37, 0x41, 0x2F, 0x39, 0x42, 0x31, 0x43, 0x3A, 0x33, 0x44, 0x3B, 0x35, -0x45, 0x3D, 0xFF, 0x46, 0x47, 0x3E, 0x47, 0xFF, 0xFF, 0x48, 0xFF, 0xFF, 0x49, 0xFF, 0xFF, 0xFF, -0xFF, 0xFF, 0x00, 0x00, 0x0D, 0x14, 0xFF, 0x15, 0x0E, 0xFF, 0x15, 0x0F, 0xFF, 0x16, 0x10, 0xFF, -0x17, 0x1E, 0x11, 0x1E, 0x18, 0x12, 0x1F, 0x18, 0x13, 0x18, 0x1F, 0xFF, 0x15, 0x0E, 0xFF, 0x16, -0x1D, 0x10, 0x17, 0x1E, 0x10, 0x18, 0x1E, 0x11, 0x19, 0x1F, 0xFF, 0x1A, 0x20, 0xFF, 0x21, 0x1B, -0xFF, 0x21, 0xFF, 0xFF, 0x15, 0x13, 0x0F, 0x17, 0x1E, 0x11, 0x18, 0x1F, 0x13, 0x20, 0x19, 0xFF, -0x21, 0x1B, 0xFF, 0x22, 0xFF, 0xFF, 0x23, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x02, -0x02, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x04, 0x04, 0x04, 0x2C, 0xFF, 0xFF, 0x2D, 0xFF, -0xFF, 0x2E, 0x37, 0xFF, 0x38, 0x41, 0x2F, 0x39, 0x42, 0x30, 0x43, 0x39, 0x31, 0x42, 0x39, 0x32, -0x43, 0x3A, 0x33, 0x43, 0x3A, 0x34, 0x2D, 0xFF, 0xFF, 0x36, 0x2E, 0xFF, 0x37, 0x2F, 0x40, 0x38, -0x30, 0x41, 0x42, 0x33, 0x39, 0x43, 0x35, 0x3A, 0x3B, 0x43, 0x34, 0x44, 0x3C, 0x3B, 0x45, 0x3D, -0x3C, 0x45, 0x3E, 0x3D, 0x37, 0x2E, 0xFF, 0x38, 0x2F, 0x40, 0x39, 0x31, 0x41, 0x3A, 0x42, 0xFF, -0x43, 0x3B, 0xFF, 0x44, 0x3C, 0xFF, 0x45, 0x3D, 0x3C, 0x46, 0x3F, 0x45, 0x47, 0x46, 0x45, 0x48, -0x47, 0x47, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0x0D, 0x14, 0xFF, 0x0E, 0x15, 0xFF, -0x16, 0x0F, 0xFF, 0x17, 0x10, 0xFF, 0x17, 0x11, 0xFF, 0x17, 0x12, 0xFF, 0x0D, 0x0C, 0xFF, 0x14, -0x0E, 0xFF, 0x15, 0x0F, 0xFF, 0x16, 0x1D, 0x10, 0x17, 0x1E, 0x12, 0x18, 0x1F, 0x13, 0x19, 0x20, -0x19, 0x20, 0x1A, 0x19, 0x14, 0x0E, 0xFF, 0x15, 0x1C, 0xFF, 0x17, 0x1D, 0x11, 0x18, 0x1E, 0x13, -0x19, 0x1F, 0x1E, 0x20, 0x1A, 0x1F, 0x21, 0x1B, 0x20, 0x22, 0x21, 0x1B, 0x14, 0x14, 0x15, 0x15, -0x16, 0x17, 0x17, 0x18, 0x1C, 0x1C, 0x1C, 0x1C, 0x1D, 0x1D, 0x1E, 0x1E, 0x1C, 0x1C, 0x1D, 0x1E, -0x1F, 0x20, 0x20, 0x20, 0x36, 0x36, 0x37, 0x37, 0x38, 0x39, 0x39, 0x3A, 0x3A, 0x3A, 0x00, 0x00, -0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x42, 0x42, 0x43, 0x43, 0x00, 0x00, 0x40, 0x40, 0x41, 0x42, -0x43, 0x44, 0x44, 0x44, 0x45, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x24, 0x26, 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x21, 0x25, 0x27, 0x28, 0x00, 0x00, 0x00, 0x00, -0x23, 0x26, 0x28, 0x30, 0x00, 0x00, 0x00, 0x00, 0x23, 0x26, 0x28, 0x2A, 0x00, 0x00, 0x00, 0x00, -0x23, 0x26, 0x28, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x24, 0x28, 0x2A, 0x2C, 0x2E, 0x30, 0x00, 0x00, -0x00, 0x00, 0x26, 0x29, 0x2B, 0x2D, 0x2F, 0x31, 0x00, 0x00, 0x00, 0x00, 0x28, 0x2A, 0x2C, 0x2E, -0x30, 0x32, 0x00, 0x00, 0x00, 0x1F, 0x23, 0x26, 0x28, 0x2A, 0x2A, 0x2A, 0x04, 0x00, 0x04, 0x00, -0x08, 0x00, 0x10, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x90, 0x00, -0xC0, 0x00, 0xD8, 0x00, 0x50, 0x00, 0x64, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xF0, 0x00, 0x40, 0x01, -0x90, 0x01, 0xE0, 0x01, 0xC8, 0x00, 0xF0, 0x00, 0x40, 0x01, 0x90, 0x01, 0x58, 0x02, 0x20, 0x03, -0xB0, 0x04, 0x40, 0x06, 0xC8, 0x00, 0x18, 0x01, 0xE0, 0x01, 0xF4, 0x01, 0x84, 0x03, 0x20, 0x03, -0xB0, 0x04, 0x40, 0x06, 0xC8, 0x00, 0x18, 0x01, 0xE0, 0x01, 0xD0, 0x02, 0x20, 0x03, 0xE8, 0x03, -0xB0, 0x04, 0x40, 0x06, 0x3C, 0x00, 0x64, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xF0, 0x00, 0x40, 0x01, -0x90, 0x01, 0xE0, 0x01, 0x58, 0x02, 0x20, 0x03, 0x78, 0x00, 0xF0, 0x00, 0x68, 0x01, 0xA4, 0x01, -0xE0, 0x01, 0x1C, 0x02, 0x58, 0x02, 0x20, 0x03, 0xE8, 0x03, 0xB0, 0x04, 0xB4, 0x00, 0x2C, 0x01, -0xA4, 0x01, 0xE0, 0x01, 0x1C, 0x02, 0x58, 0x02, 0x20, 0x03, 0xE8, 0x03, 0xB0, 0x04, 0x78, 0x05, -0xC8, 0x00, 0x18, 0x01, 0xE0, 0x01, 0xD0, 0x02, 0xE8, 0x03, 0xB0, 0x04, 0x40, 0x06, 0xD0, 0x07, -0xD0, 0x07, 0xD0, 0x07, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x12, 0x00, -0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x6C, 0x00, 0x28, 0x00, 0x32, 0x00, -0x3C, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x00, 0xF0, 0x00, 0x64, 0x00, 0x78, 0x00, -0xA0, 0x00, 0xC8, 0x00, 0x2C, 0x01, 0x90, 0x01, 0x58, 0x02, 0x20, 0x03, 0x64, 0x00, 0x8C, 0x00, -0xF0, 0x00, 0xFA, 0x00, 0xC2, 0x01, 0x90, 0x01, 0x58, 0x02, 0x20, 0x03, 0x64, 0x00, 0x8C, 0x00, -0xF0, 0x00, 0x68, 0x01, 0xF4, 0x01, 0x20, 0x03, 0xE8, 0x03, 0x78, 0x05, 0x1E, 0x00, 0x32, 0x00, -0x3C, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x00, 0xF0, 0x00, 0x2C, 0x01, 0x90, 0x01, -0x3C, 0x00, 0x78, 0x00, 0xB4, 0x00, 0xD2, 0x00, 0xF0, 0x00, 0x0E, 0x01, 0x2C, 0x01, 0x90, 0x01, -0xF4, 0x01, 0x58, 0x02, 0x5A, 0x00, 0x96, 0x00, 0xD2, 0x00, 0xF0, 0x00, 0x0E, 0x01, 0x2C, 0x01, -0x90, 0x01, 0xF4, 0x01, 0x58, 0x02, 0xBC, 0x02, 0x64, 0x00, 0x8C, 0x00, 0xF0, 0x00, 0x68, 0x01, -0xF4, 0x01, 0x58, 0x02, 0x20, 0x03, 0xE8, 0x03, 0xE8, 0x03, 0xE8, 0x03, 0x00, 0xF0, 0x01, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, -0x00, 0x00, 0x30, 0xC0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0E, 0x38, 0x18, 0x00, 0x00, 0x00, -0x00, 0x83, 0x01, 0x06, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x70, 0xE0, 0x00, 0x00, 0x60, 0xB8, -0x00, 0x00, 0x64, 0xB8, 0x0D, 0x00, 0x78, 0xB8, 0x12, 0x00, 0x78, 0xB8, 0x11, 0x00, 0x78, 0xB8, -0x06, 0x00, 0x78, 0xB8, 0xA7, 0x04, 0x64, 0xB8, 0xA6, 0x04, 0x64, 0xB8, 0xA5, 0x04, 0x64, 0xB8, -0xA4, 0x04, 0x64, 0xB8, 0x14, 0x00, 0x78, 0xB8, 0x09, 0x00, 0x78, 0xB8, 0x29, 0x00, 0x78, 0xB8, -0x1D, 0x04, 0x64, 0xB8, 0x22, 0x05, 0x64, 0xB8, 0x00, 0x00, 0x64, 0xB8, 0x00, 0x00, 0x60, 0xB8, -0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x42, 0xE0, 0x00, 0x60, 0xB8, 0xFF, 0xFF, 0xFF, 0xFD, -0xE3, 0x00, 0x60, 0xB8, 0x7F, 0x2E, 0x00, 0x80, 0x87, 0x2E, 0x00, 0x80, 0x8F, 0x2E, 0x00, 0x80, -0x97, 0x2E, 0x00, 0x80, 0x9F, 0x2E, 0x00, 0x80, 0xA7, 0x2E, 0x00, 0x80, 0xFF, 0xFF, 0x03, 0x00, -0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0xFF, 0xFB, 0x00, 0x00, 0x00, 0x20, -0xFF, 0xFF, 0xFF, 0xDF, 0x00, 0x00, 0x60, 0xB8, 0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x64, 0xB8, -0x04, 0x00, 0x60, 0xB8, 0x04, 0x00, 0x64, 0xB8, 0x08, 0x00, 0x60, 0xB8, 0x08, 0x00, 0x64, 0xB8, -0xF8, 0x10, 0x60, 0xB8, 0xE8, 0x12, 0x64, 0xB8, 0x80, 0x00, 0x60, 0xB8, 0x50, 0x14, 0x60, 0xB8, -0x50, 0x14, 0x64, 0xB8, 0xFC, 0x10, 0x60, 0xB8, 0xFC, 0x10, 0x60, 0xB8, 0xFA, 0xFA, 0xFA, 0xFA, -0x4C, 0x04, 0x64, 0xB8, 0x50, 0x04, 0x64, 0xB8, 0x84, 0x04, 0x64, 0xB8, 0x88, 0x04, 0x64, 0xB8, -0x8C, 0x04, 0x64, 0xB8, 0x90, 0x04, 0x64, 0xB8, 0x94, 0x04, 0x64, 0xB8, 0x98, 0x04, 0x64, 0xB8, -0x9C, 0x04, 0x64, 0xB8, 0xA0, 0x04, 0x64, 0xB8, 0xA4, 0x04, 0x64, 0xB8, 0xA8, 0x04, 0x64, 0xB8, -0xD0, 0x04, 0x64, 0xB8, 0x00, 0x0C, 0x01, 0x00, 0x00, 0x00, 0x60, 0xB8, 0x00, 0x00, 0x64, 0xB8, -0x01, 0x00, 0x66, 0xB8, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, -0x43, 0x44, 0x45, 0x46, 0x00, 0x00, 0x00, 0x00, 0x53, 0x65, 0x74, 0x5F, 0x50, 0x6E, 0x74, 0x79, -0x00, 0x00, 0x00, 0x00, 0x53, 0x65, 0x74, 0x5F, 0x52, 0x41, 0x5F, 0x55, 0x70, 0x5F, 0x72, 0x61, -0x74, 0x69, 0x6F, 0x5F, 0x66, 0x6F, 0x72, 0x5F, 0x52, 0x41, 0x5F, 0x64, 0x65, 0x62, 0x75, 0x67, -0x00, 0x00, 0x00, 0x00, 0x53, 0x65, 0x74, 0x5F, 0x44, 0x6F, 0x77, 0x6E, 0x5F, 0x72, 0x61, 0x74, -0x69, 0x6F, 0x00, 0x00, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x38, 0x3D, 0x30, 0x78, 0x25, 0x62, 0x58, -0x2C, 0x20, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x31, 0x36, 0x3D, 0x30, 0x78, 0x25, 0x77, 0x78, 0x2C, -0x20, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x33, 0x32, 0x3D, 0x30, 0x78, 0x25, 0x78, 0x00, 0x00, 0x00, -0x53, 0x65, 0x74, 0x5F, 0x43, 0x61, 0x6E, 0x64, 0x69, 0x5F, 0x33, 0x3A, 0x20, 0x5B, 0x31, 0x5D, -0x3D, 0x30, 0x78, 0x25, 0x62, 0x58, 0x2C, 0x20, 0x20, 0x5B, 0x32, 0x5D, 0x3D, 0x30, 0x78, 0x25, -0x62, 0x58, 0x2C, 0x20, 0x20, 0x5B, 0x33, 0x5D, 0x3D, 0x30, 0x78, 0x25, 0x62, 0x58, 0x00, 0x00, -0x53, 0x65, 0x74, 0x5F, 0x43, 0x61, 0x6E, 0x64, 0x69, 0x5F, 0x32, 0x3A, 0x20, 0x5B, 0x31, 0x5D, -0x3D, 0x30, 0x78, 0x25, 0x62, 0x58, 0x2C, 0x20, 0x20, 0x5B, 0x32, 0x5D, 0x3D, 0x30, 0x78, 0x25, -0x62, 0x58, 0x20, 0x00, 0x46, 0x57, 0x20, 0x74, 0x72, 0x61, 0x20, 0x65, 0x6E, 0x00, 0x00, 0x00, -0xD5, 0x76, 0x00, 0x80, 0x19, 0x77, 0x00, 0x80, 0xDF, 0x76, 0x00, 0x80, 0x11, 0x77, 0x00, 0x80, -0x19, 0x77, 0x00, 0x80, 0x19, 0x77, 0x00, 0x80, 0xE9, 0x76, 0x00, 0x80, 0xF3, 0x76, 0x00, 0x80, -0xFD, 0x76, 0x00, 0x80, 0x07, 0x77, 0x00, 0x80, 0x00, 0x04, 0x0C, 0x14, 0x1C, 0x24, 0x2C, 0x36, -0x40, 0x00, 0x00, 0x00, 0x04, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0A, 0x0A, 0x0A, 0x00, 0x00, 0x00, -0x00, 0x1C, 0x66, 0xB8, 0x04, 0x1C, 0x66, 0xB8, 0xCD, 0x9B, 0x78, 0x56, 0x00, 0x00, 0x66, 0xB8, -0x15, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x15, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, -0x05, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x05, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, -0x10, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x10, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, -0xF5, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, -0x00, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, -0x15, 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, -0x15, 0xF0, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x4F, 0x46, 0x44, 0x4D, 0x25, -0x62, 0x58, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x43, 0x43, 0x4B, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, -0x52, 0x41, 0x3A, 0x56, 0x31, 0x2D, 0x4D, 0x25, 0x62, 0x58, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x56, -0x32, 0x2D, 0x4D, 0x25, 0x62, 0x58, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x56, 0x33, 0x2D, 0x4D, 0x25, -0x62, 0x58, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x48, 0x2D, 0x4D, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, -0x52, 0x41, 0x3A, 0x48, 0x2D, 0x4D, 0x31, 0x2C, 0x25, 0x62, 0x58, 0x00, 0x52, 0x41, 0x3A, 0x48, -0x2D, 0x4D, 0x32, 0x2C, 0x25, 0x62, 0x58, 0x00, 0x5B, 0x49, 0x4E, 0x49, 0x54, 0x5F, 0x52, 0x61, -0x74, 0x65, 0x5F, 0x52, 0x53, 0x53, 0x49, 0x5D, 0x20, 0x6D, 0x61, 0x63, 0x69, 0x64, 0x3A, 0x25, -0x62, 0x78, 0x20, 0x52, 0x53, 0x53, 0x49, 0x3A, 0x25, 0x62, 0x58, 0x20, 0x52, 0x61, 0x74, 0x65, -0x3A, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, 0x00, 0xF3, 0xA3, 0x00, 0x80, 0x37, 0xA4, 0x00, 0x80, -0xF3, 0xA3, 0x00, 0x80, 0x37, 0xA4, 0x00, 0x80, 0xF3, 0xA3, 0x00, 0x80, 0x37, 0xA4, 0x00, 0x80, -0x79, 0xA4, 0x00, 0x80, 0x79, 0xA4, 0x00, 0x80, 0x79, 0xA4, 0x00, 0x80, 0x15, 0xA4, 0x00, 0x80, -0x57, 0xA4, 0x00, 0x80, 0x57, 0xA4, 0x00, 0x80, 0x15, 0xA4, 0x00, 0x80, 0x95, 0xA4, 0x00, 0x80, -0xB7, 0xA4, 0x00, 0x80, 0x52, 0x41, 0x50, 0x65, 0x6E, 0x64, 0x69, 0x6E, 0x67, 0x00, 0x00, 0x00, -0x43, 0x6E, 0x74, 0x3A, 0x20, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, 0x00, 0x46, 0x57, 0x46, 0x69, -0x78, 0x00, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x46, 0x61, 0x73, 0x74, 0x44, 0x65, 0x63, 0x69, 0x73, -0x69, 0x6F, 0x6E, 0x00, 0x46, 0x44, 0x3A, 0x20, 0x44, 0x6F, 0x77, 0x6E, 0x00, 0x00, 0x00, 0x00, -0x46, 0x44, 0x3A, 0x20, 0x44, 0x72, 0x6F, 0x70, 0x00, 0x00, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, -0x4C, 0x56, 0x31, 0x3A, 0x20, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, -0x46, 0x61, 0x69, 0x6C, 0x20, 0x4C, 0x76, 0x31, 0x00, 0x00, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, -0x46, 0x61, 0x69, 0x6C, 0x20, 0x4C, 0x76, 0x32, 0x00, 0x00, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, -0x46, 0x61, 0x69, 0x6C, 0x20, 0x4C, 0x76, 0x33, 0x00, 0x00, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, -0x55, 0x70, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, 0x55, 0x70, 0x46, 0x61, 0x69, 0x6C, 0x00, 0x00, -0x52, 0x61, 0x74, 0x65, 0x55, 0x70, 0x00, 0x00, 0x52, 0x61, 0x74, 0x65, 0x44, 0x6F, 0x77, 0x6E, -0x00, 0x00, 0x00, 0x00, 0x52, 0x61, 0x74, 0x69, 0x6F, 0x20, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, -0x4E, 0x73, 0x63, 0x20, 0x25, 0x62, 0x58, 0x2C, 0x20, 0x4E, 0x54, 0x48, 0x20, 0x25, 0x62, 0x58, -0x00, 0x00, 0x00, 0x00, 0x52, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x79, 0x00, 0x00, 0x00, 0x00, -0x52, 0x53, 0x54, 0x54, 0x78, 0x52, 0x50, 0x54, 0x00, 0x00, 0x00, 0x00, 0x53, 0x74, 0x61, 0x74, -0x65, 0x20, 0x25, 0x62, 0x58, 0x20, 0x00, 0x00, 0x72, 0x61, 0x74, 0x65, 0x3A, 0x20, 0x25, 0x62, -0x58, 0x00, 0x00, 0x00, 0x49, 0x44, 0x3A, 0x25, 0x62, 0x58, 0x00, 0x00, 0x52, 0x5B, 0x30, 0x3A, -0x34, 0x5D, 0x20, 0x25, 0x62, 0x58, 0x20, 0x2C, 0x20, 0x25, 0x62, 0x58, 0x2C, 0x20, 0x25, 0x62, -0x58, 0x2C, 0x20, 0x25, 0x62, 0x58, 0x2C, 0x20, 0x25, 0x62, 0x58, 0x20, 0x00, 0x00, 0x00, 0x00, -0x55, 0x3A, 0x20, 0x25, 0x62, 0x58, 0x20, 0x00, 0x54, 0x47, 0x3A, 0x20, 0x25, 0x62, 0x58, 0x20, -0x00, 0x00, 0x00, 0x00, 0x54, 0x47, 0x70, 0x61, 0x74, 0x68, 0x3A, 0x20, 0x25, 0x62, 0x58, 0x20, -0x00, 0x00, 0x00, 0x00, 0x53, 0x65, 0x74, 0x50, 0x61, 0x74, 0x68, 0x3A, 0x20, 0x25, 0x62, 0x58, -0x20, 0x00, 0x00, 0x00, 0x44, 0x54, 0x50, 0x5F, 0x65, 0x6E, 0x64, 0x00, 0x06, 0x06, 0x06, 0x07, -0x07, 0x07, 0x09, 0x09, 0x0C, 0x0E, 0x10, 0x12, 0x06, 0x06, 0x07, 0x0A, 0x0C, 0x0F, 0x10, 0x12, -0x07, 0x08, 0x09, 0x0A, 0x0C, 0x0F, 0x11, 0x12, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0F, 0x11, 0x13, -0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, 0x08, 0x0A, 0x0A, 0x0A, 0x0D, 0x10, 0x10, 0x11, -0x12, 0x12, 0x08, 0x0A, 0x0A, 0x0A, 0x0D, 0x10, 0x10, 0x12, 0x12, 0x13, 0x08, 0x0A, 0x0A, 0x0A, -0x0D, 0x10, 0x11, 0x12, 0x14, 0x15, 0x08, 0x0A, 0x0B, 0x0C, 0x0D, 0x0F, 0x0E, 0x0F, 0x12, 0x13, -0x28, 0x28, 0x32, 0x28, 0x1E, 0x19, 0x19, 0x19, 0x18, 0x18, 0x12, 0x0F, 0x1E, 0x1E, 0x19, 0x1E, -0x18, 0x16, 0x0C, 0x0C, 0x1E, 0x1E, 0x19, 0x1E, 0x18, 0x16, 0x0C, 0x0C, 0x1E, 0x1E, 0x19, 0x1C, -0x18, 0x14, 0x0C, 0x0A, 0x1E, 0x1E, 0x19, 0x1E, 0x19, 0x18, 0x0F, 0x0E, 0x1E, 0x1E, 0x1E, 0x1E, -0x1C, 0x16, 0x14, 0x12, 0x0C, 0x0A, 0x1E, 0x1E, 0x1E, 0x1E, 0x1A, 0x16, 0x12, 0x10, 0x0C, 0x0A, -0x1E, 0x1E, 0x1E, 0x1E, 0x18, 0x16, 0x0D, 0x0D, 0x0A, 0x08, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, -0x0A, 0x0A, 0x0A, 0x0A, 0x12, 0x12, 0x14, 0x12, 0x0F, 0x0F, 0x0C, 0x0C, 0x09, 0x08, 0x08, 0x07, -0x0A, 0x0A, 0x09, 0x07, 0x07, 0x06, 0x05, 0x04, 0x0C, 0x0C, 0x0A, 0x0A, 0x09, 0x07, 0x07, 0x06, -0x0C, 0x0C, 0x0A, 0x0A, 0x09, 0x07, 0x07, 0x06, 0x0C, 0x0C, 0x0A, 0x0A, 0x09, 0x07, 0x07, 0x06, -0x0A, 0x0A, 0x08, 0x08, 0x08, 0x07, 0x07, 0x06, 0x04, 0x04, 0x0C, 0x0C, 0x0A, 0x0A, 0x09, 0x07, -0x07, 0x06, 0x05, 0x04, 0x0C, 0x0C, 0x0A, 0x0A, 0x09, 0x07, 0x07, 0x05, 0x04, 0x04, 0x0A, 0x0A, -0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0xF0, 0x3F, 0x00, -0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0xC0, 0xFF, 0x00, 0x00, 0x00, 0xF0, 0x00, 0xFC, 0x0F, 0x00, -0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x01, 0x06, 0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x38, -0xE0, 0x80, 0x03, 0x00, 0x00, 0x00, 0x30, 0xC0, 0x00, 0x03, 0x0C, 0x00, 0x4A, 0x04, 0x64, 0xB8, -0x49, 0x04, 0x64, 0xB8, 0x00, 0x00, 0x60, 0xB8, 0x00, 0x00, 0x64, 0xB8, 0x01, 0x00, 0x60, 0xB8, -0x01, 0x00, 0x64, 0xB8, 0x02, 0x00, 0x60, 0xB8, 0x02, 0x00, 0x64, 0xB8, 0x03, 0x00, 0x60, 0xB8, -0x03, 0x00, 0x64, 0xB8, 0x00, 0x1C, 0x66, 0xB8, 0x04, 0x1C, 0x66, 0xB8, 0x00, 0x00, 0x66, 0xB8, -0x01, 0x00, 0x66, 0xB8, 0x01, 0x1C, 0x66, 0xB8, 0x02, 0x1C, 0x66, 0xB8, 0x03, 0x1C, 0x66, 0xB8, -0x05, 0x1C, 0x66, 0xB8, 0x06, 0x1C, 0x66, 0xB8, 0x07, 0x1C, 0x66, 0xB8, 0xF0, 0x10, 0x60, 0xB8, -0xF1, 0x10, 0x60, 0xB8, 0x06, 0x00, 0x66, 0xB8, 0x23, 0x04, 0x64, 0xB8, 0x30, 0x04, 0x64, 0xB8, -0x00, 0x00, 0x00, 0x02, 0x34, 0x04, 0x64, 0xB8, 0x04, 0x05, 0x07, 0x08, 0x01, 0x01, 0x01, 0x02, -0xF3, 0x10, 0x60, 0xB8, 0xF2, 0x10, 0x60, 0xB8, 0x53, 0x04, 0x64, 0xB8, 0x52, 0x04, 0x64, 0xB8, -0x50, 0x04, 0x64, 0xB8, 0x51, 0x04, 0x64, 0xB8, 0xF7, 0x10, 0x60, 0xB8, 0xF4, 0x10, 0x60, 0xB8, -0xF5, 0x10, 0x60, 0xB8, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, -0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x30, 0x00, -0x00, 0x00, 0xC0, 0x00, 0x07, 0x10, 0x66, 0xB8, 0x02, 0x10, 0x66, 0xB8, 0x00, 0x10, 0x66, 0xB8, -0x01, 0x10, 0x66, 0xB8, 0x00, 0x00, 0x66, 0xB8, 0x04, 0x10, 0x66, 0xB8, 0x05, 0x10, 0x66, 0xB8, -0x00, 0x00, 0x3C, 0x00, 0x6B, 0x01, 0x64, 0xB8, 0x68, 0x05, 0x64, 0xB8, 0xD4, 0x04, 0x64, 0xB8, -0x88, 0x04, 0x64, 0xB8, 0xD0, 0x04, 0x64, 0xB8, 0x84, 0x04, 0x64, 0xB8, 0xA9, 0x01, 0x64, 0xB8, -0x00, 0x04, 0x64, 0xB8, 0x00, 0x00, 0x40, 0x00, 0x04, 0x04, 0x64, 0xB8, 0x08, 0x04, 0x64, 0xB8, -0x0C, 0x04, 0x64, 0xB8, 0x68, 0x04, 0x64, 0xB8, 0x6C, 0x04, 0x64, 0xB8, 0x70, 0x04, 0x64, 0xB8, -0x74, 0x04, 0x64, 0xB8, 0xF8, 0x10, 0x60, 0xB8, 0x96, 0x02, 0x64, 0xB8, 0x00, 0x00, 0x70, 0xB8, -0xFF, 0xFF, 0xF0, 0xFF, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x00, 0x70, 0xB8, 0x02, 0x00, 0x70, 0xB8, -0x1C, 0x01, 0x64, 0xB8, 0xFF, 0xFF, 0x03, 0x00, 0x94, 0x02, 0x64, 0xB8, 0x97, 0x02, 0x64, 0xB8, -0x1C, 0x04, 0x64, 0xB8, 0x00, 0x00, 0x00, 0x20, 0x24, 0x04, 0x64, 0xB8, 0x30, 0x01, 0x64, 0xB8, -0xF8, 0x10, 0x60, 0xB8, 0xCC, 0x01, 0x64, 0xB8, 0x00, 0x00, 0x60, 0xB8, 0x00, 0x00, 0x64, 0xB8, -0x31, 0x00, 0x60, 0xB8, 0x32, 0x00, 0x60, 0xB8, 0x33, 0x00, 0x60, 0xB8, 0x30, 0x00, 0x60, 0xB8, -0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x60, 0xB8, 0x00, 0x00, 0x64, 0xB8, -0x64, 0x01, 0x64, 0xB8, 0x53, 0x05, 0x64, 0xB8, 0x77, 0x05, 0x64, 0xB8, 0x68, 0x05, 0x64, 0xB8, -0x51, 0x1C, 0x00, 0x80, 0x9D, 0x1C, 0x00, 0x80, 0xE9, 0x1C, 0x00, 0x80, 0x35, 0x1D, 0x00, 0x80, -0x81, 0x1D, 0x00, 0x80, 0x94, 0x01, 0x64, 0xB8, 0x00, 0x00, 0x66, 0xB8, 0x00, 0x1C, 0x66, 0xB8, -0x9A, 0x01, 0x64, 0xB8, 0x98, 0x01, 0x64, 0xB8, 0xFC, 0x10, 0x60, 0xB8, 0xF8, 0x10, 0x60, 0xB8, -0xC7, 0x01, 0x64, 0xB8, 0xC6, 0x01, 0x64, 0xB8, 0x34, 0x01, 0x64, 0xB8, 0x30, 0x01, 0x64, 0xB8, -0x24, 0x01, 0x64, 0xB8, 0x20, 0x01, 0x64, 0xB8, 0x24, 0x11, 0x64, 0xB8, 0x20, 0x11, 0x64, 0xB8, -0x2C, 0x11, 0x64, 0xB8, 0x28, 0x11, 0x64, 0xB8, 0x34, 0x11, 0x64, 0xB8, 0x30, 0x11, 0x64, 0xB8, -0x3C, 0x01, 0x64, 0xB8, 0x38, 0x01, 0x64, 0xB8, 0x3C, 0x11, 0x64, 0xB8, 0x38, 0x11, 0x64, 0xB8, -0x50, 0x00, 0x60, 0xB8, 0x54, 0x00, 0x60, 0xB8, 0xE0, 0x12, 0x64, 0xB8, 0x09, 0x02, 0x64, 0xB8, -0xFC, 0x10, 0x60, 0xB8, 0x00, 0x00, 0x78, 0xB8, 0x88, 0x00, 0x60, 0xB8, 0x06, 0x01, 0x64, 0xB8, -0xF0, 0x00, 0x60, 0xB8, 0xF8, 0x10, 0x60, 0xB8, 0x54, 0x00, 0x60, 0xB8, 0x34, 0x01, 0x64, 0xB8, -0x24, 0x01, 0x64, 0xB8, 0x24, 0x11, 0x64, 0xB8, 0x2C, 0x11, 0x64, 0xB8, 0x34, 0x11, 0x64, 0xB8, -0x3C, 0x01, 0x64, 0xB8, 0x3C, 0x11, 0x64, 0xB8, 0x00, 0x00, 0x78, 0xB8, 0x02, 0x01, 0x64, 0xB8, -0x21, 0x05, 0x64, 0xB8, 0x40, 0x11, 0x64, 0xB8, 0x44, 0x11, 0x64, 0xB8, 0x48, 0x11, 0x64, 0xB8, -0x4C, 0x11, 0x64, 0xB8, 0x68, 0x05, 0x64, 0xB8, 0x00, 0x00, 0x78, 0xB8, 0x00, 0x00, 0x64, 0xB8, -0x00, 0x28, 0x64, 0xB8, 0x00, 0x2C, 0x64, 0xB8, 0x00, 0x38, 0x64, 0xB8, 0x00, 0x3C, 0x64, 0xB8, -0xFF, 0xFF, 0x0F, 0x00, 0xFF, 0xFF, 0xFF, 0x0F, 0x04, 0x02, 0x64, 0xB8, 0x28, 0x00, 0x78, 0xB8, -0xFC, 0x10, 0x60, 0xB8, 0xF8, 0x05, 0x64, 0xB8, 0xF9, 0x05, 0x64, 0xB8, 0xFA, 0x05, 0x64, 0xB8, -0xFB, 0x05, 0x64, 0xB8, 0xF8, 0x10, 0x60, 0xB8, 0x22, 0x05, 0x64, 0xB8, 0x04, 0x02, 0x64, 0xB8, -0x7A, 0x04, 0x64, 0xB8, 0x20, 0x00, 0x78, 0xB8, 0x10, 0x00, 0x78, 0xB8, 0x03, 0x00, 0x78, 0xB8, -0xFF, 0xFF, 0x01, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x29, 0x00, 0x78, 0xB8, 0x1F, 0x07, 0x64, 0xB8, -0x1C, 0x07, 0x64, 0xB8, 0x68, 0x06, 0x64, 0xB8, 0x24, 0x00, 0x60, 0xB8, 0xFF, 0xFF, 0xCF, 0xFF, -0x5C, 0x05, 0x64, 0xB8, 0x38, 0x06, 0x64, 0xB8, 0x83, 0x04, 0x64, 0xB8, 0x54, 0x04, 0x64, 0xB8, -0xFC, 0x10, 0x60, 0xB8, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x02, -0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x08, -0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x20, -0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x80, 0x80, -0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, -0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x7E, 0x04, 0x64, 0xB8, 0x21, 0x04, 0x64, 0xB8, -0x20, 0x04, 0x64, 0xB8, 0x02, 0x10, 0x66, 0xB8, 0x00, 0x10, 0x66, 0xB8, 0x04, 0x10, 0x66, 0xB8, -0x03, 0x10, 0x66, 0xB8, 0x01, 0x10, 0x66, 0xB8, 0x05, 0x10, 0x66, 0xB8, 0x06, 0x10, 0x66, 0xB8, -0x07, 0x10, 0x66, 0xB8, 0x7D, 0x04, 0x64, 0xB8, 0x7C, 0x04, 0x64, 0xB8, 0xF4, 0x00, 0x60, 0xB8, -0x08, 0x00, 0x60, 0xB8, 0x94, 0x01, 0x64, 0xB8, 0x00, 0x01, 0x64, 0xB8, 0x9A, 0x01, 0x64, 0xB8, -0x99, 0x01, 0x64, 0xB8, 0x9B, 0x01, 0x64, 0xB8, 0x98, 0x01, 0x64, 0xB8, 0xC0, 0xA3, 0x02, 0x80, -0xC0, 0xA7, 0x02, 0x80, 0x00, 0xC0, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x18, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x58, 0xB9, 0x00, 0x65, 0x00, 0x65, 0x00, 0x65, 0x79, 0xB9, 0x00, 0x65, 0x00, 0x65, 0x00, 0x65, -0x10, 0xF0, 0x20, 0x68, 0x20, 0xF4, 0x19, 0x48, 0x00, 0x65, 0x00, 0xE8, 0x00, 0x65, 0x1A, 0xB8, -0x3B, 0xB8, 0x00, 0xBA, 0x00, 0xBA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xF0, 0x20, 0x6C, 0x0A, 0xF0, 0x00, 0x4C, 0x02, 0xF0, 0x00, 0x4C, 0xBC, 0x65, 0x00, 0xF0, -0x21, 0x6C, 0x1F, 0xF4, 0x00, 0x4C, 0x8C, 0xB9, 0x00, 0x65, 0x00, 0x65, 0x00, 0x65, 0x94, 0xB8, -0x00, 0x6D, 0xFE, 0xF7, 0x1F, 0x4D, 0xAC, 0xEC, 0x94, 0xB9, 0x00, 0x65, 0x00, 0x65, 0x00, 0xF4, -0x00, 0x6D, 0xAD, 0xEC, 0x94, 0xB9, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6C, 0x00, 0xF0, 0x00, 0x4C, -0x00, 0x6E, 0x30, 0xF0, 0x20, 0x6F, 0x00, 0xF0, 0x00, 0x4F, 0xC0, 0xDC, 0x04, 0x4C, 0xE3, 0xEC, -0xB8, 0x67, 0xFB, 0x2D, 0x30, 0xF0, 0x20, 0x6C, 0xE2, 0xF2, 0x08, 0x4C, 0x00, 0x6E, 0x30, 0xF0, -0x20, 0x6F, 0xE8, 0xF4, 0x10, 0x4F, 0xC0, 0xDC, 0x04, 0x4C, 0xE3, 0xEC, 0xB8, 0x67, 0xFB, 0x2D, -0x10, 0xF0, 0x20, 0x6C, 0x60, 0xF2, 0x1D, 0x4C, 0x00, 0xEC, 0x00, 0x00, 0xFD, 0x63, 0x05, 0x62, -0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x44, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x60, 0xF2, 0x1D, 0x4B, -0x60, 0xDA, 0x00, 0x18, 0x1B, 0x06, 0x00, 0x18, 0x33, 0x06, 0x00, 0x18, 0xC5, 0x08, 0x00, 0x18, -0x69, 0x06, 0x00, 0x18, 0xBB, 0x08, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, 0x58, 0x9A, 0x30, 0xF0, -0x20, 0x6B, 0xC0, 0xF5, 0x78, 0x9B, 0x80, 0xAB, 0xFF, 0xF7, 0x1F, 0x6B, 0x6C, 0xEC, 0x10, 0xF0, -0x00, 0x6B, 0x6B, 0xEB, 0x6D, 0xEC, 0xFF, 0xF7, 0x1F, 0x6B, 0x8C, 0xEB, 0x60, 0xCA, 0x00, 0x18, -0x46, 0x09, 0x00, 0x18, 0xE0, 0x05, 0x01, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x00, 0x18, 0xA1, 0x05, -0x00, 0x6C, 0x00, 0x18, 0x28, 0x0C, 0xFF, 0x17, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x4C, 0x01, -0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x56, 0x01, -0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x21, 0x02, -0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x32, 0x02, -0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0xD6, 0x02, -0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0xE0, 0x02, -0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x08, 0xD4, 0x30, 0xF0, 0x20, 0x6A, -0xE0, 0xF5, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xE0, 0xF5, 0x6C, 0x9B, 0x60, 0xDA, 0x48, 0xB8, -0x03, 0xD2, 0x03, 0x92, 0x07, 0xD2, 0x4D, 0xB8, 0x02, 0xD2, 0x02, 0x92, 0x06, 0xD2, 0x4E, 0xB8, -0x01, 0xD2, 0x01, 0x92, 0x05, 0xD2, 0x4C, 0xB8, 0x00, 0xD2, 0x00, 0x92, 0x04, 0xD2, 0x30, 0xF0, -0x20, 0x6A, 0xE0, 0xF5, 0x50, 0x9A, 0x08, 0x93, 0x7C, 0x4B, 0x61, 0x9B, 0x60, 0xDA, 0x30, 0xF0, -0x20, 0x6A, 0xE0, 0xF5, 0x54, 0x9A, 0x07, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, -0x58, 0x9A, 0x06, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x5C, 0x9A, 0x04, 0x93, -0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x40, 0x9A, 0x08, 0x93, 0x7B, 0x9B, 0x60, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x44, 0x9A, 0x08, 0x93, 0x7D, 0x9B, 0x60, 0xDA, 0x30, 0xF0, -0x20, 0x6A, 0x00, 0xF6, 0x48, 0x9A, 0x08, 0x93, 0x64, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, -0x00, 0xF6, 0x4C, 0x9A, 0x08, 0x93, 0x65, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, -0x50, 0x9A, 0x08, 0x93, 0x66, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x54, 0x9A, -0x08, 0x93, 0x67, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x58, 0x9A, 0x08, 0x93, -0x62, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x5C, 0x9A, 0x08, 0x93, 0x63, 0x9B, -0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, 0x40, 0x9A, 0x08, 0x93, 0x70, 0x9B, 0x60, 0xDA, -0xFF, 0x17, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x3D, 0x67, 0x00, 0xF3, 0x22, 0x31, 0x00, 0xF3, -0x20, 0x31, 0x08, 0x49, 0x42, 0xD9, 0x63, 0xD9, 0x84, 0xD9, 0xA5, 0xD9, 0xC6, 0xD9, 0xE7, 0xD9, -0x58, 0x67, 0x58, 0xD9, 0x5D, 0x67, 0x5B, 0xD9, 0x5F, 0x67, 0x5D, 0xD9, 0x12, 0xEC, 0x10, 0xED, -0xCE, 0xB8, 0x9E, 0xD9, 0xBF, 0xD9, 0x80, 0xF0, 0xC0, 0xD9, 0x0D, 0xB8, 0x7F, 0x69, 0x0C, 0xE9, -0x2D, 0x21, 0x00, 0x65, 0x3D, 0x67, 0x00, 0xF3, 0x22, 0x31, 0x00, 0xF3, 0x20, 0x31, 0x08, 0x49, -0x42, 0xD9, 0x63, 0xD9, 0x84, 0xD9, 0xA5, 0xD9, 0xC6, 0xD9, 0xE7, 0xD9, 0x58, 0x67, 0x58, 0xD9, -0x5D, 0x67, 0x5B, 0xD9, 0x5F, 0x67, 0x5D, 0xD9, 0x12, 0xEC, 0x10, 0xED, 0xCE, 0xB8, 0x9E, 0xD9, -0xBF, 0xD9, 0x80, 0xF0, 0xC0, 0xD9, 0x00, 0xF0, 0x20, 0x6D, 0xE0, 0xF6, 0x04, 0x4D, 0x00, 0x65, -0x30, 0xF0, 0x20, 0x68, 0x00, 0xF0, 0x08, 0x48, 0x18, 0x48, 0x20, 0x98, 0x00, 0x65, 0x20, 0xDD, -0x00, 0x65, 0x1D, 0x67, 0x01, 0xDD, 0x00, 0x65, 0x00, 0xE9, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x69, -0x00, 0xF0, 0x08, 0x49, 0x1F, 0xF4, 0x00, 0x6C, 0x8C, 0xE8, 0x80, 0xF2, 0x02, 0x30, 0x0B, 0x20, -0x01, 0x6A, 0x0C, 0xEA, 0x04, 0x22, 0x40, 0x99, 0x00, 0x65, 0x40, 0xEA, 0x00, 0x65, 0x06, 0x30, -0x24, 0x41, 0xF5, 0x17, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x69, 0x0A, 0xF0, 0x08, 0x49, 0x58, 0x99, -0x1A, 0x65, 0x5B, 0x99, 0xBA, 0x65, 0x5D, 0x99, 0xFA, 0x65, 0x9E, 0x99, 0xBF, 0x99, 0x32, 0xEC, -0x30, 0xED, 0x42, 0x99, 0x63, 0x99, 0x84, 0x99, 0xA5, 0x99, 0xC6, 0x99, 0xE7, 0x99, 0x80, 0xF0, -0x20, 0x99, 0xC9, 0xB9, 0x00, 0x65, 0x00, 0x65, 0x00, 0x65, 0x1A, 0xB8, 0x3B, 0xB8, 0x00, 0xBA, -0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x50, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x20, 0xF5, 0x11, 0x4B, -0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x50, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x20, 0xF5, -0x11, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x20, 0xE8, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, -0x21, 0xF6, 0x50, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x40, 0xF5, 0x19, 0x4B, 0x60, 0xDA, 0x00, 0x18, -0xF1, 0x12, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x45, 0x9A, 0x20, 0xF1, 0x1C, 0x22, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0x10, 0x6A, 0x6C, 0xEA, 0x02, 0x22, -0x00, 0x18, 0x56, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0x20, 0x6A, -0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x5A, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x65, 0x9A, 0x40, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x5B, 0x13, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0x80, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xAC, 0x17, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0xFF, 0x6A, 0x01, 0x4A, 0x6C, 0xEA, -0x02, 0x22, 0x00, 0x18, 0x5C, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, -0x00, 0xF2, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x60, 0x13, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x54, 0x9A, 0x6C, 0xEA, -0x15, 0x22, 0x00, 0x6C, 0x00, 0x18, 0x64, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x58, 0x9A, 0x6C, 0xEA, 0x04, 0x22, 0x00, 0x6C, -0x00, 0x18, 0x7C, 0x14, 0x03, 0x10, 0x00, 0x6C, 0x00, 0x18, 0x6C, 0x14, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x5C, 0x9A, 0x6C, 0xEA, -0x15, 0x22, 0x01, 0x6C, 0x00, 0x18, 0x64, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x40, 0x9A, 0x6C, 0xEA, 0x04, 0x22, 0x01, 0x6C, -0x00, 0x18, 0x7C, 0x14, 0x03, 0x10, 0x01, 0x6C, 0x00, 0x18, 0x6C, 0x14, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x44, 0x9A, 0x6C, 0xEA, -0x15, 0x22, 0x02, 0x6C, 0x00, 0x18, 0x64, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x48, 0x9A, 0x6C, 0xEA, 0x04, 0x22, 0x02, 0x6C, -0x00, 0x18, 0x7C, 0x14, 0x03, 0x10, 0x02, 0x6C, 0x00, 0x18, 0x6C, 0x14, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x4C, 0x9A, 0x6C, 0xEA, -0x15, 0x22, 0x03, 0x6C, 0x00, 0x18, 0x64, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x50, 0x9A, 0x6C, 0xEA, 0x04, 0x22, 0x03, 0x6C, -0x00, 0x18, 0x7C, 0x14, 0x03, 0x10, 0x03, 0x6C, 0x00, 0x18, 0x6C, 0x14, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x54, 0x9A, 0x6C, 0xEA, -0x15, 0x22, 0x04, 0x6C, 0x00, 0x18, 0x64, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x58, 0x9A, 0x6C, 0xEA, 0x04, 0x22, 0x04, 0x6C, -0x00, 0x18, 0x7C, 0x14, 0x03, 0x10, 0x04, 0x6C, 0x00, 0x18, 0x6C, 0x14, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x5C, 0x9A, 0x6C, 0xEA, -0x15, 0x22, 0x05, 0x6C, 0x00, 0x18, 0x64, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x40, 0x9A, 0x6C, 0xEA, 0x04, 0x22, 0x05, 0x6C, -0x00, 0x18, 0x7C, 0x14, 0x03, 0x10, 0x05, 0x6C, 0x00, 0x18, 0x6C, 0x14, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x44, 0x9A, 0x6C, 0xEA, -0x15, 0x22, 0x06, 0x6C, 0x00, 0x18, 0x64, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x48, 0x9A, 0x6C, 0xEA, 0x04, 0x22, 0x06, 0x6C, -0x00, 0x18, 0x7C, 0x14, 0x03, 0x10, 0x06, 0x6C, 0x00, 0x18, 0x6C, 0x14, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x08, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x4C, 0x9A, 0x6C, 0xEA, -0x14, 0x22, 0x07, 0x6C, 0x00, 0x18, 0x64, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x45, 0x9A, 0x00, 0x52, 0x58, 0x67, 0x04, 0x22, 0x07, 0x6C, 0x00, 0x18, 0x7C, 0x14, 0x05, 0x10, -0x07, 0x6C, 0x00, 0x18, 0x6C, 0x14, 0x01, 0x10, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0x46, 0x9A, 0x0C, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x66, 0x9A, -0x08, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x04, 0x22, 0x00, 0x18, 0x9F, 0x13, 0x01, 0x10, 0x00, 0x65, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x47, 0x9A, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x08, 0x4A, 0x47, 0x9A, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, -0x05, 0x22, 0x00, 0x6C, 0x00, 0x18, 0xA3, 0x13, 0x01, 0x10, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x08, 0x4A, 0x48, 0x9A, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, -0x03, 0x22, 0x00, 0x6C, 0x00, 0x18, 0xBF, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x50, 0x9A, -0x10, 0xF0, 0x20, 0x6B, 0x40, 0xF5, 0x19, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x05, 0x97, 0x03, 0x63, -0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x50, 0x9A, -0x10, 0xF0, 0x20, 0x6B, 0x81, 0xF0, 0x05, 0x4B, 0x60, 0xDA, 0x00, 0x18, 0xE1, 0x12, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x4D, 0x9A, 0x0B, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, -0x50, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x81, 0xF0, 0x05, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x01, 0x10, -0x00, 0x65, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, -0x21, 0xF6, 0x50, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0xC1, 0xF0, 0x09, 0x4B, 0x60, 0xDA, 0x00, 0x18, -0x38, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x51, 0x9A, 0xA0, 0xF0, 0x05, 0x22, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x51, 0x9A, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, -0xFF, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xC1, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0x71, 0x9A, 0x02, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xC2, 0x13, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x71, 0x9A, 0x04, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, -0xC3, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x71, 0x9A, 0x08, 0x6A, 0x6C, 0xEA, -0x02, 0x22, 0x00, 0x18, 0xC4, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x71, 0x9A, -0x10, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xC5, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0x71, 0x9A, 0x20, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xC6, 0x13, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x71, 0x9A, 0x40, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, -0xCA, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x71, 0x9A, 0x80, 0x6A, 0x6C, 0xEA, -0x02, 0x22, 0x00, 0x18, 0xCB, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x71, 0x9A, -0xFF, 0x6A, 0x01, 0x4A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xCC, 0x13, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x08, 0x4A, 0x71, 0x9A, 0x04, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, -0xCD, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x71, 0x9A, 0x08, 0xF0, 0x00, 0x6A, -0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xCE, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x71, 0x9A, 0x10, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xCF, 0x13, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x72, 0x9A, 0x10, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, -0x00, 0x18, 0xD8, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x72, 0x9A, 0x30, 0xF0, -0x20, 0x6A, 0x61, 0xF6, 0x50, 0x9A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xD9, 0x13, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x72, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x54, 0x9A, -0x6C, 0xEA, 0x04, 0x22, 0x00, 0x18, 0xDA, 0x13, 0x01, 0x10, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x08, 0x4A, 0x52, 0x9A, 0x80, 0xF0, 0x03, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0x72, 0x9A, 0x40, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xD0, 0x13, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x72, 0x9A, 0x80, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, -0xD1, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x72, 0x9A, 0xFF, 0x6A, 0x01, 0x4A, -0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xD2, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x72, 0x9A, 0x00, 0xF2, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xD3, 0x13, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x72, 0x9A, 0x00, 0xF4, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, -0x00, 0x18, 0xD4, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x72, 0x9A, 0x01, 0xF0, -0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xD5, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0x72, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x58, 0x9A, 0x6C, 0xEA, 0x03, 0x22, -0x00, 0x6C, 0x00, 0x18, 0xDB, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x72, 0x9A, -0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x5C, 0x9A, 0x6C, 0xEA, 0x03, 0x22, 0x01, 0x6C, 0x00, 0x18, -0xDB, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x72, 0x9A, 0x30, 0xF0, 0x20, 0x6A, -0x81, 0xF6, 0x40, 0x9A, 0x6C, 0xEA, 0x03, 0x22, 0x02, 0x6C, 0x00, 0x18, 0xDB, 0x13, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x72, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x44, 0x9A, -0x6C, 0xEA, 0x03, 0x22, 0x03, 0x6C, 0x00, 0x18, 0xDB, 0x13, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, -0x50, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0xC1, 0xF0, 0x09, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x01, 0x10, -0x00, 0x65, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x50, 0x9A, -0x10, 0xF0, 0x20, 0x6B, 0x41, 0xF3, 0x19, 0x4B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, -0x50, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x41, 0xF3, 0x19, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x20, 0xE8, -0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x50, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x81, 0xF3, 0x01, 0x4B, -0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x50, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x81, 0xF3, -0x01, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x20, 0xE8, 0xFF, 0x63, 0x02, 0xD4, 0x00, 0x6A, 0x7D, 0x67, -0x40, 0xC3, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x54, 0x9A, 0x49, 0xE3, 0x02, 0x94, -0x30, 0xF0, 0x20, 0x6B, 0x20, 0xF5, 0x74, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, -0x01, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, -0x20, 0xF5, 0x54, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0x02, 0x94, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, -0x54, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0xFB, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, -0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x58, 0x9A, 0x49, 0xE3, 0x02, 0x94, 0x30, 0xF0, -0x20, 0x6B, 0x20, 0xF5, 0x78, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x06, 0x6B, -0x6B, 0xEB, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, -0x20, 0xF5, 0x5C, 0x9A, 0x49, 0xE3, 0x02, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x20, 0xF5, 0x7C, 0x9B, -0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x1F, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, -0x60, 0xC2, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, 0x40, 0x9A, 0x49, 0xE3, 0x02, 0x94, -0x30, 0xF0, 0x20, 0x6B, 0x40, 0xF5, 0x60, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, -0x0E, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, -0x44, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, 0x48, 0x9A, 0x00, 0x6B, -0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, 0x4C, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, -0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, 0x50, 0x9A, 0x03, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, 0x02, 0x93, -0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, 0x54, 0x9A, 0x49, 0xE3, 0x02, 0x94, 0x30, 0xF0, 0x20, 0x6B, -0x40, 0xF5, 0x74, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x00, 0xF6, 0x60, 0x34, -0x00, 0xF6, 0x83, 0x34, 0x40, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x00, 0xF6, 0x60, 0x34, 0x00, 0xF6, -0x83, 0x34, 0xBD, 0x67, 0x60, 0x85, 0x8D, 0xEB, 0x00, 0xF6, 0x60, 0x34, 0x00, 0xF6, 0x83, 0x34, -0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0x44, 0x67, 0x01, 0xD5, -0x7D, 0x67, 0x40, 0xC3, 0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, 0x58, 0x9A, 0x49, 0xE3, -0x62, 0x67, 0x01, 0x94, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, 0x58, 0x9A, 0x49, 0xE4, 0x80, 0xA2, -0xFF, 0x6A, 0x8C, 0xEA, 0x3F, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x7D, 0x67, 0x40, 0xA3, 0x2A, 0x22, -0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, 0x5C, 0x9A, 0x49, 0xE3, 0x01, 0x94, 0x30, 0xF0, -0x20, 0x6B, 0x40, 0xF5, 0x7C, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x10, 0x6B, -0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, -0x58, 0x9A, 0x49, 0xE3, 0x01, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x40, 0xF5, 0x78, 0x9B, 0x6D, 0xE4, -0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x80, 0x6B, 0x6B, 0xEB, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, -0x60, 0xC2, 0x27, 0x10, 0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, 0x5C, 0x9A, 0x49, 0xE3, -0x62, 0x67, 0x01, 0x94, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF5, 0x5C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, -0xFF, 0x6A, 0x8C, 0xEA, 0xEF, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, -0x40, 0xF5, 0x58, 0x9A, 0x49, 0xE3, 0x01, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x40, 0xF5, 0x78, 0x9B, -0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x40, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, -0x60, 0xC2, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x20, 0xF0, -0x60, 0xC4, 0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x60, 0xF0, 0x50, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0x60, 0xF0, 0x70, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x40, 0x9A, 0x60, 0xA2, -0xFF, 0x6A, 0x6C, 0xEA, 0x52, 0x32, 0x9D, 0x67, 0x50, 0xC4, 0x7D, 0x67, 0x50, 0xA3, 0x34, 0x22, -0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x44, 0x9A, 0x40, 0xA2, 0x9D, 0x67, 0x51, 0xC4, 0xFF, 0x6C, -0x26, 0x6D, 0x00, 0x18, 0x1A, 0x16, 0x00, 0x18, 0xF2, 0x15, 0x01, 0x6B, 0x6E, 0xEA, 0x1D, 0x2A, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x80, 0xF4, 0x53, 0xA2, 0x62, 0x67, 0x9D, 0x67, -0x20, 0xF0, 0x44, 0xA4, 0x83, 0x67, 0x01, 0x6D, 0xC2, 0x67, 0x00, 0x6F, 0x00, 0x18, 0x25, 0x16, -0x05, 0xD2, 0x5D, 0x67, 0x20, 0xF0, 0x60, 0xA2, 0x05, 0x92, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, -0x3F, 0x03, 0x05, 0x92, 0x82, 0x67, 0x00, 0x18, 0xEA, 0x02, 0x7D, 0x67, 0x51, 0xA3, 0x82, 0x67, -0x27, 0x6D, 0x00, 0x18, 0x1A, 0x16, 0x1D, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x80, 0xF4, 0x53, 0xA2, 0x62, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x44, 0xA4, 0x83, 0x67, 0x01, 0x6D, -0xC2, 0x67, 0x00, 0x6F, 0x00, 0x18, 0x25, 0x16, 0x05, 0xD2, 0x5D, 0x67, 0x20, 0xF0, 0x60, 0xA2, -0x05, 0x92, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x3F, 0x03, 0x05, 0x92, 0x82, 0x67, 0x00, 0x18, -0xEA, 0x02, 0x00, 0x18, 0x86, 0x10, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x02, 0xD4, -0x03, 0xD5, 0x04, 0xD6, 0x02, 0x92, 0x01, 0xD2, 0x01, 0x93, 0x03, 0x6A, 0x6C, 0xEA, 0x0E, 0x2A, -0x09, 0x10, 0x01, 0x92, 0x03, 0x93, 0x60, 0xDA, 0x01, 0x92, 0x04, 0x4A, 0x01, 0xD2, 0x04, 0x92, -0xFC, 0x4A, 0x04, 0xD2, 0x04, 0x92, 0x04, 0x5A, 0x58, 0x67, 0xF3, 0x22, 0x02, 0x92, 0x00, 0xD2, -0x08, 0x10, 0x03, 0x93, 0xFF, 0x6A, 0x4C, 0xEB, 0x00, 0x92, 0x60, 0xC2, 0x00, 0x92, 0x01, 0x4A, -0x00, 0xD2, 0x00, 0x6A, 0x04, 0x93, 0x01, 0x23, 0x01, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x04, 0x93, -0xFF, 0x4B, 0x04, 0xD3, 0xEE, 0x2A, 0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x02, 0xD4, -0x45, 0x67, 0x04, 0xD6, 0x7D, 0x67, 0x4C, 0xC3, 0x02, 0x92, 0x00, 0xD2, 0x0A, 0x10, 0x00, 0x92, -0x9D, 0x67, 0x6C, 0xA4, 0x60, 0xC2, 0x00, 0x92, 0x01, 0x4A, 0x00, 0xD2, 0x04, 0x92, 0xFF, 0x4A, -0x04, 0xD2, 0x04, 0x92, 0xF4, 0x2A, 0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0xFE, 0x63, 0x04, 0xD4, -0x05, 0xD5, 0x06, 0xD6, 0x04, 0x92, 0x03, 0xD2, 0x05, 0x92, 0x02, 0xD2, 0x05, 0x93, 0x03, 0x6A, -0x6C, 0xEA, 0x16, 0x2A, 0x04, 0x93, 0x03, 0x6A, 0x6C, 0xEA, 0x12, 0x2A, 0x0D, 0x10, 0x02, 0x92, -0x60, 0x9A, 0x03, 0x92, 0x60, 0xDA, 0x03, 0x92, 0x04, 0x4A, 0x03, 0xD2, 0x02, 0x92, 0x04, 0x4A, -0x02, 0xD2, 0x06, 0x92, 0xFC, 0x4A, 0x06, 0xD2, 0x06, 0x92, 0x04, 0x5A, 0x58, 0x67, 0xEF, 0x22, -0x03, 0x92, 0x01, 0xD2, 0x02, 0x92, 0x00, 0xD2, 0x0A, 0x10, 0x00, 0x92, 0x60, 0x82, 0x01, 0x92, -0x60, 0xC2, 0x01, 0x92, 0x01, 0x4A, 0x01, 0xD2, 0x00, 0x92, 0x01, 0x4A, 0x00, 0xD2, 0x00, 0x6A, -0x06, 0x93, 0x01, 0x23, 0x01, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x06, 0x93, 0xFF, 0x4B, 0x06, 0xD3, -0xEC, 0x2A, 0x04, 0x92, 0x02, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x02, 0xD4, 0x03, 0xD5, 0x04, 0xD6, -0x02, 0x93, 0x03, 0x92, 0x63, 0xEA, 0x58, 0x67, 0x1A, 0x2A, 0x02, 0x92, 0x01, 0xD2, 0x03, 0x92, -0x00, 0xD2, 0x0A, 0x10, 0x00, 0x92, 0x60, 0x82, 0x01, 0x92, 0x60, 0xC2, 0x01, 0x92, 0x01, 0x4A, -0x01, 0xD2, 0x00, 0x92, 0x01, 0x4A, 0x00, 0xD2, 0x00, 0x6A, 0x04, 0x93, 0x01, 0x23, 0x01, 0x6A, -0xFF, 0x6B, 0x6C, 0xEA, 0x04, 0x93, 0xFF, 0x4B, 0x04, 0xD3, 0xEC, 0x2A, 0x1D, 0x10, 0x02, 0x93, -0x04, 0x92, 0x49, 0xE3, 0x01, 0xD2, 0x03, 0x93, 0x04, 0x92, 0x49, 0xE3, 0x00, 0xD2, 0x0A, 0x10, -0x01, 0x92, 0xFF, 0x4A, 0x01, 0xD2, 0x00, 0x92, 0xFF, 0x4A, 0x00, 0xD2, 0x00, 0x92, 0x60, 0x82, -0x01, 0x92, 0x60, 0xC2, 0x00, 0x6A, 0x04, 0x93, 0x01, 0x23, 0x01, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, -0x04, 0x93, 0xFF, 0x4B, 0x04, 0xD3, 0xEC, 0x2A, 0x02, 0x92, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, -0xFE, 0x63, 0x04, 0xD4, 0x05, 0xD5, 0x06, 0xD6, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0x04, 0x92, -0x02, 0xD2, 0x05, 0x92, 0x01, 0xD2, 0x15, 0x10, 0x02, 0x92, 0x60, 0xA2, 0x01, 0x92, 0x40, 0xA2, -0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, 0x40, 0x83, 0x0C, 0x2A, -0x02, 0x92, 0x01, 0x4A, 0x02, 0xD2, 0x01, 0x92, 0x01, 0x4A, 0x01, 0xD2, 0x06, 0x92, 0xFF, 0x4A, -0x06, 0xD2, 0x06, 0x92, 0xE9, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x06, 0x92, 0x02, 0x63, 0x20, 0xE8, -0xFF, 0x63, 0x02, 0xD4, 0x03, 0xD5, 0x04, 0xD6, 0x02, 0x92, 0x01, 0xD2, 0x01, 0x93, 0x04, 0x92, -0x49, 0xE3, 0x00, 0xD2, 0x0B, 0x10, 0x01, 0x92, 0x40, 0xA2, 0x62, 0x67, 0x03, 0x92, 0x6E, 0xEA, -0x02, 0x2A, 0x01, 0x92, 0x08, 0x10, 0x01, 0x92, 0x01, 0x4A, 0x01, 0xD2, 0x01, 0x93, 0x00, 0x92, -0x6E, 0xEA, 0xF1, 0x2A, 0x01, 0x92, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x02, 0xD4, -0x03, 0xD5, 0x04, 0xD6, 0x02, 0x92, 0x00, 0xD2, 0x12, 0x10, 0x03, 0x93, 0xFF, 0x6A, 0x4C, 0xEB, -0x00, 0x92, 0x40, 0xA2, 0x6E, 0xEA, 0x01, 0x5A, 0x58, 0x67, 0x62, 0x67, 0xFF, 0x6A, 0x6C, 0xEA, -0x00, 0x93, 0x01, 0x4B, 0x00, 0xD3, 0x03, 0x22, 0x00, 0x92, 0xFF, 0x4A, 0x0B, 0x10, 0x00, 0x6A, -0x04, 0x93, 0x01, 0x23, 0x01, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x04, 0x93, 0xFF, 0x4B, 0x04, 0xD3, -0xE4, 0x2A, 0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x02, 0xD4, 0x03, 0xD5, 0x46, 0x67, -0x7D, 0x67, 0x50, 0xC3, 0x02, 0x92, 0x01, 0xD2, 0x03, 0x92, 0x00, 0xD2, 0x0A, 0x10, 0x00, 0x92, -0x60, 0xA2, 0x01, 0x92, 0x60, 0xC2, 0x01, 0x92, 0x01, 0x4A, 0x01, 0xD2, 0x00, 0x92, 0x01, 0x4A, -0x00, 0xD2, 0x00, 0x6A, 0x9D, 0x67, 0x70, 0xA4, 0x01, 0x23, 0x01, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, -0x9D, 0x67, 0x70, 0xA4, 0xFF, 0x4B, 0x9D, 0x67, 0x70, 0xC4, 0xE9, 0x2A, 0x02, 0x92, 0x01, 0x63, -0x20, 0xE8, 0x00, 0x65, 0x00, 0xD4, 0x00, 0x92, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0xA0, 0xF4, 0x73, 0xC2, 0x20, 0xE8, 0xFF, 0x63, 0x44, 0x67, 0x03, 0xD5, 0x7D, 0x67, -0x44, 0xCB, 0x00, 0x6A, 0x9D, 0x67, 0x40, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x40, 0x9A, -0x7D, 0x67, 0x84, 0xAB, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, -0x64, 0x9A, 0x9D, 0x67, 0x44, 0xAC, 0x42, 0x34, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, -0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, 0x03, 0x6C, 0x8C, 0xEA, 0x30, 0xF0, -0x20, 0x6C, 0xA1, 0xF4, 0x84, 0x9C, 0xA0, 0xA4, 0xFF, 0x6C, 0xAC, 0xEC, 0x00, 0xF6, 0x80, 0x35, -0x00, 0xF6, 0xA3, 0x35, 0x04, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, -0x83, 0x34, 0x8D, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, -0x40, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x68, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, -0x48, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x7F, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x05, 0x10, -0x7D, 0x67, 0x40, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x40, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, -0x48, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, -0x00, 0x52, 0x58, 0x67, 0x05, 0x2A, 0x7D, 0x67, 0x40, 0xA3, 0x64, 0x5A, 0x58, 0x67, 0xE8, 0x2A, -0x7D, 0x67, 0x40, 0xA3, 0x64, 0x5A, 0x58, 0x67, 0x0B, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, -0x4C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x03, 0x92, 0x60, 0xC2, 0x01, 0x6A, 0x01, 0x10, -0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, -0x01, 0x6A, 0x9D, 0x67, 0x41, 0xC4, 0x5D, 0x67, 0x68, 0xA2, 0x1F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, -0x48, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x40, 0xC4, 0x12, 0x10, 0x5D, 0x67, 0x68, 0xA2, 0x9D, 0x67, -0x40, 0xA4, 0x67, 0xEA, 0x01, 0x6A, 0x6C, 0xEA, 0x05, 0x2A, 0x7D, 0x67, 0x41, 0xA3, 0x02, 0x4A, -0x9D, 0x67, 0x41, 0xC4, 0x7D, 0x67, 0x40, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x40, 0xC4, 0x7D, 0x67, -0x40, 0xA3, 0x04, 0x5A, 0x58, 0x67, 0xE9, 0x2A, 0x7D, 0x67, 0x41, 0xA3, 0x01, 0x63, 0x20, 0xE8, -0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x68, 0xC4, 0x7D, 0x67, 0x4C, 0xC3, 0x9D, 0x67, -0x4C, 0xA4, 0x06, 0x2A, 0x7D, 0x67, 0x48, 0xA3, 0x52, 0x32, 0x9D, 0x67, 0x40, 0xC4, 0x19, 0x10, -0x7D, 0x67, 0x48, 0xA3, 0x56, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, -0x63, 0x33, 0x5D, 0x67, 0x8C, 0xA2, 0xF0, 0x6A, 0x8C, 0xEA, 0x47, 0x32, 0x00, 0xF6, 0x40, 0x32, -0x00, 0xF6, 0x43, 0x32, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x7D, 0x67, -0x40, 0xC3, 0x9D, 0x67, 0x40, 0xA4, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, -0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x4C, 0x9A, 0x40, 0xA2, 0x7D, 0x67, 0x59, 0xC3, 0x00, 0x6A, -0x9D, 0x67, 0x58, 0xC4, 0x00, 0x6A, 0xBD, 0x67, 0x4D, 0xCD, 0x00, 0x6A, 0x7D, 0x67, 0x5C, 0xC3, -0x9D, 0x67, 0x5C, 0xA4, 0x01, 0x6D, 0xAE, 0xEA, 0x7D, 0x67, 0x5C, 0xC3, 0x30, 0xF0, 0x20, 0x6A, -0x41, 0xF5, 0x50, 0x9A, 0xBD, 0x67, 0x9C, 0xA5, 0x10, 0xF0, 0x20, 0x6B, 0x22, 0xF3, 0x1D, 0x4B, -0x6D, 0xE4, 0x60, 0xDA, 0x5D, 0x67, 0x6D, 0xAA, 0x00, 0xF0, 0x1D, 0x02, 0x83, 0x67, 0xA2, 0x67, -0x00, 0x18, 0x66, 0x04, 0x01, 0x6B, 0x6E, 0xEA, 0x60, 0xF1, 0x0E, 0x2A, 0x9D, 0x67, 0x58, 0xA4, -0x05, 0x2A, 0xBD, 0x67, 0x5D, 0xA5, 0xFF, 0x6B, 0x6E, 0xEA, 0x32, 0x22, 0x9D, 0x67, 0x58, 0xA4, -0x15, 0x2A, 0xBD, 0x67, 0x5D, 0xA5, 0x62, 0x67, 0x1F, 0x6A, 0x6C, 0xEA, 0x0F, 0x6B, 0x6E, 0xEA, -0x06, 0x2A, 0x9D, 0x67, 0x58, 0xA4, 0x01, 0x4A, 0xBD, 0x67, 0x58, 0xC5, 0x07, 0x10, 0x7D, 0x67, -0x5D, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xA2, 0x04, 0x9D, 0x67, 0x58, 0xC4, 0xBD, 0x67, 0x8D, 0xAD, -0x5D, 0x67, 0x7D, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x08, 0x4A, 0x49, 0xE4, 0x60, 0xC2, -0x7D, 0x67, 0x58, 0xA3, 0xFF, 0x4A, 0x9D, 0x67, 0x58, 0xC4, 0xBD, 0x67, 0x4D, 0xAD, 0x01, 0x4A, -0x7D, 0x67, 0x4D, 0xCB, 0x9D, 0x67, 0x4D, 0xAC, 0x00, 0xF4, 0x00, 0x5A, 0x58, 0x67, 0xA8, 0x2A, -0x7D, 0x67, 0x4D, 0xAB, 0x01, 0x4A, 0x9D, 0x67, 0x4B, 0xCC, 0xBD, 0x67, 0x8B, 0xAD, 0x7D, 0x67, -0x4B, 0xAB, 0x6E, 0x42, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0xA2, -0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x08, 0x4A, 0x49, 0xE4, 0x60, 0xC2, 0x9D, 0x67, 0x4B, 0xAC, -0xFF, 0x4A, 0xBD, 0x67, 0x4B, 0xCD, 0x7D, 0x67, 0x4B, 0xAB, 0x02, 0x5A, 0x58, 0x67, 0xE5, 0x22, -0x02, 0x6A, 0x7D, 0x67, 0x4B, 0xCB, 0x02, 0x6A, 0x9D, 0x67, 0x49, 0xCC, 0x00, 0x6A, 0xBD, 0x67, -0x50, 0xC5, 0x00, 0x6A, 0x7D, 0x67, 0x5C, 0xC3, 0x9D, 0x67, 0x5C, 0xA4, 0x01, 0x6D, 0xAE, 0xEA, -0x7D, 0x67, 0x5C, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x50, 0x9A, 0xBD, 0x67, 0x9C, 0xA5, -0x10, 0xF0, 0x20, 0x6B, 0x22, 0xF3, 0x1D, 0x4B, 0x02, 0x4B, 0x6D, 0xE4, 0x60, 0xDA, 0x5D, 0x67, -0x6B, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x08, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x62, 0x67, -0x1F, 0x6A, 0x6C, 0xEA, 0x0F, 0x6B, 0x6E, 0xEA, 0x28, 0x2A, 0x9D, 0x67, 0x4B, 0xAC, 0x61, 0x42, -0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x08, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x82, 0x67, 0x00, 0x18, -0xA2, 0x04, 0x01, 0x4A, 0xBD, 0x67, 0x55, 0xC5, 0x5D, 0x67, 0x6B, 0xAA, 0x30, 0xF0, 0x20, 0x6A, -0xE1, 0xF6, 0x08, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x62, 0x67, 0x9D, 0x67, 0x4B, 0xAC, 0x81, 0x42, -0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x08, 0x4A, 0x49, 0xE4, 0x40, 0xA2, 0x83, 0x67, 0xA2, 0x67, -0x00, 0x18, 0xB8, 0x04, 0xBD, 0x67, 0x54, 0xC5, 0x1B, 0x10, 0x5D, 0x67, 0x6B, 0xAA, 0x30, 0xF0, -0x20, 0x6A, 0xE1, 0xF6, 0x08, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x82, 0x67, 0x00, 0x18, 0xA2, 0x04, -0x7D, 0x67, 0x55, 0xC3, 0x9D, 0x67, 0x6B, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x08, 0x4A, -0x49, 0xE3, 0x40, 0xA2, 0x82, 0x67, 0x00, 0x6D, 0x00, 0x18, 0xB8, 0x04, 0xBD, 0x67, 0x54, 0xC5, -0x7D, 0x67, 0x54, 0xA3, 0x26, 0x5A, 0x58, 0x67, 0x1C, 0x22, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, -0x20, 0x6A, 0xE1, 0xF6, 0x08, 0x4A, 0x51, 0xE3, 0xBD, 0x67, 0x6B, 0xAD, 0x30, 0xF0, 0x20, 0x6A, -0xE1, 0xF6, 0x08, 0x4A, 0x4D, 0xE3, 0xBD, 0x67, 0x55, 0xA5, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, -0x4E, 0x04, 0x5D, 0x67, 0x75, 0xA2, 0x9D, 0x67, 0x49, 0xAC, 0x49, 0xE3, 0xBD, 0x67, 0x49, 0xCD, -0x20, 0x10, 0x7D, 0x67, 0x54, 0xA3, 0x38, 0x5A, 0x58, 0x67, 0x1B, 0x2A, 0x5D, 0x67, 0x70, 0xA2, -0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF0, 0x18, 0x4A, 0x51, 0xE3, 0xBD, 0x67, 0x6B, 0xAD, 0x30, 0xF0, -0x20, 0x6A, 0xE1, 0xF6, 0x08, 0x4A, 0x4D, 0xE3, 0xBD, 0x67, 0x55, 0xA5, 0xA3, 0x67, 0xC2, 0x67, -0x00, 0x18, 0x4E, 0x04, 0x5D, 0x67, 0x70, 0xA2, 0x9D, 0x67, 0x55, 0xA4, 0x49, 0xE3, 0xBD, 0x67, -0x50, 0xC5, 0x5D, 0x67, 0x75, 0xA2, 0x9D, 0x67, 0x4B, 0xAC, 0x49, 0xE3, 0xBD, 0x67, 0x4B, 0xCD, -0x5D, 0x67, 0x6B, 0xAA, 0x9D, 0x67, 0x4D, 0xAC, 0x63, 0xEA, 0x58, 0x67, 0x5F, 0xF7, 0x0C, 0x22, -0x5D, 0x67, 0x69, 0xAA, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x68, 0xC2, -0x7D, 0x67, 0x49, 0xAB, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x4C, 0xEB, -0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x08, 0x4A, 0x61, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0x9D, 0x67, 0x70, 0xA4, 0x80, 0xF4, 0x70, 0xC2, 0x00, 0x6A, 0xBD, 0x67, 0x4B, 0xCD, -0x00, 0x6A, 0x7D, 0x67, 0x5C, 0xC3, 0x9D, 0x67, 0x5C, 0xA4, 0x01, 0x6D, 0xAE, 0xEA, 0x7D, 0x67, -0x5C, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x50, 0x9A, 0xBD, 0x67, 0x9C, 0xA5, 0x10, 0xF0, -0x20, 0x6B, 0x22, 0xF3, 0x1D, 0x4B, 0x04, 0x4B, 0x6D, 0xE4, 0x60, 0xDA, 0x5D, 0x67, 0x6B, 0xAA, -0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x54, 0x9A, 0x49, 0xE3, 0x7D, 0x67, 0x8B, 0xAB, 0x30, 0xF0, -0x20, 0x6B, 0xE1, 0xF6, 0x08, 0x4B, 0x6D, 0xE4, 0x60, 0xA3, 0x60, 0xC2, 0x9D, 0x67, 0x4B, 0xAC, -0x01, 0x4A, 0xBD, 0x67, 0x4B, 0xCD, 0x5D, 0x67, 0x6B, 0xAA, 0x9D, 0x67, 0x49, 0xAC, 0x43, 0xEB, -0x58, 0x67, 0xD1, 0x2A, 0x01, 0x6A, 0x02, 0x10, 0x00, 0x65, 0x00, 0x6A, 0x09, 0x97, 0x05, 0x63, -0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x72, 0x10, -0x9D, 0x67, 0x50, 0xA4, 0x01, 0x6B, 0x6E, 0xEA, 0x9D, 0x67, 0x50, 0xC4, 0x30, 0xF0, 0x20, 0x6A, -0x41, 0xF5, 0x50, 0x9A, 0x7D, 0x67, 0x90, 0xA3, 0x10, 0xF0, 0x20, 0x6B, 0x82, 0xF6, 0x05, 0x4B, -0x6D, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x58, 0x9A, 0x40, 0xA2, 0x9D, 0x67, -0x52, 0xC4, 0x7D, 0x67, 0x52, 0xA3, 0x9D, 0x67, 0x51, 0xC4, 0x5D, 0x67, 0x72, 0xA2, 0x0F, 0x6A, -0x6C, 0xEA, 0x50, 0x22, 0x9D, 0x67, 0x72, 0xA4, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, -0x08, 0x22, 0x5D, 0x67, 0x71, 0xA2, 0x12, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x51, 0xC3, -0x3A, 0x10, 0x9D, 0x67, 0x72, 0xA4, 0x02, 0x6A, 0x6C, 0xEA, 0x1C, 0x22, 0x5D, 0x67, 0x72, 0xA2, -0x20, 0x6A, 0x6C, 0xEA, 0x0F, 0x2A, 0x00, 0x18, 0xCF, 0x04, 0x06, 0x2A, 0x9D, 0x67, 0x71, 0xA4, -0x20, 0x6A, 0x6D, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x5C, 0x9A, -0x00, 0x6B, 0x60, 0xC2, 0x9D, 0x67, 0x71, 0xA4, 0x03, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, -0x51, 0xC3, 0x19, 0x10, 0x9D, 0x67, 0x72, 0xA4, 0x04, 0x6A, 0x6C, 0xEA, 0x08, 0x22, 0x5D, 0x67, -0x71, 0xA2, 0x05, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x0C, 0x10, 0x9D, 0x67, -0x72, 0xA4, 0x08, 0x6A, 0x6C, 0xEA, 0x07, 0x22, 0x5D, 0x67, 0x71, 0xA2, 0x09, 0x6A, 0x4B, 0xEA, -0x6C, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x58, 0x9A, 0x9D, 0x67, -0x71, 0xA4, 0x60, 0xC2, 0x00, 0x18, 0xE0, 0x05, 0x8B, 0x2A, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, -0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x40, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, -0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x00, 0x52, 0x58, 0x67, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, -0x61, 0xF5, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF5, 0x64, 0x9B, 0x80, 0x9B, 0x10, 0xF0, -0x00, 0x6B, 0x8D, 0xEB, 0x60, 0xDA, 0x01, 0x6A, 0x0F, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, -0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF5, 0x64, 0x9B, 0x80, 0x9B, 0x10, 0xF0, 0x01, 0x6B, -0x6B, 0xEB, 0x8C, 0xEB, 0x60, 0xDA, 0x00, 0x6A, 0x20, 0xE8, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, -0x10, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0xE0, 0xF2, 0x09, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF0, -0x68, 0xDA, 0x10, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0xE0, 0xF2, 0x19, 0x4B, 0x30, 0xF0, 0x20, 0x6A, -0x00, 0xF0, 0x08, 0x4A, 0x61, 0xDA, 0x10, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x00, 0xF3, 0x09, 0x4B, -0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF0, 0x08, 0x4A, 0x62, 0xDA, 0x10, 0xF0, 0x20, 0x6A, 0x62, 0x67, -0x00, 0xF3, 0x19, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF0, 0x08, 0x4A, 0x63, 0xDA, 0x10, 0xF0, -0x20, 0x6A, 0x62, 0x67, 0x20, 0xF3, 0x09, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF0, 0x08, 0x4A, -0x64, 0xDA, 0x10, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x20, 0xF3, 0x19, 0x4B, 0x30, 0xF0, 0x20, 0x6A, -0x00, 0xF0, 0x08, 0x4A, 0x65, 0xDA, 0x10, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x40, 0xF3, 0x09, 0x4B, -0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF0, 0x08, 0x4A, 0x66, 0xDA, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, -0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, 0x58, 0x9A, 0x40, 0x9A, 0x42, 0x33, 0x72, 0x33, 0xFF, 0x6A, -0x4C, 0xEB, 0x03, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x01, 0x6B, -0x4E, 0xEB, 0x08, 0x23, 0x02, 0x6B, 0x4E, 0xEB, 0x09, 0x23, 0x0C, 0x2A, 0x19, 0x6A, 0x7D, 0x67, -0x51, 0xC3, 0x0C, 0x10, 0x32, 0x6A, 0x7D, 0x67, 0x51, 0xC3, 0x08, 0x10, 0x64, 0x6A, 0x7D, 0x67, -0x51, 0xC3, 0x04, 0x10, 0x38, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x7D, 0x67, 0x51, 0xA3, -0x82, 0x67, 0x00, 0x18, 0x05, 0x07, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x77, 0xDA, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x60, 0xF3, 0x6C, 0xC2, 0x00, 0x18, 0xF8, 0x05, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x01, 0x6B, 0xA0, 0xF4, 0x73, 0xC2, 0x05, 0x97, 0x03, 0x63, -0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0x0F, 0x10, 0x5D, 0x67, -0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0xA0, 0xF4, -0x63, 0xC2, 0x7D, 0x67, 0x40, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, 0x40, 0xA3, -0x10, 0x5A, 0x58, 0x67, 0xEC, 0x2A, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0x2B, 0x10, 0x7D, 0x67, -0x40, 0xA3, 0x52, 0xF4, 0x60, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, -0x6E, 0xEA, 0x08, 0x22, 0x7D, 0x67, 0x40, 0xA3, 0x52, 0xF4, 0x60, 0x42, 0x1F, 0xF7, 0x00, 0x6A, -0x6C, 0xEA, 0x0A, 0x2A, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, 0x5C, 0x9A, -0x49, 0xE3, 0x00, 0x6B, 0x60, 0xDA, 0x09, 0x10, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, -0xE0, 0xF5, 0x40, 0x9A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xDA, 0x7D, 0x67, 0x40, 0xA3, 0x04, 0x4A, -0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, 0x40, 0xA3, 0x10, 0x5A, 0x58, 0x67, 0xD0, 0x2A, 0x01, 0x63, -0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x41, 0x06, 0x00, 0x18, 0x71, 0x06, -0x00, 0x18, 0xD5, 0x08, 0x00, 0x18, 0xDA, 0x18, 0x00, 0x18, 0x64, 0x0F, 0x05, 0x97, 0x03, 0x63, -0x00, 0xEF, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x00, 0xF4, -0x6E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x00, 0xF4, 0x6F, 0xC2, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x60, 0xF3, 0x6C, 0xC2, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x60, 0xF3, 0x6D, 0xC2, 0x20, 0xE8, 0x00, 0x65, -0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF4, 0x40, 0x9A, 0x01, 0x6B, 0x60, 0xC2, 0x20, 0xE8, 0x00, 0x65, -0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF4, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF4, 0x64, 0x9B, -0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x20, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, -0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF4, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF4, 0x68, 0x9B, -0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x08, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, -0x20, 0xE8, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, -0xE1, 0xF4, 0x64, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x01, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, -0x8C, 0xEB, 0x60, 0xC2, 0x20, 0xE8, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x30, 0xF0, 0x20, 0x6A, -0xE1, 0xF4, 0x68, 0x9A, 0x02, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, -0xCB, 0x03, 0x00, 0x6A, 0x7D, 0x67, 0x48, 0xCB, 0x0E, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, -0x20, 0x6A, 0xE1, 0xF4, 0x48, 0x9A, 0x49, 0xE3, 0x04, 0x6B, 0x60, 0xC2, 0x7D, 0x67, 0x48, 0xAB, -0x20, 0x4A, 0x7D, 0x67, 0x48, 0xCB, 0x7D, 0x67, 0x48, 0xAB, 0x02, 0xF0, 0x00, 0x5A, 0x58, 0x67, -0xEC, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x6C, 0x9A, 0x00, 0xF4, 0x00, 0x6A, 0x83, 0x67, -0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0xCB, 0x03, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, -0xFC, 0x63, 0x07, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x50, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, -0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x40, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, -0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x0B, 0x6A, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, -0x00, 0xF6, 0x43, 0x32, 0x7D, 0x67, 0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x50, 0x9A, -0x9D, 0x67, 0x70, 0xA4, 0x60, 0xC2, 0x0A, 0x6C, 0x00, 0x18, 0xB4, 0x0C, 0x30, 0xF0, 0x20, 0x6A, -0xE1, 0xF4, 0x54, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x40, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, -0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x50, 0xA4, 0x40, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x01, 0x6A, -0x01, 0x10, 0x00, 0x6A, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, -0x00, 0x6A, 0x7D, 0x67, 0x48, 0xCB, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x58, 0x9A, 0x10, 0xF0, -0x20, 0x6B, 0x43, 0xF3, 0x1D, 0x4B, 0x60, 0xDA, 0x32, 0x10, 0x7D, 0x67, 0x48, 0xAB, 0x82, 0xF3, -0x08, 0x5A, 0x58, 0x67, 0x14, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x5C, 0x9A, 0x30, 0xF0, -0x20, 0x6B, 0xE1, 0xF4, 0x7C, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x30, 0xF0, -0x20, 0x6A, 0x01, 0xF5, 0x40, 0x9A, 0x03, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, 0x1F, 0x10, 0x7D, 0x67, -0x48, 0xAB, 0x01, 0x4A, 0x7D, 0x67, 0x48, 0xCB, 0x14, 0x6C, 0x00, 0x18, 0xB4, 0x0C, 0x7D, 0x67, -0x48, 0xAB, 0x33, 0x5A, 0x58, 0x67, 0x0B, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x44, 0x9A, -0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x08, 0x6A, 0x6C, 0xEA, 0x06, 0x2A, 0x00, 0x18, -0xB8, 0x06, 0x01, 0x6B, 0x6E, 0xEA, 0xC9, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, -0x01, 0xF5, 0x40, 0x9A, 0x02, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, -0x58, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x43, 0xF3, 0x1D, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x07, 0x97, -0x04, 0x63, 0x00, 0xEF, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x82, 0x67, 0x00, 0x18, -0x5D, 0x0C, 0x00, 0x18, 0xA8, 0x0C, 0x04, 0xD2, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, -0x00, 0xD4, 0x01, 0xD5, 0x00, 0x92, 0x05, 0x5A, 0x58, 0x67, 0xC0, 0xF0, 0x06, 0x22, 0x00, 0x92, -0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF4, 0x10, 0x4A, 0x49, 0xE3, 0x40, 0x9A, 0x00, 0xEA, -0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, -0x60, 0x9A, 0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, -0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x48, 0x9A, 0x01, 0x93, 0x60, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x4C, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, -0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x97, 0x10, 0x00, 0x94, 0x00, 0x93, -0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, -0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x60, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x50, 0x9A, 0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, -0x01, 0xF5, 0x54, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4B, -0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x71, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, -0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, -0x20, 0x6A, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, -0x01, 0xF5, 0x58, 0x9A, 0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x5C, 0x9A, -0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, -0x60, 0xDA, 0x4B, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF4, -0x08, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, -0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x40, 0x9A, -0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x44, 0x9A, 0x00, 0x94, 0x30, 0xF0, -0x20, 0x6B, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x25, 0x10, -0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, -0x60, 0x9A, 0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, -0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x48, 0x9A, 0x01, 0x93, 0x60, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x4C, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, -0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x20, 0xE8, 0x00, 0xD4, 0x01, 0xD5, -0x00, 0x92, 0x01, 0x6B, 0x4E, 0xEB, 0x2B, 0x23, 0x01, 0x5A, 0x78, 0x67, 0x07, 0x2B, 0x02, 0x6B, -0x4E, 0xEB, 0x46, 0x23, 0x03, 0x6B, 0x6E, 0xEA, 0x64, 0x22, 0x83, 0x10, 0x00, 0x94, 0x00, 0x93, -0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, -0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, -0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x4C, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, -0x88, 0x34, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x62, 0x10, 0x00, 0x94, -0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0x9A, -0x01, 0x92, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, -0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x54, 0x9A, 0x00, 0x94, 0x30, 0xF0, -0x20, 0x6B, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x41, 0x10, -0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, -0x60, 0x9A, 0x01, 0x92, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, 0x02, 0xF4, -0x08, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x5C, 0x9A, 0x00, 0x94, -0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, -0x20, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, -0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, -0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x44, 0x9A, -0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, -0x60, 0xDA, 0x20, 0xE8, 0x00, 0xD4, 0x01, 0xD5, 0x00, 0x92, 0x04, 0x22, 0x01, 0x6B, 0x6E, 0xEA, -0x2A, 0x22, 0x51, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x0E, 0x4B, 0x68, 0x33, -0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, -0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, -0x21, 0xF5, 0x50, 0x9A, 0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x54, 0x9A, -0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, -0x60, 0x9B, 0x60, 0xDA, 0x28, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x0E, 0x4B, -0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, -0x20, 0x6A, 0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, -0x20, 0x6A, 0x21, 0xF5, 0x58, 0x9A, 0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, -0x5C, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4B, -0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x20, 0xE8, 0x00, 0xD4, 0x01, 0xD5, 0x00, 0x92, 0x04, 0x22, -0x01, 0x6B, 0x6E, 0xEA, 0x25, 0x22, 0x47, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, -0x0E, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4F, 0xEA, -0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, -0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x54, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, -0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x23, 0x10, -0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x0E, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, -0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x0E, 0x4C, -0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, -0x5C, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4B, -0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x20, 0xE8, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0x6B, 0x02, 0xF4, -0x68, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x61, 0xDA, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x62, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0x00, 0x6B, 0x63, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x4C, 0x9A, 0x30, 0xF0, -0x20, 0x6B, 0x02, 0xF4, 0x68, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x54, 0x9A, -0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x61, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, -0x01, 0xF5, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x62, 0x9B, 0x60, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, -0x63, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x6E, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x6F, 0xDA, 0x30, 0xF0, 0x20, 0x6A, -0x21, 0xF5, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x6E, 0x9B, 0x60, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, -0x6F, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x6C, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, -0x6C, 0x9B, 0x60, 0xDA, 0x20, 0xE8, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x48, 0x9A, -0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x50, 0x9A, 0x01, 0x6B, -0x6B, 0xEB, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x58, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, -0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x40, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x50, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xDA, 0x30, 0xF0, -0x20, 0x6A, 0x21, 0xF5, 0x58, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, -0x41, 0xF5, 0x44, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xDA, 0x20, 0xE8, 0x30, 0xF0, 0x20, 0x6A, -0x3F, 0xF4, 0x10, 0x6B, 0x6B, 0xEB, 0x02, 0xF4, 0x68, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0x08, 0xF0, 0x00, 0x6B, 0x61, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x01, 0x6B, 0x62, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x01, 0x6B, 0x63, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x64, 0xDA, 0x30, 0xF0, 0x20, 0x6A, -0x01, 0xF5, 0x4C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x68, 0x9B, 0x60, 0xDA, 0x30, 0xF0, -0x20, 0x6A, 0x01, 0xF5, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x61, 0x9B, -0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, -0x08, 0x4B, 0x62, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x44, 0x9A, 0x30, 0xF0, -0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x63, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, -0x4C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x64, 0x9B, 0x60, 0xDA, 0x20, 0xE8, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x6C, 0xDA, 0x30, 0xF0, 0x20, 0x6A, -0x41, 0xF5, 0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x6C, 0x9B, 0x60, 0xDA, -0x20, 0xE8, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x06, 0x6B, 0x6E, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x6F, 0xDA, 0x30, 0xF0, 0x20, 0x6A, -0x21, 0xF5, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x6E, 0x9B, 0x60, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, -0x6F, 0x9B, 0x60, 0xDA, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x40, 0xF0, 0x70, 0xCA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0x40, 0xF0, 0x70, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x01, 0x6C, 0x02, 0x6D, 0xC2, 0x67, -0x00, 0x18, 0x6D, 0x0B, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x40, 0xF0, 0x50, 0xAA, -0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x01, 0x6C, 0x03, 0x6D, -0xC2, 0x67, 0x00, 0x18, 0x6D, 0x0B, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, -0x00, 0x18, 0x12, 0x08, 0x00, 0x18, 0x4A, 0x08, 0x00, 0x18, 0x63, 0x08, 0x00, 0x18, 0x95, 0x08, -0x00, 0x18, 0x8C, 0x08, 0x00, 0x18, 0xA6, 0x08, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, -0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0xE9, 0x08, 0x62, 0x67, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x60, 0xF0, 0x74, 0xC2, 0x00, 0x18, 0x95, 0x06, 0x00, 0x18, -0xC4, 0x08, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x48, 0x9A, 0x3F, 0x6B, 0x60, 0xC2, 0x00, 0x18, -0x80, 0x06, 0x00, 0x18, 0x84, 0x06, 0x00, 0x18, 0xF8, 0x08, 0x00, 0x18, 0x9E, 0x06, 0x05, 0x97, -0x03, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0xE0, 0xF1, 0x1B, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, 0x41, 0xCB, -0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x48, 0x9A, 0x9D, 0x67, 0x61, 0xAC, 0x60, 0xCA, 0x0F, 0x6A, -0x7D, 0x67, 0x40, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x4C, 0x9A, 0x9D, 0x67, 0x60, 0xA4, -0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x70, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, -0x50, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0xFB, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x01, 0x63, -0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x5C, 0x9A, 0x60, 0xA2, -0xFF, 0x6A, 0x6C, 0xEA, 0x4A, 0x33, 0xFF, 0x6A, 0x4C, 0xEB, 0x03, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, -0x40, 0xC3, 0x7D, 0x67, 0x40, 0xA3, 0x02, 0x2A, 0x02, 0x6A, 0x08, 0x10, 0x7D, 0x67, 0x40, 0xA3, -0x03, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x03, 0x6A, 0x01, 0x10, 0x01, 0x6A, 0x01, 0x63, 0x20, 0xE8, -0xFC, 0x63, 0x07, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, -0xC1, 0xF6, 0x40, 0x9A, 0x80, 0xAA, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0xFF, 0xF6, 0x1F, 0x6C, -0x8C, 0xEA, 0x40, 0xCB, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, -0xC1, 0xF6, 0x64, 0x9B, 0x80, 0x9B, 0x01, 0x6B, 0x8D, 0xEB, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, -0xC1, 0xF6, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF6, 0x68, 0x9B, 0x80, 0x9B, 0x00, 0xF4, -0x00, 0x6B, 0x8D, 0xEB, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x4C, 0x9A, 0x60, 0xA2, -0xFF, 0x6A, 0x4C, 0xEB, 0x40, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x30, 0xF0, -0x20, 0x6A, 0xC1, 0xF6, 0x4C, 0x9A, 0x9D, 0x67, 0x71, 0xA4, 0x60, 0xC2, 0x0A, 0x6C, 0x00, 0x18, -0xB4, 0x0C, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x50, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, -0x40, 0x6A, 0x4B, 0xEA, 0x6D, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, -0x50, 0x9A, 0x9D, 0x67, 0x71, 0xA4, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x54, 0x9A, -0x80, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x40, 0x9A, 0x60, 0xA2, -0xFF, 0x6A, 0x4C, 0xEB, 0x40, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, -0x50, 0xA4, 0x40, 0x6B, 0x6E, 0xEA, 0x0D, 0x2A, 0x0A, 0x6C, 0x00, 0x18, 0xB4, 0x0C, 0x30, 0xF0, -0x20, 0x6A, 0xC1, 0xF6, 0x58, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF6, 0x7C, 0x9B, 0x60, 0xDA, -0x11, 0x10, 0x9D, 0x67, 0x50, 0xA4, 0x80, 0x6B, 0x6E, 0xEA, 0x0C, 0x2A, 0x0A, 0x6C, 0x00, 0x18, -0xB4, 0x0C, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x58, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF6, -0x60, 0x9B, 0x60, 0xDA, 0x0A, 0x6C, 0x00, 0x18, 0xB4, 0x0C, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, -0x58, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF6, 0x64, 0x9B, 0x60, 0xDA, 0x07, 0x97, 0x04, 0x63, -0x00, 0xEF, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x60, 0xBA, 0x20, 0xE8, 0x40, 0xBA, 0x20, 0xE8, -0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x4E, 0x32, 0xBD, 0x67, -0x43, 0xC5, 0xDD, 0x67, 0x68, 0xA6, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x42, 0xC3, 0x9D, 0x67, -0x43, 0xA4, 0x42, 0xF4, 0x10, 0x4A, 0xBD, 0x67, 0x40, 0xCD, 0xDD, 0x67, 0x60, 0xAE, 0x1F, 0xF7, -0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x60, 0xAC, -0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x4C, 0x2A, 0xBD, 0x67, 0x60, 0xAD, 0x30, 0xF0, 0x20, 0x6A, -0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0xDD, 0x67, 0x80, 0xAE, 0x1F, 0xF7, 0x00, 0x6A, -0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x06, 0x22, 0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, -0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, 0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, -0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, -0x43, 0x32, 0x0E, 0x10, 0x5D, 0x67, 0x80, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, -0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, -0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, 0x80, 0x34, -0x00, 0xF6, 0x83, 0x34, 0x8F, 0xEC, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8C, 0xEA, -0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x4B, 0x10, -0x5D, 0x67, 0x60, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE3, 0x62, 0x67, -0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6E, 0xCE, 0xEA, -0x06, 0x22, 0x5D, 0x67, 0x80, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, 0xBD, 0x67, -0x80, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, -0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, 0xDD, 0x67, 0x80, 0xAE, -0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, -0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, 0xC5, 0x67, -0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8F, 0xEC, 0x00, 0xF6, -0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, -0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x44, 0x67, -0x7D, 0x67, 0x48, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x4E, 0x32, 0xBD, 0x67, 0x43, 0xC5, 0xDD, 0x67, -0x68, 0xA6, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x42, 0xC3, 0x9D, 0x67, 0x43, 0xA4, 0x42, 0xF4, -0x10, 0x4A, 0xBD, 0x67, 0x40, 0xCD, 0xDD, 0x67, 0x60, 0xAE, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, -0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x60, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, -0x6C, 0xEA, 0x47, 0x2A, 0xBD, 0x67, 0x60, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, -0x49, 0xE3, 0x62, 0x67, 0xDD, 0x67, 0x80, 0xAE, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, -0x00, 0x6C, 0x8E, 0xEA, 0x06, 0x22, 0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, -0x0F, 0x2A, 0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, -0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, -0x5D, 0x67, 0x80, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, -0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, -0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, -0x8D, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, -0x46, 0x10, 0x5D, 0x67, 0x60, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE3, -0x62, 0x67, 0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6E, -0xCE, 0xEA, 0x06, 0x22, 0x5D, 0x67, 0x80, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, -0xBD, 0x67, 0x80, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, -0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, 0xDD, 0x67, -0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, -0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, -0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8D, 0xEA, -0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x01, 0x63, -0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x68, 0xC4, 0xBD, 0x67, -0x4C, 0xC5, 0xDD, 0x67, 0x48, 0xA6, 0x4E, 0x32, 0x7D, 0x67, 0x43, 0xC3, 0x9D, 0x67, 0x68, 0xA4, -0x07, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x42, 0xC5, 0xDD, 0x67, 0x43, 0xA6, 0x42, 0xF4, 0x10, 0x4A, -0x7D, 0x67, 0x40, 0xCB, 0x9D, 0x67, 0x4C, 0xA4, 0x01, 0x6D, 0xAE, 0xEA, 0xC0, 0xF0, 0x0E, 0x2A, -0xDD, 0x67, 0x83, 0xA6, 0x5D, 0x67, 0x63, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x49, 0xE3, 0xA0, 0xF4, 0x43, 0xA2, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xBD, 0x67, -0x42, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEA, 0x46, 0x67, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, -0x43, 0x32, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xFF, 0x6A, 0x4C, 0xEB, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0xA0, 0xF4, 0x63, 0xC2, 0x5D, 0x67, -0x60, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, -0x9D, 0x67, 0x60, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x4C, 0x2A, 0xBD, 0x67, 0x60, 0xAD, -0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0xDD, 0x67, 0x80, 0xAE, -0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x06, 0x22, 0xBD, 0x67, -0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, 0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, -0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, -0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, 0x5D, 0x67, 0x80, 0xAA, 0x30, 0xF0, 0x20, 0x6A, -0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, -0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, -0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8F, 0xEC, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, -0x83, 0x34, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, -0x40, 0xC3, 0x14, 0x11, 0x5D, 0x67, 0x60, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, -0x49, 0xE3, 0x62, 0x67, 0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, -0x00, 0x6E, 0xCE, 0xEA, 0x06, 0x22, 0x5D, 0x67, 0x80, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, -0x0F, 0x2A, 0xBD, 0x67, 0x80, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, -0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, -0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, -0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, -0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, -0x8F, 0xEC, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x34, -0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0xC8, 0x10, 0x5D, 0x67, 0x83, 0xA2, -0xBD, 0x67, 0x63, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0xA0, 0xF4, -0x43, 0xA2, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xDD, 0x67, 0x42, 0xA6, 0x01, 0x6D, -0xC5, 0x67, 0xC4, 0xEA, 0x46, 0x67, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x4F, 0xEA, -0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, -0x63, 0x33, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, -0xA0, 0xF4, 0x63, 0xC2, 0x5D, 0x67, 0x60, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, -0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x60, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, -0x47, 0x2A, 0xBD, 0x67, 0x60, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, -0x62, 0x67, 0xDD, 0x67, 0x80, 0xAE, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, -0x8E, 0xEA, 0x06, 0x22, 0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, -0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, -0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, 0x5D, 0x67, -0x80, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, -0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, -0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8D, 0xEA, -0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x46, 0x10, -0x5D, 0x67, 0x60, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE3, 0x62, 0x67, -0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6E, 0xCE, 0xEA, -0x06, 0x22, 0x5D, 0x67, 0x80, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, 0xBD, 0x67, -0x80, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, -0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, 0xDD, 0x67, 0x80, 0xAE, -0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, -0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, 0xC5, 0x67, -0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8D, 0xEA, 0x00, 0xF6, -0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x01, 0x63, 0x20, 0xE8, -0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x4E, 0x32, 0x7D, 0x67, -0x41, 0xC3, 0x9D, 0x67, 0x68, 0xA4, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, -0x61, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0xA0, 0xF4, 0x43, 0xA2, -0x62, 0x67, 0x9D, 0x67, 0x40, 0xA4, 0x67, 0xEA, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, -0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0x20, 0xE8, 0x00, 0x65, -0xFF, 0x63, 0x02, 0xD4, 0x00, 0x6A, 0x00, 0xD2, 0x0E, 0x10, 0x00, 0x92, 0x02, 0x93, 0x83, 0x67, -0x86, 0xEA, 0x44, 0x67, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x08, 0x2A, -0x00, 0x92, 0x01, 0x4A, 0x00, 0xD2, 0x00, 0x92, 0x20, 0x5A, 0x58, 0x67, 0xEE, 0x2A, 0x01, 0x10, -0x00, 0x65, 0x00, 0x92, 0x01, 0x63, 0x20, 0xE8, 0xFB, 0x63, 0x09, 0x62, 0x0A, 0xD4, 0x0B, 0xD5, -0x0A, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x48, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x06, 0xD2, -0x0B, 0x92, 0x82, 0x67, 0x00, 0x18, 0xF0, 0x0A, 0x04, 0xD2, 0x06, 0x93, 0x0B, 0x92, 0x4C, 0xEB, -0x04, 0x92, 0x83, 0x67, 0x86, 0xEA, 0x44, 0x67, 0x05, 0xD2, 0x05, 0x92, 0x09, 0x97, 0x05, 0x63, -0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x0A, 0xD4, 0x0B, 0xD5, 0x0C, 0xD6, 0x0B, 0x92, -0x01, 0x4A, 0x21, 0x22, 0x0A, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x48, 0x9A, 0x49, 0xE3, -0x40, 0x9A, 0x06, 0xD2, 0x0B, 0x92, 0x82, 0x67, 0x00, 0x18, 0xF0, 0x0A, 0x05, 0xD2, 0x0B, 0x92, -0x4F, 0xEB, 0x06, 0x92, 0x4C, 0xEB, 0x05, 0x92, 0x0C, 0x94, 0xA4, 0x67, 0xA4, 0xEA, 0x45, 0x67, -0x6D, 0xEA, 0x04, 0xD2, 0x0A, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x48, 0x9A, 0x49, 0xE3, -0x04, 0x93, 0x60, 0xDA, 0x08, 0x10, 0x0A, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x48, 0x9A, -0x49, 0xE3, 0x0C, 0x93, 0x60, 0xDA, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x02, 0xD4, -0x03, 0xD5, 0x04, 0xD6, 0x03, 0x92, 0x01, 0x4A, 0x1A, 0x22, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, -0x60, 0xF5, 0x48, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x01, 0xD2, 0x03, 0x92, 0x4F, 0xEB, 0x01, 0x92, -0x4C, 0xEB, 0x04, 0x94, 0x03, 0x92, 0x8C, 0xEA, 0x6D, 0xEA, 0x00, 0xD2, 0x02, 0x93, 0x30, 0xF0, -0x20, 0x6A, 0x60, 0xF5, 0x48, 0x9A, 0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, 0x08, 0x10, 0x02, 0x93, -0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x48, 0x9A, 0x49, 0xE3, 0x04, 0x93, 0x60, 0xDA, 0x01, 0x63, -0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x1C, 0x65, 0x85, 0x67, 0x66, 0x67, 0x47, 0x67, -0xD8, 0x67, 0xBD, 0x67, 0xCC, 0xCD, 0xBD, 0x67, 0x9C, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x60, 0xC6, -0x7D, 0x67, 0x52, 0xCB, 0x0A, 0x92, 0x00, 0x6B, 0x60, 0xCA, 0x0B, 0x10, 0x01, 0x6C, 0x00, 0x18, -0xB4, 0x0C, 0x0A, 0x92, 0x40, 0xAA, 0x61, 0x42, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x0A, 0x92, -0x60, 0xCA, 0x9D, 0x67, 0x6C, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6D, -0xAE, 0xEA, 0x06, 0x22, 0xDD, 0x67, 0x6C, 0xAE, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, -0x5D, 0x67, 0x6C, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, -0xFF, 0x6A, 0x6C, 0xEA, 0x0A, 0x10, 0x9D, 0x67, 0x6C, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, -0x48, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x7C, 0xA5, 0x4C, 0xEB, -0xDD, 0x67, 0x20, 0xF0, 0x40, 0xA6, 0x6E, 0xEA, 0x07, 0x22, 0x0A, 0x92, 0x40, 0xAA, 0x9D, 0x67, -0x72, 0xAC, 0x63, 0xEA, 0x58, 0x67, 0xC2, 0x2A, 0x0A, 0x92, 0x40, 0xAA, 0x9D, 0x67, 0x72, 0xAC, -0x63, 0xEA, 0x58, 0x67, 0x02, 0x2A, 0x00, 0x6A, 0x01, 0x10, 0x01, 0x6A, 0x05, 0x97, 0x03, 0x63, -0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x65, 0x67, 0x46, 0x67, 0xBD, 0x67, 0x88, 0xC5, 0x9D, 0x67, -0x6C, 0xC4, 0xBD, 0x67, 0x50, 0xC5, 0x5D, 0x67, 0x70, 0xA2, 0x9D, 0x67, 0x4C, 0xA4, 0x40, 0x32, -0x40, 0x32, 0x6D, 0xEA, 0x00, 0xD2, 0xBD, 0x67, 0x48, 0xA5, 0x08, 0x2A, 0x00, 0x93, 0x30, 0xF0, -0x20, 0x6A, 0x60, 0xF5, 0x50, 0x9A, 0x6D, 0xEA, 0x00, 0xD2, 0x07, 0x10, 0x00, 0x93, 0x30, 0xF0, -0x20, 0x6A, 0x60, 0xF5, 0x54, 0x9A, 0x6D, 0xEA, 0x00, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, -0x58, 0x9A, 0x00, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x58, 0x9A, 0x00, 0x94, -0x30, 0xF0, 0x20, 0x6B, 0x60, 0xF5, 0x7C, 0x9B, 0x8C, 0xEB, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, -0x80, 0xF5, 0x40, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0xFB, 0x63, 0x09, 0x62, -0x0B, 0xD5, 0x0C, 0xD6, 0x0D, 0xD7, 0x0E, 0x93, 0x0F, 0x92, 0xBD, 0x67, 0x20, 0xF0, 0x88, 0xC5, -0x9D, 0x67, 0x78, 0xC4, 0xBD, 0x67, 0x5C, 0xC5, 0x00, 0x6A, 0x05, 0xD2, 0x00, 0x6A, 0x04, 0xD2, -0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x01, 0x0C, 0x02, 0x2A, 0x00, 0x6A, -0xCD, 0x10, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x06, 0x5A, 0x78, 0x67, 0x20, 0x23, 0x48, 0x33, -0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x04, 0x4A, 0x49, 0xE3, 0x40, 0x9A, 0x00, 0xEA, 0x02, 0xF2, -0x00, 0x6A, 0x05, 0xD2, 0x16, 0x10, 0x02, 0xF2, 0x10, 0x6A, 0x05, 0xD2, 0x12, 0x10, 0x22, 0xF2, -0x00, 0x6A, 0x05, 0xD2, 0x0E, 0x10, 0x22, 0xF2, 0x10, 0x6A, 0x05, 0xD2, 0x0A, 0x10, 0x42, 0xF2, -0x00, 0x6A, 0x05, 0xD2, 0x06, 0x10, 0x42, 0xF2, 0x10, 0x6A, 0x05, 0xD2, 0x02, 0x10, 0x00, 0x6A, -0xA5, 0x10, 0x0D, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x5C, 0x9A, 0x4C, 0xEB, 0x30, 0xF0, -0x20, 0x6A, 0xA0, 0xF5, 0x40, 0x9A, 0x6D, 0xEA, 0x04, 0xD2, 0x7D, 0x67, 0x5C, 0xA3, 0x08, 0x22, -0x04, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF5, 0x44, 0x9A, 0x6D, 0xEA, 0x04, 0xD2, 0x07, 0x10, -0x04, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF5, 0x48, 0x9A, 0x6C, 0xEA, 0x04, 0xD2, 0x9D, 0x67, -0x58, 0xA4, 0x08, 0x22, 0x04, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF5, 0x4C, 0x9A, 0x6D, 0xEA, -0x04, 0xD2, 0x07, 0x10, 0x04, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF5, 0x50, 0x9A, 0x6C, 0xEA, -0x04, 0xD2, 0x05, 0x93, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6D, 0xAE, 0xEA, -0x05, 0x22, 0x05, 0x93, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0E, 0x2A, 0x05, 0x93, 0x30, 0xF0, -0x20, 0x6A, 0xA0, 0xF5, 0x54, 0x9A, 0x49, 0xE3, 0x0B, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0xA0, 0xF5, -0x78, 0x9B, 0x8C, 0xEB, 0x60, 0xDA, 0x0D, 0x10, 0x05, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF5, -0x5C, 0x9A, 0x49, 0xE3, 0x0B, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0xA0, 0xF5, 0x78, 0x9B, 0x8C, 0xEB, -0x60, 0xDA, 0x05, 0x92, 0x64, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, -0x6E, 0xEA, 0x06, 0x22, 0x05, 0x92, 0x64, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0E, 0x2A, -0x05, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, 0x40, 0x9A, 0x49, 0xE3, 0x0C, 0x94, 0x30, 0xF0, -0x20, 0x6B, 0xA0, 0xF5, 0x78, 0x9B, 0x8C, 0xEB, 0x60, 0xDA, 0x0D, 0x10, 0x05, 0x93, 0x30, 0xF0, -0x20, 0x6A, 0xC0, 0xF5, 0x44, 0x9A, 0x49, 0xE3, 0x0C, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0xA0, 0xF5, -0x78, 0x9B, 0x8C, 0xEB, 0x60, 0xDA, 0x05, 0x92, 0x67, 0x42, 0x01, 0x4B, 0x1F, 0xF7, 0x00, 0x6A, -0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x05, 0x92, 0x67, 0x42, 0x01, 0x4B, -0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x09, 0x2A, 0x05, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, -0x48, 0x9A, 0x49, 0xE3, 0x04, 0x93, 0x60, 0xDA, 0x08, 0x10, 0x05, 0x93, 0x30, 0xF0, 0x20, 0x6A, -0xC0, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x04, 0x93, 0x60, 0xDA, 0x01, 0x6A, 0x09, 0x97, 0x05, 0x63, -0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, -0xE0, 0xF3, 0x08, 0x6A, 0x04, 0xD2, 0x17, 0x10, 0x01, 0x6C, 0x00, 0x18, 0xB4, 0x0C, 0x04, 0x92, -0xFF, 0x4A, 0x04, 0xD2, 0x04, 0x92, 0x0F, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, 0x50, 0x9A, -0x30, 0xF0, 0x20, 0x6B, 0xC0, 0xF5, 0x70, 0x9B, 0x80, 0x9B, 0x08, 0xF0, 0x00, 0x6B, 0x8D, 0xEB, -0x60, 0xDA, 0x00, 0x6A, 0x15, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, 0x54, 0x9A, 0x60, 0xAA, -0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x01, 0x6C, -0xA4, 0x67, 0xA4, 0xEA, 0x45, 0x67, 0x6C, 0xEA, 0x01, 0x52, 0x58, 0x67, 0xD5, 0x22, 0x01, 0x6A, -0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, -0x54, 0x9A, 0x40, 0xAA, 0x7D, 0x67, 0x40, 0xCB, 0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x30, 0xF0, -0x20, 0x6A, 0xC0, 0xF5, 0x54, 0x9A, 0x40, 0xAA, 0x7D, 0x67, 0x40, 0xCB, 0x01, 0x63, 0x20, 0xE8, -0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, -0x01, 0x6B, 0x6E, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x44, 0x9A, -0x7D, 0x67, 0x90, 0xA3, 0x10, 0xF0, 0x20, 0x6B, 0xA6, 0xF0, 0x01, 0x4B, 0x6D, 0xE4, 0x60, 0xDA, -0x00, 0x18, 0x47, 0x09, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0x9A, 0x02, 0x6A, -0x6C, 0xEA, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0x9A, 0x03, 0x6A, -0x4B, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0xDA, 0x00, 0x18, -0x41, 0x12, 0x00, 0x18, 0x46, 0x09, 0x00, 0x18, 0x47, 0x09, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0x77, 0x9A, 0x04, 0x6A, 0x6C, 0xEA, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0x77, 0x9A, 0x05, 0x6A, 0x4B, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0x77, 0xDA, 0x00, 0x18, 0x19, 0x10, 0x00, 0x18, 0x46, 0x09, 0x00, 0x18, 0x47, 0x09, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0x9A, 0x10, 0x6A, 0x6C, 0xEA, 0x0F, 0x22, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0x9A, 0x11, 0x6A, 0x4B, 0xEA, 0x4C, 0xEB, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0xDA, 0x00, 0x18, 0xBB, 0x30, 0x00, 0x18, -0x46, 0x09, 0x9C, 0x17, 0x00, 0xD4, 0x00, 0x92, 0x06, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x64, 0x6B, -0xE2, 0xF2, 0x6C, 0xDA, 0x05, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0x93, 0xE2, 0xF2, 0x6C, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF2, 0x4C, 0x9A, 0x28, 0x6B, 0x4E, 0xEB, 0x42, 0x23, 0x29, 0x5A, -0x78, 0x67, 0x0A, 0x23, 0x14, 0x6B, 0x4E, 0xEB, 0x24, 0x23, 0x19, 0x6B, 0x4E, 0xEB, 0x2D, 0x23, -0x0A, 0x6B, 0x6E, 0xEA, 0x12, 0x22, 0x72, 0x10, 0x50, 0x6B, 0x4E, 0xEB, 0x4A, 0x23, 0x51, 0x5A, -0x78, 0x67, 0x04, 0x23, 0x32, 0x6B, 0x6E, 0xEA, 0x38, 0x22, 0x68, 0x10, 0x64, 0x6B, 0x4E, 0xEB, -0x4C, 0x23, 0xC8, 0x6B, 0x6E, 0xEA, 0x55, 0x22, 0x61, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0x6B, -0xE2, 0xF2, 0x70, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF0, 0x00, 0x6B, 0xE2, 0xF2, 0x74, 0xDA, -0x55, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0x6B, 0xE2, 0xF2, 0x70, 0xDA, 0x30, 0xF0, 0x20, 0x6A, -0x01, 0xF4, 0x00, 0x6B, 0xE2, 0xF2, 0x74, 0xDA, 0x49, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x09, 0x6B, -0xE2, 0xF2, 0x70, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x04, 0xF4, 0x00, 0x6B, 0xE2, 0xF2, 0x74, 0xDA, -0x3D, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x05, 0x6B, 0xE2, 0xF2, 0x70, 0xDA, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x00, 0x6B, 0xE2, 0xF2, 0x74, 0xDA, 0x31, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x11, 0x6B, -0xE2, 0xF2, 0x70, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x08, 0xF4, 0x00, 0x6B, 0xE2, 0xF2, 0x74, 0xDA, -0x25, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x0A, 0x6B, 0xE2, 0xF2, 0x70, 0xDA, 0x30, 0xF0, 0x20, 0x6A, -0x05, 0xF0, 0x00, 0x6B, 0xE2, 0xF2, 0x74, 0xDA, 0x19, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0x6B, -0xE2, 0xF2, 0x70, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x11, 0xF0, 0x00, 0x6B, 0xE2, 0xF2, 0x74, 0xDA, -0x0D, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x43, 0x6B, 0xE2, 0xF2, 0x70, 0xDA, 0x30, 0xF0, 0x20, 0x6A, -0x30, 0xF0, 0x20, 0x6B, 0x20, 0xF6, 0x64, 0x9B, 0xE2, 0xF2, 0x74, 0xDA, 0x20, 0xE8, 0x00, 0x65, -0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF2, 0x4C, 0x9A, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x02, 0xD4, -0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF2, 0x54, 0x9A, 0x02, 0x93, 0x58, 0xEB, 0x12, 0xEA, 0x00, 0xD2, -0x00, 0x92, 0xFF, 0x4A, 0x00, 0xD2, 0x00, 0x92, 0xFB, 0x2A, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, -0xFF, 0x63, 0x02, 0xD4, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF2, 0x50, 0x9A, 0x02, 0x93, 0x58, 0xEB, -0x12, 0xEA, 0x00, 0xD2, 0x00, 0x92, 0xFF, 0x4A, 0x00, 0xD2, 0x00, 0x92, 0xFB, 0x2A, 0x01, 0x63, -0x20, 0xE8, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x04, 0xD2, 0x30, 0xF0, -0x20, 0x6A, 0x62, 0x67, 0xC3, 0xF0, 0x10, 0x4B, 0x04, 0x92, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, -0x00, 0x18, 0x4E, 0x04, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, -0x01, 0x6B, 0x6C, 0xEA, 0x26, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, -0x48, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, 0x1D, 0x2A, 0x00, 0x6C, 0x20, 0x6D, 0x00, 0x18, 0xBD, 0x07, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x5A, 0x33, 0xFF, 0x6A, -0x6C, 0xEA, 0xFF, 0x6B, 0x69, 0x4B, 0x83, 0x67, 0x01, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0xB9, 0x12, -0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x50, 0x9A, 0x01, 0x6C, 0xA2, 0x67, 0x00, 0x18, 0xBD, 0x07, -0x5A, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x01, 0x6B, -0x6C, 0xEA, 0x1C, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, -0x02, 0x6B, 0x6C, 0xEA, 0x13, 0x2A, 0x00, 0x6C, 0x20, 0x6D, 0x00, 0x18, 0xEA, 0x07, 0x30, 0xF0, -0x20, 0x6A, 0x01, 0xF4, 0x54, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, -0x50, 0x9A, 0x01, 0x6C, 0xA2, 0x67, 0x00, 0x18, 0xEA, 0x07, 0x35, 0x10, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x01, 0x6B, 0x6C, 0xEA, 0x12, 0x22, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, 0x09, 0x22, -0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x50, 0x9A, 0x01, 0x6C, 0xA2, 0x67, 0x00, 0x18, 0xBD, 0x07, -0x1A, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x01, 0x6B, -0x6C, 0xEA, 0x11, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, -0x02, 0x6B, 0x6C, 0xEA, 0x08, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x50, 0x9A, 0x01, 0x6C, -0xA2, 0x67, 0x00, 0x18, 0xEA, 0x07, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFC, 0x63, 0x07, 0x62, -0x08, 0xD4, 0x08, 0x92, 0x60, 0xA2, 0x01, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x53, 0xC3, 0x08, 0x92, -0x01, 0x4A, 0x40, 0xA2, 0x9D, 0x67, 0x52, 0xC4, 0xBD, 0x67, 0x52, 0xA5, 0x56, 0x32, 0xDD, 0x67, -0x51, 0xC6, 0x5D, 0x67, 0x72, 0xA2, 0x1F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0xBD, 0x67, -0x91, 0xA5, 0xDD, 0x67, 0x70, 0xA6, 0xBD, 0x67, 0x53, 0xA5, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, -0x81, 0x0D, 0xDD, 0x67, 0x53, 0xA6, 0x3B, 0x22, 0x5D, 0x67, 0x91, 0xA2, 0xBD, 0x67, 0x71, 0xA5, -0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, -0x61, 0x9A, 0xDD, 0x67, 0x50, 0xA6, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEA, 0x46, 0x67, 0x4D, 0xEB, -0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, -0x61, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x02, 0x6B, -0x6C, 0xEA, 0x4C, 0x2A, 0x7D, 0x67, 0x51, 0xA3, 0x54, 0x33, 0x9D, 0x67, 0x50, 0xA4, 0x51, 0xE3, -0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x58, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, -0x1A, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x61, 0xDA, 0x37, 0x10, 0xBD, 0x67, -0x91, 0xA5, 0xDD, 0x67, 0x71, 0xA6, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4B, 0x68, 0x33, -0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x61, 0x9A, 0xBD, 0x67, 0x50, 0xA5, 0x01, 0x6D, 0xC5, 0x67, -0xC4, 0xEA, 0x46, 0x67, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4C, -0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x61, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, 0x10, 0x2A, 0x7D, 0x67, 0x51, 0xA3, -0x48, 0x33, 0x9D, 0x67, 0x50, 0xA4, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x1A, 0x4B, -0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x61, 0xDA, 0x07, 0x97, 0x04, 0x63, -0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x40, 0xA2, 0x7D, 0x67, -0x52, 0xC3, 0x9D, 0x67, 0x52, 0xA4, 0x56, 0x32, 0xBD, 0x67, 0x51, 0xC5, 0xDD, 0x67, 0x72, 0xA6, -0x1F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x71, 0xA4, 0xBD, 0x67, 0x50, 0xA5, -0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0x81, 0x0D, 0xDD, 0x67, 0x91, 0xA6, 0x5D, 0x67, -0x71, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, -0x49, 0xE3, 0x61, 0x9A, 0xBD, 0x67, 0x50, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEA, 0x46, 0x67, -0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, -0x49, 0xE4, 0x61, 0xDA, 0x7D, 0x67, 0x51, 0xA3, 0x54, 0x33, 0x9D, 0x67, 0x50, 0xA4, 0x51, 0xE3, -0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x58, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, -0x1A, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x61, 0xDA, 0x07, 0x97, 0x04, 0x63, -0x00, 0xEF, 0x00, 0x65, 0x65, 0x67, 0x46, 0x67, 0xBD, 0x67, 0x80, 0xC5, 0xDD, 0x67, 0x64, 0xC6, -0x7D, 0x67, 0x48, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x5A, 0x22, 0xBD, 0x67, 0x40, 0xA5, 0x01, 0x6B, -0x4E, 0xEB, 0x1E, 0x23, 0x02, 0x52, 0x78, 0x67, 0x02, 0x23, 0x08, 0x22, 0xAC, 0x10, 0x02, 0x6B, -0x4E, 0xEB, 0x28, 0x23, 0x03, 0x6B, 0x6E, 0xEA, 0x38, 0x22, 0xA5, 0x10, 0x30, 0xF0, 0x20, 0x6A, -0x01, 0xF4, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x01, 0xF4, 0x7C, 0x9B, 0x80, 0x9B, 0xBD, 0x67, -0x64, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEB, 0x66, 0x67, 0x8D, 0xEB, 0x60, 0xDA, 0x93, 0x10, -0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF4, 0x60, 0x9B, -0x80, 0x9B, 0xBD, 0x67, 0x64, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEB, 0x66, 0x67, 0x8D, 0xEB, -0x60, 0xDA, 0x81, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, -0x21, 0xF4, 0x64, 0x9B, 0x80, 0x9B, 0xBD, 0x67, 0x64, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEB, -0x66, 0x67, 0x8D, 0xEB, 0x60, 0xDA, 0x00, 0x65, 0x6E, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, -0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF4, 0x68, 0x9B, 0x80, 0x9B, 0xBD, 0x67, 0x64, 0xA5, -0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEB, 0x66, 0x67, 0x8D, 0xEB, 0x60, 0xDA, 0x5C, 0x10, 0x7D, 0x67, -0x40, 0xA3, 0x01, 0x6B, 0x4E, 0xEB, 0x1F, 0x23, 0x02, 0x52, 0x78, 0x67, 0x02, 0x23, 0x08, 0x22, -0x52, 0x10, 0x02, 0x6B, 0x4E, 0xEB, 0x2A, 0x23, 0x03, 0x6B, 0x6E, 0xEA, 0x3A, 0x22, 0x4B, 0x10, -0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x01, 0xF4, 0x7C, 0x9B, -0x80, 0x9B, 0xBD, 0x67, 0x64, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEB, 0x66, 0x67, 0x6F, 0xEB, -0x8C, 0xEB, 0x60, 0xDA, 0x38, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x40, 0x9A, 0x30, 0xF0, -0x20, 0x6B, 0x21, 0xF4, 0x60, 0x9B, 0x80, 0x9B, 0xBD, 0x67, 0x64, 0xA5, 0x01, 0x6D, 0xC5, 0x67, -0xC4, 0xEB, 0x66, 0x67, 0x6F, 0xEB, 0x8C, 0xEB, 0x60, 0xDA, 0x25, 0x10, 0x30, 0xF0, 0x20, 0x6A, -0x21, 0xF4, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF4, 0x64, 0x9B, 0x80, 0x9B, 0xBD, 0x67, -0x64, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEB, 0x66, 0x67, 0x6F, 0xEB, 0x8C, 0xEB, 0x60, 0xDA, -0x12, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF4, -0x68, 0x9B, 0x80, 0x9B, 0xBD, 0x67, 0x64, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEB, 0x66, 0x67, -0x6F, 0xEB, 0x8C, 0xEB, 0x60, 0xDA, 0x20, 0xE8, 0xD9, 0x63, 0x4D, 0x62, 0x0B, 0x03, 0x80, 0x6A, -0x83, 0x67, 0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0xCB, 0x03, 0x01, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, -0x20, 0xF0, 0x4C, 0xC3, 0x2B, 0x03, 0x80, 0x6A, 0x83, 0x67, 0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, -0xCB, 0x03, 0x00, 0x6A, 0x9D, 0x67, 0x59, 0xC4, 0x00, 0x6A, 0xBD, 0x67, 0x58, 0xC5, 0x00, 0x6A, -0x05, 0xD2, 0x00, 0x6A, 0xDD, 0x67, 0x51, 0xC6, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x00, 0x6A, -0x9D, 0x67, 0x20, 0xF0, 0x49, 0xC4, 0xEB, 0x10, 0xBD, 0x67, 0x20, 0xF0, 0x69, 0xA5, 0x30, 0xF0, -0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x41, 0x9A, -0xC0, 0xF0, 0x16, 0x22, 0x00, 0x6A, 0xDD, 0x67, 0x20, 0xF0, 0x48, 0xC6, 0xCA, 0x10, 0x5D, 0x67, -0x20, 0xF0, 0x69, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, -0x08, 0x4A, 0x49, 0xE3, 0x61, 0x9A, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x01, 0x6C, 0xA4, 0x67, -0xA4, 0xEA, 0x45, 0x67, 0x6C, 0xEA, 0xA0, 0xF0, 0x0D, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, -0x58, 0x9A, 0x40, 0x9A, 0x09, 0xD2, 0xDD, 0x67, 0x20, 0xF0, 0x49, 0xA6, 0x54, 0x33, 0x9D, 0x67, -0x20, 0xF0, 0x48, 0xA4, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x1A, 0x4B, 0x68, 0x33, -0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x41, 0x9A, 0x08, 0xD2, 0x09, 0x93, 0x08, 0x92, 0x43, 0xEB, -0x58, 0x67, 0x04, 0x2A, 0x09, 0x93, 0x08, 0x92, 0x4B, 0xE3, 0x05, 0x10, 0x08, 0x92, 0x4F, 0xEB, -0x09, 0x92, 0x49, 0xE3, 0x01, 0x4A, 0x07, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0xC0, 0xF4, 0x48, 0xA2, 0x5A, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x82, 0x67, 0x44, 0x67, 0x4C, 0x32, -0x54, 0x33, 0x4F, 0xE3, 0x78, 0x32, 0x6B, 0xE2, 0x89, 0xE2, 0x58, 0x32, 0x62, 0x67, 0x07, 0x92, -0x43, 0xEB, 0x58, 0x67, 0x50, 0x22, 0x5D, 0x67, 0x20, 0xF0, 0x69, 0xA2, 0x9D, 0x67, 0x20, 0xF0, -0x48, 0xA4, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0x81, 0x0D, 0xBD, 0x67, 0x20, 0xF0, -0x89, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x69, 0xA6, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4B, -0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x61, 0x9A, 0xBD, 0x67, 0x20, 0xF0, 0x48, 0xA5, -0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEA, 0x46, 0x67, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, -0x20, 0xF1, 0x16, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x61, 0xDA, 0x7D, 0x67, -0x20, 0xF0, 0x49, 0xA3, 0x54, 0x33, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x4D, 0xE3, 0x30, 0xF0, -0x20, 0x6A, 0x20, 0xF1, 0x1A, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, -0x61, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x4C, 0x9A, 0xBD, 0x67, 0x20, 0xF0, 0x69, 0xA5, -0x74, 0x34, 0xFF, 0x6B, 0x6C, 0xEC, 0xDD, 0x67, 0x20, 0xF0, 0x68, 0xA6, 0x71, 0xE4, 0xFF, 0x6B, -0x8C, 0xEB, 0x60, 0xC2, 0x1F, 0x10, 0x7D, 0x67, 0x59, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x69, 0xA4, -0x74, 0x34, 0xFF, 0x6B, 0x6C, 0xEC, 0xBD, 0x67, 0x20, 0xF0, 0x68, 0xA5, 0x71, 0xE4, 0xFF, 0x6B, -0x8C, 0xEB, 0x04, 0x04, 0x49, 0xE4, 0x7C, 0xC2, 0xDD, 0x67, 0x59, 0xA6, 0x08, 0x94, 0xFF, 0x6B, -0x8C, 0xEB, 0x04, 0x04, 0x49, 0xE4, 0x80, 0xF0, 0x7C, 0xC2, 0x7D, 0x67, 0x59, 0xA3, 0x01, 0x4A, -0x9D, 0x67, 0x59, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x48, 0xA5, 0x01, 0x4A, 0xDD, 0x67, 0x20, 0xF0, -0x48, 0xC6, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x20, 0x5A, 0x58, 0x67, 0x3F, 0xF7, 0x0F, 0x2A, -0x7D, 0x67, 0x20, 0xF0, 0x49, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x49, 0xC4, 0xBD, 0x67, -0x20, 0xF0, 0x49, 0xA5, 0x04, 0x5A, 0x58, 0x67, 0x1F, 0xF7, 0x0E, 0x2A, 0x00, 0x6A, 0x7D, 0x67, -0x58, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x20, 0xF0, 0x49, 0xC4, 0x11, 0x11, 0xBD, 0x67, 0x20, 0xF0, -0x49, 0xA5, 0x04, 0x03, 0x49, 0xE3, 0x5C, 0xA2, 0xFF, 0x6E, 0xCE, 0xEA, 0x00, 0xF1, 0x00, 0x22, -0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x50, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, -0x54, 0x9A, 0x6C, 0xEA, 0x15, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x49, 0xA3, 0x04, 0x03, 0x49, 0xE3, -0x5C, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x50, 0x9A, 0x40, 0x9A, 0x40, 0xF6, -0x42, 0x32, 0x6E, 0xEA, 0x05, 0x2A, 0x9D, 0x67, 0x58, 0xA4, 0x01, 0x4A, 0xBD, 0x67, 0x58, 0xC5, -0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x58, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, -0x54, 0x9A, 0x6C, 0xEA, 0x15, 0x2A, 0xDD, 0x67, 0x20, 0xF0, 0x49, 0xA6, 0x04, 0x03, 0x49, 0xE3, -0x5C, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x58, 0x9A, 0x40, 0x9A, 0x40, 0xF6, -0x42, 0x32, 0x6E, 0xEA, 0x05, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x58, 0xC4, -0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x5C, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, -0x54, 0x9A, 0x6C, 0xEA, 0x15, 0x2A, 0xBD, 0x67, 0x20, 0xF0, 0x49, 0xA5, 0x04, 0x03, 0x49, 0xE3, -0x5C, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x5C, 0x9A, 0x40, 0x9A, 0x40, 0xF6, -0x42, 0x32, 0x6E, 0xEA, 0x05, 0x2A, 0xDD, 0x67, 0x58, 0xA6, 0x01, 0x4A, 0x7D, 0x67, 0x58, 0xC3, -0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x40, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, -0x54, 0x9A, 0x6C, 0xEA, 0x15, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x49, 0xA4, 0x04, 0x03, 0x49, 0xE3, -0x5C, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x40, 0x9A, 0x40, 0x9A, 0x40, 0xF6, -0x42, 0x32, 0x6E, 0xEA, 0x05, 0x2A, 0xBD, 0x67, 0x58, 0xA5, 0x01, 0x4A, 0xDD, 0x67, 0x58, 0xC6, -0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x44, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, -0x54, 0x9A, 0x6C, 0xEA, 0x15, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x49, 0xA3, 0x04, 0x03, 0x49, 0xE3, -0x5C, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x44, 0x9A, 0x40, 0x9A, 0x40, 0xF6, -0x42, 0x32, 0x6E, 0xEA, 0x05, 0x2A, 0x9D, 0x67, 0x58, 0xA4, 0x01, 0x4A, 0xBD, 0x67, 0x58, 0xC5, -0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x48, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, -0x54, 0x9A, 0x6C, 0xEA, 0x15, 0x2A, 0xDD, 0x67, 0x20, 0xF0, 0x49, 0xA6, 0x04, 0x03, 0x49, 0xE3, -0x5C, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x48, 0x9A, 0x40, 0x9A, 0x40, 0xF6, -0x42, 0x32, 0x6E, 0xEA, 0x05, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x58, 0xC4, -0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x4C, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, -0x54, 0x9A, 0x6C, 0xEA, 0x15, 0x2A, 0xBD, 0x67, 0x20, 0xF0, 0x49, 0xA5, 0x04, 0x03, 0x49, 0xE3, -0x5C, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x4C, 0x9A, 0x40, 0x9A, 0x40, 0xF6, -0x42, 0x32, 0x6E, 0xEA, 0x05, 0x2A, 0xDD, 0x67, 0x58, 0xA6, 0x01, 0x4A, 0x7D, 0x67, 0x58, 0xC3, -0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x50, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, -0x54, 0x9A, 0x6C, 0xEA, 0x15, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x49, 0xA4, 0x04, 0x03, 0x49, 0xE3, -0x5C, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x50, 0x9A, 0x40, 0x9A, 0x40, 0xF6, -0x42, 0x32, 0x6E, 0xEA, 0x05, 0x2A, 0xBD, 0x67, 0x58, 0xA5, 0x01, 0x4A, 0xDD, 0x67, 0x58, 0xC6, -0x7D, 0x67, 0x20, 0xF0, 0x49, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x49, 0xC4, 0xBD, 0x67, -0x20, 0xF0, 0x69, 0xA5, 0xDD, 0x67, 0x59, 0xA6, 0x43, 0xEB, 0x58, 0x67, 0xFF, 0xF6, 0x06, 0x2A, -0x5D, 0x67, 0x78, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, -0x4A, 0x32, 0x82, 0x67, 0x0F, 0x6A, 0x4C, 0xEC, 0xFF, 0x6A, 0x8C, 0xEA, 0x62, 0xEA, 0x58, 0x67, -0xA0, 0xF0, 0x01, 0x22, 0x7D, 0x67, 0xA0, 0xF0, 0x4C, 0xA3, 0x05, 0xD2, 0x9D, 0x67, 0x20, 0xF0, -0x4C, 0xA4, 0xBD, 0x67, 0x51, 0xC5, 0x00, 0x6A, 0xDD, 0x67, 0x50, 0xC6, 0x01, 0x6A, 0x7D, 0x67, -0x20, 0xF0, 0x49, 0xC3, 0x36, 0x10, 0x9D, 0x67, 0x20, 0xF0, 0x49, 0xA4, 0x04, 0x03, 0x49, 0xE3, -0x80, 0xF0, 0x5C, 0xA2, 0x62, 0x67, 0x05, 0x92, 0x43, 0xEB, 0x58, 0x67, 0x23, 0x22, 0x7D, 0x67, -0x20, 0xF0, 0x49, 0xA3, 0x04, 0x03, 0x49, 0xE3, 0x80, 0xF0, 0x5C, 0xA2, 0x05, 0x93, 0x4F, 0xE3, -0xFF, 0xF7, 0x1F, 0x6A, 0x43, 0xEB, 0x58, 0x67, 0x15, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x49, 0xA3, -0x04, 0x03, 0x49, 0xE3, 0x80, 0xF0, 0x5C, 0xA2, 0x05, 0xD2, 0x9D, 0x67, 0x20, 0xF0, 0x49, 0xA4, -0x04, 0x03, 0x49, 0xE3, 0x5C, 0xA2, 0xBD, 0x67, 0x51, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x49, 0xA6, -0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x49, 0xA4, 0x01, 0x4A, 0xBD, 0x67, 0x20, 0xF0, -0x49, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x69, 0xA6, 0x9D, 0x67, 0x59, 0xA4, 0x43, 0xEB, 0x58, 0x67, -0xC2, 0x2A, 0x7D, 0x67, 0x51, 0xA3, 0x56, 0x32, 0x9D, 0x67, 0x20, 0xF0, 0x49, 0xC4, 0xBD, 0x67, -0x71, 0xA5, 0x1F, 0x6A, 0x6C, 0xEA, 0xDD, 0x67, 0x20, 0xF0, 0x48, 0xC6, 0x5D, 0x67, 0x20, 0xF0, -0x69, 0xA2, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, -0x81, 0x0D, 0xBD, 0x67, 0x50, 0xA5, 0x04, 0x03, 0x49, 0xE3, 0x01, 0x6B, 0x6B, 0xEB, 0x7C, 0xC2, -0xDD, 0x67, 0x20, 0xF0, 0x89, 0xA6, 0x5D, 0x67, 0x20, 0xF0, 0x69, 0xA2, 0x30, 0xF0, 0x20, 0x6A, -0x20, 0xF1, 0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x61, 0x9A, 0xBD, 0x67, -0x20, 0xF0, 0x48, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEA, 0x46, 0x67, 0x4F, 0xEA, 0x4C, 0xEB, -0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, -0x61, 0xDA, 0x7D, 0x67, 0x20, 0xF0, 0x49, 0xA3, 0x54, 0x33, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, -0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x1A, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, -0x49, 0xE3, 0x00, 0x6B, 0x61, 0xDA, 0xBD, 0x67, 0x78, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x4A, 0x32, 0x82, 0x67, 0x0F, 0x6A, 0x4C, 0xEC, 0xFF, 0x6A, -0x8C, 0xEA, 0x62, 0xEA, 0x58, 0x67, 0x1F, 0xF6, 0x19, 0x2A, 0x4D, 0x97, 0x27, 0x63, 0x00, 0xEF, -0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, -0x1D, 0x10, 0x5D, 0x67, 0x70, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x12, 0x4B, 0x68, 0x33, -0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x61, 0xDA, 0x5D, 0x67, 0x70, 0xA2, 0x30, 0xF0, -0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, -0x61, 0xDA, 0x7D, 0x67, 0x50, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, -0x04, 0x5A, 0x58, 0x67, 0xDE, 0x2A, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x11, 0x10, 0x5D, 0x67, -0x70, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x1A, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, -0x49, 0xE3, 0x00, 0x6B, 0x61, 0xDA, 0x7D, 0x67, 0x50, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x50, 0xC3, -0x7D, 0x67, 0x50, 0x83, 0x00, 0x52, 0x58, 0x67, 0xEA, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0xC3, 0xF0, -0x10, 0x4A, 0x82, 0x67, 0x00, 0x6D, 0x01, 0x6E, 0x00, 0x18, 0xCB, 0x03, 0x07, 0x97, 0x04, 0x63, -0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, 0x48, 0xCB, 0x1C, 0x10, -0x7D, 0x67, 0x48, 0xAB, 0xE0, 0xF3, 0x08, 0x5A, 0x58, 0x67, 0x0E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, -0x41, 0xF4, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x41, 0xF4, 0x74, 0x9B, 0x80, 0x9B, 0x80, 0x6B, -0x8D, 0xEB, 0x60, 0xDA, 0x00, 0x6A, 0x16, 0x10, 0x7D, 0x67, 0x48, 0xAB, 0x01, 0x4A, 0x7D, 0x67, -0x48, 0xCB, 0x0A, 0x6C, 0x00, 0x18, 0xB4, 0x0C, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x58, 0x9A, -0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, -0xD7, 0x2A, 0x01, 0x6A, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x44, 0x67, -0x03, 0xD5, 0x7D, 0x67, 0x44, 0xCB, 0x00, 0x6A, 0x7D, 0x67, 0x44, 0xC3, 0x10, 0x10, 0x5D, 0x67, -0x64, 0xA2, 0x03, 0x92, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x5C, 0x9A, 0x49, 0xE3, -0x00, 0x6B, 0x60, 0xDA, 0x7D, 0x67, 0x44, 0xA3, 0x04, 0x4A, 0x7D, 0x67, 0x44, 0xC3, 0x7D, 0x67, -0x44, 0xA3, 0x18, 0x5A, 0x58, 0x67, 0xEB, 0x2A, 0x5D, 0x67, 0x64, 0xAA, 0xE7, 0xF7, 0x1F, 0x6A, -0x6C, 0xEA, 0x00, 0xD2, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x40, 0x9A, 0x6C, 0xEA, -0x00, 0xD2, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x44, 0x9A, 0x6D, 0xEA, 0x00, 0xD2, -0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x5C, 0x9A, 0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, -0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x48, 0x9A, 0x49, 0xE3, 0x03, 0x94, 0x30, 0xF0, -0x20, 0x6B, 0x61, 0xF4, 0x68, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x10, 0x6B, -0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0xFD, 0x63, 0x05, 0x62, -0x06, 0xD4, 0x07, 0xD5, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x5A, 0xA2, 0x07, 0x93, 0x41, 0xC3, -0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x7A, 0xC2, 0x06, 0x93, -0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x5C, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0x07, 0x92, 0x83, 0x67, -0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xD7, 0x03, 0x06, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, -0x4C, 0x9A, 0x49, 0xE3, 0x82, 0x67, 0x07, 0x92, 0x62, 0x42, 0x07, 0x92, 0x47, 0xAA, 0xA3, 0x67, -0xC2, 0x67, 0x00, 0x18, 0xD7, 0x03, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFB, 0x63, 0x09, 0x62, -0x0A, 0xD4, 0x00, 0x18, 0x8D, 0x0F, 0x02, 0x2A, 0x00, 0x6A, 0x58, 0x10, 0x30, 0xF0, 0x20, 0x6A, -0x61, 0xF4, 0x50, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x54, 0x9A, 0x6C, 0xEA, -0x07, 0xD2, 0x07, 0x92, 0x01, 0x4A, 0x06, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x58, 0x9A, -0x06, 0x94, 0xFF, 0xF7, 0x1F, 0x6B, 0x8C, 0xEB, 0x60, 0xCA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, -0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF4, 0x7C, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, -0x00, 0xF6, 0x60, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x10, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x00, 0xF6, -0x60, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x06, 0x93, 0x62, 0x33, 0x62, 0x33, 0x00, 0xF6, 0x60, 0x33, -0x00, 0xF6, 0x63, 0x33, 0x8D, 0xEB, 0x00, 0xF6, 0x60, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6B, -0x8C, 0xEB, 0x60, 0xC2, 0x0A, 0x92, 0x47, 0xAA, 0x02, 0x4A, 0x7D, 0x67, 0x48, 0xCB, 0x5D, 0x67, -0x68, 0xAA, 0x06, 0x92, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xA7, 0x0F, 0x06, 0x92, 0x18, 0x4A, -0x05, 0xD2, 0x05, 0x93, 0x0A, 0x92, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xCF, 0x0F, 0x30, 0xF0, -0x20, 0x6A, 0x41, 0xF4, 0x58, 0x9A, 0x01, 0x6B, 0x60, 0xC2, 0x01, 0x6A, 0x09, 0x97, 0x05, 0x63, -0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0xF4, 0x6E, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0x00, 0xF4, 0x4F, 0xA2, 0x6E, 0xEA, 0x4D, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0x00, 0xF4, 0x4E, 0xA2, 0x50, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0x62, 0xF7, 0x16, 0x4A, -0x49, 0xE3, 0x82, 0x67, 0x00, 0x18, 0xE7, 0x0F, 0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, -0x39, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0xF4, 0x4E, 0xA2, 0x61, 0x42, -0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0xF4, 0x6E, 0xC2, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0xF4, 0x6E, 0xA2, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x08, 0x4A, 0x00, 0xF4, 0x4F, 0xA2, 0x6E, 0xEA, 0x0C, 0x22, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x08, 0x4A, 0x77, 0x9A, 0x04, 0x6A, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0x77, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0xF4, 0x4E, 0xA2, -0x0A, 0x6B, 0x6E, 0xEA, 0x07, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, -0x00, 0xF4, 0x6E, 0xC2, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, -0x06, 0xD4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0x9A, 0x04, 0x6A, 0x4D, 0xEB, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0x00, 0xF4, 0x4E, 0xA2, 0x09, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x00, 0xF4, 0x4F, 0xA2, 0x09, 0x6B, 0x6E, 0xEA, 0x10, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0x00, 0xF4, 0x4F, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x00, 0xF4, 0x4E, 0xA2, 0xFF, 0x4A, 0x6E, 0xEA, 0x0E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, -0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x41, 0xF4, 0x74, 0x9B, 0x80, 0x9B, 0x00, 0xF2, 0x00, 0x6B, -0x8D, 0xEB, 0x60, 0xDA, 0x35, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0xF4, -0x4F, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x70, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x4D, 0xE3, -0x06, 0x92, 0x60, 0xF3, 0x8E, 0x43, 0x62, 0x67, 0x10, 0x6A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, -0xD7, 0x03, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0xF4, 0x4F, 0xA2, 0x61, 0x42, -0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0xF4, 0x6F, 0xC2, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0xF4, 0x4F, 0xA2, 0x0A, 0x6B, 0x6E, 0xEA, -0x07, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x00, 0xF4, 0x6F, 0xC2, -0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x30, 0xF0, 0x20, 0x6A, -0x81, 0xF4, 0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x81, 0xF4, 0x60, 0x9B, 0x80, 0x9B, 0x30, 0xF0, -0x20, 0x6B, 0x81, 0xF4, 0x64, 0x9B, 0x8D, 0xEB, 0x60, 0xDA, 0x00, 0xF4, 0x1F, 0x6B, 0x04, 0xF7, -0x10, 0x6A, 0x00, 0xF0, 0x1A, 0x04, 0x04, 0xD4, 0x83, 0x67, 0x20, 0x6D, 0x00, 0x6E, 0xE2, 0x67, -0x00, 0x18, 0x3D, 0x0B, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x09, 0x97, 0x05, 0x63, -0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x02, 0xD4, 0x02, 0x92, 0x00, 0xD2, 0x00, 0x92, 0x60, 0xA2, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x80, 0xF4, 0x71, 0xC2, 0x00, 0x92, 0x61, 0xA2, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x80, 0xF4, 0x72, 0xC2, 0x00, 0x92, 0x62, 0xA2, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x80, 0xF4, 0x73, 0xC2, 0x00, 0x92, 0x63, 0xA2, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x80, 0xF4, 0x74, 0xC2, 0x00, 0x92, 0x64, 0xA2, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x80, 0xF4, 0x75, 0xC2, 0x00, 0x92, 0x65, 0xA2, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x80, 0xF4, 0x76, 0xC2, 0x00, 0x92, 0x66, 0xA2, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x80, 0xF4, 0x77, 0xC2, 0x01, 0x63, 0x20, 0xE8, -0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x05, 0xD2, 0x05, 0x92, 0x41, 0xA2, 0x7D, 0x67, -0x51, 0xC3, 0x05, 0x92, 0x40, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, 0x05, 0x22, 0x05, 0x92, 0x42, 0xA2, -0x9D, 0x67, 0x50, 0xC4, 0x04, 0x10, 0x05, 0x92, 0x41, 0xA2, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, -0x51, 0xA4, 0x7D, 0x67, 0x52, 0xC3, 0x22, 0x10, 0x9D, 0x67, 0x72, 0xA4, 0x05, 0x92, 0x80, 0xA2, -0x01, 0x6A, 0x4C, 0xEC, 0xFF, 0x6A, 0x8C, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x01, 0x0A, -0x7D, 0x67, 0x52, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xDC, 0x0A, 0x06, 0x2A, 0x9D, 0x67, 0x52, 0xA4, -0x82, 0x67, 0x00, 0x18, 0xA7, 0x09, 0x05, 0x10, 0x7D, 0x67, 0x52, 0xA3, 0x82, 0x67, 0x00, 0x18, -0x48, 0x09, 0x9D, 0x67, 0x52, 0xA4, 0x01, 0x4A, 0x7D, 0x67, 0x52, 0xC3, 0x9D, 0x67, 0x72, 0xA4, -0x9D, 0x67, 0x50, 0xA4, 0x63, 0xEA, 0x58, 0x67, 0xD7, 0x22, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, -0xFB, 0x63, 0x09, 0x62, 0x0A, 0xD4, 0x0A, 0x92, 0x07, 0xD2, 0x00, 0x6A, 0x7D, 0x67, 0x58, 0xC3, -0x07, 0x92, 0x40, 0xA2, 0x46, 0x32, 0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, -0x62, 0x67, 0x07, 0x92, 0x80, 0xA2, 0x01, 0x6A, 0x4C, 0xEC, 0xFF, 0x6A, 0x4C, 0xEC, 0x30, 0xF0, -0x20, 0x6A, 0x40, 0xF2, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x01, 0x6B, -0x8C, 0xEB, 0xA4, 0xA2, 0x02, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x64, 0xC2, 0x07, 0x92, -0x40, 0xA2, 0x46, 0x32, 0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, -0x07, 0x92, 0x40, 0xA2, 0x5A, 0x32, 0x82, 0x67, 0x01, 0x6A, 0x4C, 0xEC, 0xFF, 0x6A, 0x4C, 0xEC, -0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF2, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, -0x01, 0x6B, 0x8C, 0xEB, 0x78, 0x33, 0xA4, 0xA2, 0x41, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, -0x64, 0xC2, 0x07, 0x92, 0x40, 0xA2, 0x46, 0x32, 0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, -0x6C, 0xEA, 0x82, 0x67, 0x07, 0x92, 0x40, 0xA2, 0x5E, 0x33, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, -0x20, 0x6A, 0x40, 0xF2, 0x18, 0x4C, 0x84, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x7C, 0x33, -0xA4, 0xA2, 0x7F, 0x6C, 0xAC, 0xEC, 0x8D, 0xEB, 0x64, 0xC2, 0x07, 0x92, 0x40, 0xA2, 0x46, 0x32, -0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x82, 0x67, 0x07, 0x92, 0x61, 0xA2, -0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF2, 0x18, 0x4C, 0x84, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, -0x65, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x48, 0x9A, 0x60, 0x9A, 0xE0, 0xF7, 0x1F, 0x6A, -0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x64, 0xDA, 0x30, 0xF0, -0x20, 0x6A, 0x81, 0xF4, 0x4C, 0x9A, 0x40, 0x9A, 0x05, 0xD2, 0x00, 0x6A, 0x9D, 0x67, 0x50, 0xC4, -0x2A, 0x10, 0x5D, 0x67, 0x70, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF2, 0x18, 0x4B, 0x64, 0x33, -0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x64, 0xA2, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, -0x01, 0x6B, 0x6E, 0xEA, 0x13, 0x2A, 0x9D, 0x67, 0x50, 0xA4, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, -0x44, 0x67, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x9D, 0x67, 0x58, 0x84, 0x6D, 0xEA, -0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x7D, 0x67, 0x58, 0xC3, 0x9D, 0x67, 0x50, 0xA4, -0x01, 0x4A, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x50, 0xA4, 0x08, 0x5A, 0x58, 0x67, 0xD1, 0x2A, -0x7D, 0x67, 0x58, 0xA3, 0x00, 0xF6, 0x40, 0x33, 0x9D, 0x67, 0x58, 0xA4, 0x40, 0x32, 0x40, 0x32, -0x6D, 0xEA, 0x05, 0x93, 0x6D, 0xEA, 0x05, 0xD2, 0x05, 0x92, 0x00, 0x6C, 0xA2, 0x67, 0x00, 0x18, -0x0C, 0x07, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x07, 0xD5, -0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x40, 0x5A, 0x58, 0x67, 0x0D, 0x2A, 0x7D, 0x67, -0x58, 0xA3, 0x60, 0x5A, 0x58, 0x67, 0x08, 0x22, 0x5D, 0x67, 0x78, 0xA2, 0x07, 0x92, 0x83, 0x67, -0xA2, 0x67, 0x00, 0x18, 0xAB, 0x1D, 0x41, 0x10, 0x7D, 0x67, 0x58, 0xA3, 0x0C, 0x6B, 0x4E, 0xEB, -0x1C, 0x23, 0x0D, 0x52, 0x78, 0x67, 0x05, 0x23, 0x0E, 0x22, 0x01, 0x6B, 0x6E, 0xEA, 0x10, 0x22, -0x28, 0x10, 0xC2, 0x6B, 0x4E, 0xEB, 0x20, 0x23, 0xC5, 0x6B, 0x4E, 0xEB, 0x18, 0x23, 0x0D, 0x6B, -0x6E, 0xEA, 0x10, 0x22, 0x1E, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0x99, 0x10, 0x25, 0x10, -0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0xB8, 0x10, 0x20, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, -0xBD, 0x0C, 0x1B, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0x0B, 0x0D, 0x16, 0x10, 0x07, 0x92, -0x82, 0x67, 0x00, 0x18, 0xDC, 0x10, 0x11, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0x61, 0x04, -0x0C, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x81, 0xF4, -0x70, 0x9B, 0x80, 0x9B, 0x01, 0x6B, 0x8D, 0xEB, 0x60, 0xDA, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, -0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x54, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, -0x0F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x41, 0xC3, 0x9D, 0x67, 0x41, 0xA4, 0x80, 0xF1, 0x03, 0x22, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0x9A, 0x02, 0x6A, 0x4D, 0xEB, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0xDA, 0x76, 0x11, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0x60, 0xF3, 0x4C, 0xA2, 0x09, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x60, 0xF3, 0x4D, 0xA2, 0x07, 0x6E, 0xCE, 0xEA, 0x10, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x60, 0xF3, 0x4C, 0xA2, 0xFF, 0x4A, 0x6E, 0xEA, 0x0E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, -0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x81, 0xF4, 0x70, 0x9B, 0x80, 0x9B, 0xFF, 0x6B, 0x01, 0x4B, -0x8D, 0xEB, 0x60, 0xDA, 0x4C, 0x11, 0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, -0x9B, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x67, 0xEA, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, -0x20, 0xF1, 0x0C, 0x22, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0xBE, 0x10, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x08, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, 0xA2, 0x67, 0xDD, 0x67, 0x80, 0xA6, 0x30, 0xF0, -0x20, 0x6A, 0xE2, 0xF3, 0x7B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x74, 0x4A, 0x48, 0x33, 0xDD, 0x67, -0x40, 0xA6, 0x4D, 0xE3, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, -0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x7B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x74, 0x4A, -0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, 0x4D, 0xE3, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x15, 0x2A, -0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x7B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x74, 0x4A, 0x48, 0x33, -0xDD, 0x67, 0x40, 0xA6, 0x49, 0xE3, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x58, 0x9A, -0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x14, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, -0x7B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x74, 0x4A, 0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, 0x49, 0xE3, -0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, -0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xB4, 0x35, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE5, 0x89, 0xE2, -0x60, 0xF2, 0x6C, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, -0xA2, 0x67, 0x7D, 0x67, 0x40, 0xA3, 0x84, 0x42, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x7B, 0xA2, -0xFF, 0x6A, 0x6C, 0xEA, 0x7C, 0x4A, 0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, 0x4D, 0xE3, 0x1F, 0xF7, -0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, -0xE2, 0xF3, 0x7B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7C, 0x4A, 0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, -0x4D, 0xE3, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, -0x7B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7C, 0x4A, 0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, 0x49, 0xE3, -0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, -0x4C, 0xEB, 0x14, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x7B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, -0x7C, 0x4A, 0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, 0x49, 0xE3, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, -0x81, 0xF4, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, -0xB4, 0x35, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE5, 0x89, 0xE2, 0x60, 0xF2, 0x6C, 0xC2, 0x7D, 0x67, -0x40, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x40, 0xC4, 0xDD, 0x67, 0x40, 0xA6, 0x04, 0x5A, 0x58, 0x67, -0x3F, 0xF7, 0x1C, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x7B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, -0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, -0x4F, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xDD, 0x67, 0x41, 0x86, 0x6C, 0xEA, -0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x7D, 0x67, 0x41, 0xC3, 0x30, 0xF0, 0x20, 0x6A, -0x81, 0xF4, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xE2, 0xF3, 0x9B, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, -0x01, 0x6C, 0x84, 0xEB, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, -0x7B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, -0xE2, 0xF3, 0x7B, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x7B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, -0x03, 0x6B, 0x6C, 0xEA, 0x30, 0xF0, 0x20, 0x6B, 0xE2, 0xF3, 0x5B, 0xC3, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x08, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x60, 0xF3, 0x6D, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, 0x08, 0x6C, 0x8E, 0xEA, 0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x60, 0xF3, 0x6D, 0xC2, 0x0D, 0x10, 0x30, 0xF0, 0x20, 0x6A, -0x81, 0xF4, 0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x81, 0xF4, 0x70, 0x9B, 0x80, 0x9B, 0x02, 0x6B, -0x8D, 0xEB, 0x60, 0xDA, 0x04, 0x10, 0xDD, 0x67, 0x41, 0xA6, 0x9F, 0xF6, 0x06, 0x2A, 0x01, 0x63, -0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x60, 0xF3, 0x6C, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, -0x6E, 0xEA, 0x5F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x60, 0xF3, 0x4C, 0xA2, -0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x74, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0xF2, -0x4C, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x60, 0xF3, 0x4C, 0xA2, -0x54, 0x32, 0x60, 0xF2, 0x89, 0x42, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, -0x04, 0x4A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x46, 0x11, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0x60, 0xF3, 0x4C, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x08, 0x4A, 0x60, 0xF3, 0x6C, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x60, 0xF3, 0x6C, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, -0x6E, 0xEA, 0x0C, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0x9A, 0x02, 0x6A, -0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0xDA, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x08, 0x4A, 0x60, 0xF3, 0x4C, 0xA2, 0x08, 0x6B, 0x6E, 0xEA, 0x07, 0x2A, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x60, 0xF3, 0x6C, 0xC2, 0x00, 0x18, 0x74, 0x11, -0x01, 0x10, 0x00, 0x65, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x64, 0x67, -0x45, 0x67, 0x04, 0xD6, 0x9D, 0x67, 0x64, 0xCC, 0x7D, 0x67, 0x4C, 0xC3, 0x04, 0x93, 0x30, 0xF0, -0x20, 0x6A, 0xA1, 0xF4, 0x50, 0x9A, 0x4C, 0xEB, 0x9D, 0x67, 0x4C, 0xA4, 0x40, 0xF6, 0x40, 0x32, -0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x54, 0x9A, 0x6D, 0xEA, 0x00, 0xD2, 0x5D, 0x67, -0x64, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, -0x9D, 0x67, 0x64, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0A, 0x2A, 0x5D, 0x67, 0x64, 0xAA, -0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x58, 0x9A, 0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, 0x09, 0x10, -0x9D, 0x67, 0x64, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x5C, 0x9A, 0x49, 0xE3, 0x00, 0x93, -0x60, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x04, 0xD6, -0x9D, 0x67, 0x64, 0xCC, 0x7D, 0x67, 0x4C, 0xC3, 0x04, 0x92, 0x54, 0x33, 0x30, 0xF0, 0x20, 0x6A, -0xA1, 0xF4, 0x50, 0x9A, 0x4C, 0xEB, 0x9D, 0x67, 0x4C, 0xA4, 0x40, 0xF6, 0x40, 0x32, 0x4D, 0xEB, -0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x54, 0x9A, 0x6D, 0xEA, 0x00, 0xD2, 0x5D, 0x67, 0x64, 0xAA, -0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, -0x64, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0A, 0x2A, 0x5D, 0x67, 0x64, 0xAA, 0x30, 0xF0, -0x20, 0x6A, 0xA1, 0xF4, 0x58, 0x9A, 0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, 0x09, 0x10, 0x9D, 0x67, -0x64, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x5C, 0x9A, 0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, -0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x04, 0xD6, 0x9D, 0x67, 0x64, 0xCC, -0x7D, 0x67, 0x4C, 0xC3, 0x04, 0x94, 0x64, 0x67, 0x68, 0x32, 0x62, 0x67, 0x74, 0x32, 0x6B, 0xE2, -0x89, 0xE2, 0x40, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x50, 0x9A, 0x4C, 0xEB, -0x9D, 0x67, 0x4C, 0xA4, 0x40, 0xF6, 0x40, 0x32, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, -0x54, 0x9A, 0x6D, 0xEA, 0x00, 0xD2, 0x5D, 0x67, 0x64, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, -0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x64, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, -0x6C, 0xEA, 0x0A, 0x2A, 0x5D, 0x67, 0x64, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x58, 0x9A, -0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, 0x09, 0x10, 0x9D, 0x67, 0x64, 0xAC, 0x30, 0xF0, 0x20, 0x6A, -0xA1, 0xF4, 0x5C, 0x9A, 0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, -0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF4, 0x4C, 0x9A, 0x40, 0x9A, 0x00, 0xD2, 0x00, 0x92, -0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x48, 0x9A, 0x40, 0x9A, -0x00, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x6C, 0x9A, 0x00, 0x92, 0x4C, 0xEB, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x6D, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, -0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0x9B, 0x60, 0xDA, 0x01, 0x63, -0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x4C, 0x9A, 0x40, 0x9A, -0x04, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x50, 0x9A, 0x40, 0x9A, 0x03, 0xD2, 0x30, 0xF0, -0x20, 0x6A, 0x61, 0xF5, 0x54, 0x9A, 0x40, 0x9A, 0x02, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, -0x58, 0x9A, 0x40, 0x9A, 0x01, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x5C, 0x9A, 0x40, 0x9A, -0x00, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x68, 0x9A, 0x04, 0x92, 0x4C, 0xEB, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x65, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x61, 0x9A, 0x03, 0x92, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x66, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x62, 0x9A, 0x02, 0x92, 0x4C, 0xEB, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x67, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x63, 0x9A, 0x01, 0x92, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x68, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x64, 0x9A, 0x00, 0x92, 0x4C, 0xEB, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x69, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x4C, 0x9A, -0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x65, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, -0x61, 0xF5, 0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x66, 0x9B, 0x60, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, -0x67, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x58, 0x9A, 0x30, 0xF0, 0x20, 0x6B, -0x02, 0xF4, 0x08, 0x4B, 0x68, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x5C, 0x9A, -0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x69, 0x9B, 0x60, 0xDA, 0x03, 0x63, 0x20, 0xE8, -0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x40, 0x9A, 0x40, 0x9A, 0x01, 0xD2, 0x30, 0xF0, -0x20, 0x6A, 0x81, 0xF5, 0x44, 0x9A, 0x40, 0x9A, 0x00, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0x6E, 0x9A, 0x01, 0x92, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x71, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x6F, 0x9A, 0x00, 0x92, 0x4C, 0xEB, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x72, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, -0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x71, 0x9B, 0x60, 0xDA, 0x30, 0xF0, -0x20, 0x6A, 0x81, 0xF5, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x72, 0x9B, -0x60, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x74, 0x11, -0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, -0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x1E, 0x0C, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, -0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x23, 0x0C, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, -0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, 0x9D, 0x67, 0x68, 0xA4, 0x30, 0xF0, 0x20, 0x6A, -0x40, 0xF2, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x64, 0xA2, 0x01, 0x6A, -0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x01, 0x6B, 0x6E, 0xEA, 0x5E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x64, 0x9A, 0x5D, 0x67, 0x88, 0xA2, 0x30, 0xF0, 0x20, 0x6A, -0x40, 0xF2, 0x18, 0x4C, 0x84, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x45, 0xA2, 0x49, 0xE3, -0x5C, 0x32, 0x21, 0x4A, 0x00, 0xD2, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x48, 0x9A, -0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x44, 0xC3, 0x9D, 0x67, 0x68, 0xA4, 0x30, 0xF0, 0x20, 0x6A, -0x40, 0xF2, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x44, 0xA2, 0x5A, 0x32, -0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x5C, 0x32, 0x00, 0xF6, 0x40, 0x33, -0x00, 0xF6, 0x63, 0x33, 0x5D, 0x67, 0x88, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF2, 0x18, 0x4C, -0x84, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x44, 0xA2, 0x5E, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, -0x58, 0x32, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, -0x00, 0xF6, 0x63, 0x33, 0x9D, 0x67, 0x44, 0x84, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, -0x43, 0x32, 0x7D, 0x67, 0x44, 0xC3, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x48, 0x9A, -0x49, 0xE3, 0x9D, 0x67, 0x64, 0xA4, 0x60, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0xFD, 0x63, 0x05, 0x62, -0x00, 0x18, 0x7D, 0x16, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x44, 0x67, 0x7D, 0x67, -0x40, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x4C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, -0x62, 0x67, 0x03, 0x6A, 0x6C, 0xEA, 0x03, 0x6B, 0x6E, 0xEA, 0x1A, 0x2A, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x08, 0x4A, 0xA0, 0xF4, 0x53, 0xA2, 0x01, 0x6B, 0x6E, 0xEA, 0x11, 0x2A, 0x30, 0xF0, -0x20, 0x6A, 0x81, 0xF5, 0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x81, 0xF5, 0x70, 0x9B, 0x80, 0xA3, -0xFF, 0x6B, 0x6C, 0xEC, 0x80, 0x6B, 0x6B, 0xEB, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0x9A, 0x10, 0x6A, 0x4D, 0xEB, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x77, 0xDA, 0x20, 0xE8, 0x00, 0x65, 0x44, 0x67, 0x7D, 0x67, -0x40, 0xC3, 0x20, 0xE8, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, -0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0xE2, 0x0D, -0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, -0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, -0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, -0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, -0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, -0x44, 0x67, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0xC0, 0xF4, 0x48, 0xA2, 0x01, 0x6B, 0x6C, 0xEA, 0x00, 0xF1, 0x0B, 0x22, 0x9D, 0x67, 0x20, 0xF0, -0x40, 0xA4, 0x01, 0x6B, 0x4E, 0xEB, 0x13, 0x23, 0x02, 0x52, 0x78, 0x67, 0x02, 0x23, 0x08, 0x22, -0x22, 0x10, 0x02, 0x6B, 0x4E, 0xEB, 0x12, 0x23, 0x03, 0x6B, 0x6E, 0xEA, 0x16, 0x22, 0x1B, 0x10, -0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x54, 0x9A, 0x40, 0x9A, 0x05, 0xD2, 0x14, 0x10, 0x30, 0xF0, -0x20, 0x6A, 0x81, 0xF5, 0x58, 0x9A, 0x40, 0x9A, 0x05, 0xD2, 0x0D, 0x10, 0x30, 0xF0, 0x20, 0x6A, -0x81, 0xF5, 0x5C, 0x9A, 0x40, 0x9A, 0x05, 0xD2, 0x06, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, -0x40, 0x9A, 0x40, 0x9A, 0x05, 0xD2, 0x00, 0x6A, 0x9D, 0x67, 0x52, 0xC4, 0xC7, 0x10, 0xBD, 0x67, -0x52, 0xA5, 0x01, 0x6B, 0xC3, 0x67, 0xC4, 0xEA, 0x46, 0x67, 0x62, 0x67, 0x05, 0x92, 0x4C, 0xEB, -0x9D, 0x67, 0x52, 0xA4, 0xA3, 0x67, 0xA6, 0xEA, 0x45, 0x67, 0xDD, 0x67, 0x51, 0xC6, 0x5D, 0x67, -0x20, 0xF0, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x12, 0x4B, 0x68, 0x33, 0x02, 0xF4, -0x08, 0x4A, 0x49, 0xE3, 0x61, 0x9A, 0x9D, 0x67, 0x52, 0xA4, 0x01, 0x6C, 0xA4, 0x67, 0xA4, 0xEA, -0x45, 0x67, 0x4C, 0xEB, 0xDD, 0x67, 0x52, 0xA6, 0x83, 0x67, 0x86, 0xEA, 0x44, 0x67, 0xBD, 0x67, -0x50, 0xC5, 0xDD, 0x67, 0x71, 0xA6, 0x9D, 0x67, 0x50, 0xA4, 0x6E, 0xEA, 0x80, 0xF0, 0x11, 0x22, -0xBD, 0x67, 0x51, 0xA5, 0x01, 0x6E, 0xCE, 0xEA, 0x48, 0x2A, 0x5D, 0x67, 0x20, 0xF0, 0x60, 0xA2, -0x9D, 0x67, 0x52, 0xA4, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0x81, 0x0D, 0xBD, 0x67, -0x20, 0xF0, 0x80, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x60, 0xA6, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, -0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x61, 0x9A, 0xBD, 0x67, 0x52, 0xA5, -0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEA, 0x46, 0x67, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, -0x16, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x61, 0xDA, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, 0x5A, 0x2A, 0x7D, 0x67, -0x20, 0xF0, 0x40, 0xA3, 0x54, 0x33, 0x9D, 0x67, 0x52, 0xA4, 0x51, 0xE3, 0x30, 0xF0, 0x20, 0x6A, -0xA1, 0xF5, 0x44, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF1, 0x1A, 0x4C, 0x88, 0x34, -0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x61, 0xDA, 0x44, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, 0x3B, 0x2A, 0xBD, 0x67, 0x20, 0xF0, -0x60, 0xA5, 0xDD, 0x67, 0x52, 0xA6, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0x81, 0x0D, -0x5D, 0x67, 0x20, 0xF0, 0x80, 0xA2, 0xBD, 0x67, 0x20, 0xF0, 0x60, 0xA5, 0x30, 0xF0, 0x20, 0x6A, -0x20, 0xF1, 0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x61, 0x9A, 0xDD, 0x67, -0x52, 0xA6, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEA, 0x46, 0x67, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, -0x20, 0x6A, 0x20, 0xF1, 0x16, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x61, 0xDA, -0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x54, 0x33, 0x9D, 0x67, 0x52, 0xA4, 0x4D, 0xE3, 0x30, 0xF0, -0x20, 0x6A, 0x20, 0xF1, 0x1A, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, -0x61, 0xDA, 0xBD, 0x67, 0x52, 0xA5, 0x01, 0x4A, 0xDD, 0x67, 0x52, 0xC6, 0x7D, 0x67, 0x52, 0xA3, -0x20, 0x5A, 0x58, 0x67, 0x3F, 0xF7, 0x13, 0x2A, 0x5D, 0x67, 0x20, 0xF0, 0x60, 0xA2, 0x30, 0xF0, -0x20, 0x6A, 0x20, 0xF1, 0x12, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x05, 0x93, -0x61, 0xDA, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, -0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x4C, 0x9A, 0x60, 0xA2, -0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x6C, 0xEA, 0x03, 0x6B, 0x6E, 0xEA, 0x0E, 0x2A, -0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x70, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x50, 0x9A, -0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x7F, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x20, 0xE8, 0x00, 0x65, -0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x4C, 0x9A, 0x60, 0xA2, -0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x6C, 0xEA, 0x03, 0x6B, 0x6E, 0xEA, 0x0E, 0x2A, -0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x70, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x50, 0x9A, -0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x7F, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x20, 0xE8, 0x00, 0x65, -0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, -0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x02, 0xD4, 0x85, 0x67, 0x66, 0x67, 0x47, 0x67, 0xBD, 0x67, -0x8C, 0xC5, 0x9D, 0x67, 0x70, 0xC4, 0xBD, 0x67, 0x54, 0xC5, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, -0xA1, 0xF5, 0x48, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x42, 0xC3, 0x9D, 0x67, 0x50, 0xA4, -0x08, 0x6B, 0x4B, 0xE3, 0xFF, 0x6B, 0x67, 0xEA, 0xBD, 0x67, 0x4C, 0xA5, 0x83, 0x67, 0x84, 0xEA, -0x44, 0x67, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x4F, 0xEA, 0x00, 0xF6, 0x40, 0x33, -0x00, 0xF6, 0x63, 0x33, 0xBD, 0x67, 0x42, 0x85, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, -0x43, 0x32, 0x7D, 0x67, 0x41, 0xC3, 0x9D, 0x67, 0x74, 0xA4, 0xBD, 0x67, 0x50, 0xA5, 0x08, 0x6C, -0x4B, 0xE4, 0xFF, 0x6C, 0xA4, 0x67, 0xA7, 0xEA, 0x45, 0x67, 0x4C, 0xEB, 0x9D, 0x67, 0x4C, 0xA4, -0xA3, 0x67, 0xA4, 0xEA, 0x45, 0x67, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x9D, 0x67, -0x41, 0x84, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x40, 0xC5, -0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x48, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x60, 0xA4, -0x60, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x65, 0x67, 0x46, 0x67, 0xBD, 0x67, -0x84, 0xCD, 0x9D, 0x67, 0x6C, 0xC4, 0xBD, 0x67, 0x50, 0xC5, 0x5D, 0x67, 0x64, 0xAA, 0x30, 0xF0, -0x20, 0x6A, 0xA1, 0xF5, 0x48, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x41, 0xC3, 0x9D, 0x67, -0x61, 0xA4, 0xBD, 0x67, 0x4C, 0xA5, 0x83, 0x67, 0x87, 0xEA, 0x44, 0x67, 0x00, 0xF6, 0x40, 0x33, -0x00, 0xF6, 0x63, 0x33, 0xBD, 0x67, 0x50, 0xA5, 0x08, 0x6C, 0x4B, 0xE4, 0xFF, 0x6C, 0xA4, 0x67, -0xA7, 0xEA, 0x45, 0x67, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x6C, 0xEA, 0x00, 0xF6, -0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, 0x40, 0xA4, 0x01, 0x63, -0x20, 0xE8, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x44, 0x67, 0x0B, 0xD5, 0x7D, 0x67, 0x54, 0xCB, -0x00, 0x6A, 0x06, 0xD2, 0x9D, 0x67, 0x74, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x4C, 0x9A, -0x49, 0xE3, 0x40, 0x9A, 0x05, 0xD2, 0x0B, 0x92, 0x01, 0x4A, 0x02, 0x2A, 0x05, 0x92, 0x0E, 0x10, -0x0B, 0x92, 0x82, 0x67, 0x00, 0x18, 0xF0, 0x0A, 0x04, 0xD2, 0x05, 0x93, 0x0B, 0x92, 0x4C, 0xEB, -0x04, 0x92, 0x83, 0x67, 0x86, 0xEA, 0x44, 0x67, 0x06, 0xD2, 0x06, 0x92, 0x09, 0x97, 0x05, 0x63, -0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x44, 0x67, 0x0B, 0xD5, 0x0C, 0xD6, 0x7D, 0x67, -0x54, 0xCB, 0x5D, 0x67, 0x74, 0xAA, 0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, -0xD9, 0x14, 0x06, 0xD2, 0x0B, 0x92, 0x01, 0x4A, 0x0A, 0x2A, 0x5D, 0x67, 0x74, 0xAA, 0x30, 0xF0, -0x20, 0x6A, 0xA1, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x0C, 0x93, 0x60, 0xDA, 0x19, 0x10, 0x0B, 0x92, -0x82, 0x67, 0x00, 0x18, 0xF0, 0x0A, 0x04, 0xD2, 0x0B, 0x92, 0x4F, 0xEB, 0x06, 0x92, 0x4C, 0xEB, -0x04, 0x92, 0x0C, 0x94, 0x84, 0xEA, 0x0B, 0x92, 0x8C, 0xEA, 0x6D, 0xEA, 0x05, 0xD2, 0x5D, 0x67, -0x74, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x05, 0x93, 0x60, 0xDA, -0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x00, 0xD4, 0x01, 0xD5, 0x00, 0x92, 0x01, 0x6B, -0x4E, 0xEB, 0x13, 0x23, 0x01, 0x5A, 0x78, 0x67, 0x07, 0x2B, 0x02, 0x6B, 0x4E, 0xEB, 0x16, 0x23, -0x03, 0x6B, 0x6E, 0xEA, 0x1C, 0x22, 0x24, 0x10, 0x01, 0x92, 0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, -0xA1, 0xF5, 0x50, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x1C, 0x10, 0x01, 0x92, 0x48, 0x33, 0x30, 0xF0, -0x20, 0x6A, 0xA1, 0xF5, 0x54, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x13, 0x10, 0x01, 0x92, 0x48, 0x33, -0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x58, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x0A, 0x10, 0x01, 0x92, -0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x5C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x01, 0x10, -0x00, 0x6A, 0x20, 0xE8, 0xFB, 0x63, 0x09, 0x62, 0x0A, 0xD4, 0x0B, 0xD5, 0x0C, 0xD6, 0x00, 0x6A, -0x06, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x62, 0xF4, 0x1C, 0x4A, 0x05, 0xD2, 0x05, 0x92, 0x67, 0x42, -0x0D, 0x4B, 0x0A, 0x92, 0x4C, 0x32, 0x4C, 0x34, 0x89, 0xE2, 0x49, 0xE3, 0x04, 0xD2, 0x0B, 0x92, -0x00, 0xF5, 0x40, 0x33, 0x0C, 0x94, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x40, 0x9A, 0x8C, 0xEA, -0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x44, 0x9A, 0x6C, 0xEA, 0x06, 0xD2, 0x04, 0x92, -0x64, 0x9A, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x82, 0x67, 0x01, 0x6B, 0x6B, 0xEB, 0x06, 0x92, -0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xED, 0x14, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, -0xFB, 0x63, 0x09, 0x62, 0x64, 0x67, 0x45, 0x67, 0x0C, 0xD6, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xC4, -0x7D, 0x67, 0x56, 0xCB, 0x00, 0x6A, 0x06, 0xD2, 0x0C, 0x92, 0x01, 0x4A, 0x0A, 0x2A, 0x9D, 0x67, -0x20, 0xF0, 0x68, 0xA4, 0x9D, 0x67, 0x56, 0xAC, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x0A, 0x15, -0x18, 0x10, 0x5D, 0x67, 0x20, 0xF0, 0x68, 0xA2, 0x9D, 0x67, 0x56, 0xAC, 0x83, 0x67, 0xA2, 0x67, -0x00, 0x18, 0x0A, 0x15, 0x05, 0xD2, 0x0C, 0x92, 0x82, 0x67, 0x00, 0x18, 0xF0, 0x0A, 0x04, 0xD2, -0x05, 0x93, 0x0C, 0x92, 0x4C, 0xEB, 0x04, 0x92, 0x83, 0x67, 0x86, 0xEA, 0x44, 0x67, 0x06, 0xD2, -0x06, 0x92, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0xFB, 0x63, 0x09, 0x62, 0x64, 0x67, 0x45, 0x67, -0x0C, 0xD6, 0x0D, 0xD7, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xC4, 0x7D, 0x67, 0x56, 0xCB, 0x0C, 0x92, -0x01, 0x4A, 0x0B, 0x2A, 0x5D, 0x67, 0x20, 0xF0, 0x88, 0xA2, 0x5D, 0x67, 0x76, 0xAA, 0x0D, 0x92, -0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0x25, 0x15, 0x24, 0x10, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xA4, -0x9D, 0x67, 0x56, 0xAC, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x0A, 0x15, 0x06, 0xD2, 0x0C, 0x92, -0x82, 0x67, 0x00, 0x18, 0xF0, 0x0A, 0x04, 0xD2, 0x0C, 0x92, 0x4F, 0xEB, 0x06, 0x92, 0x4C, 0xEB, -0x04, 0x92, 0x0D, 0x94, 0x84, 0xEA, 0x0C, 0x92, 0x8C, 0xEA, 0x6D, 0xEA, 0x05, 0xD2, 0x5D, 0x67, -0x20, 0xF0, 0x88, 0xA2, 0x5D, 0x67, 0x76, 0xAA, 0x05, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, -0x25, 0x15, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0x62, 0xF4, -0x1C, 0x4A, 0x00, 0xD2, 0x00, 0x92, 0x81, 0xF4, 0x10, 0x6B, 0x69, 0xDA, 0x00, 0x92, 0x81, 0xF6, -0x10, 0x6B, 0x7B, 0xDA, 0x00, 0x92, 0x83, 0xF0, 0x10, 0x6B, 0xA0, 0xF0, 0x74, 0xDA, 0x00, 0x92, -0x83, 0xF2, 0x10, 0x6B, 0xE0, 0xF0, 0x7C, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0xFB, 0x63, 0x09, 0x62, -0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xC4, 0x7D, 0x67, 0x56, 0xCB, 0x00, 0x6A, -0x06, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x48, 0x9A, 0x60, 0xAA, 0xFF, 0xF7, 0x1F, 0x6A, -0x4C, 0xEB, 0xE1, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x48, 0xCC, 0x5D, 0x67, 0x68, 0xAA, -0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x49, 0xE3, 0x5C, 0x32, 0x06, 0xD2, 0x00, 0x6A, 0x7D, 0x67, -0x4E, 0xCB, 0x31, 0x10, 0x9D, 0x67, 0x4E, 0xAC, 0x48, 0x32, 0x62, 0x67, 0x06, 0x92, 0x4D, 0xE3, -0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x05, 0xD2, 0x7D, 0x67, -0x4E, 0xAB, 0x13, 0x2A, 0x83, 0xF1, 0x18, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x05, 0x92, 0xA3, 0x67, -0xC2, 0x67, 0x00, 0x18, 0xED, 0x14, 0x83, 0xF1, 0x18, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x05, 0x92, -0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xED, 0x14, 0x09, 0x10, 0x83, 0xF1, 0x18, 0x6C, 0x01, 0x6B, -0x6B, 0xEB, 0x05, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xED, 0x14, 0x9D, 0x67, 0x4E, 0xAC, -0x01, 0x4A, 0x7D, 0x67, 0x4E, 0xCB, 0x9D, 0x67, 0x6E, 0xAC, 0x9D, 0x67, 0x56, 0xAC, 0x43, 0xEB, -0x58, 0x67, 0xC8, 0x2A, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x44, 0x67, -0x7D, 0x67, 0x48, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x42, 0xC3, 0x7D, 0x67, 0x48, 0xA3, 0x56, 0x32, -0x7D, 0x67, 0x41, 0xC3, 0x5D, 0x67, 0x68, 0xA2, 0x1F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x40, 0xC3, -0x7D, 0x67, 0x41, 0xA3, 0x01, 0x6B, 0x4E, 0xEB, 0x25, 0x23, 0x02, 0x52, 0x78, 0x67, 0x02, 0x23, -0x2D, 0x22, 0x37, 0x10, 0x04, 0x6B, 0x4E, 0xEB, 0x10, 0x23, 0x06, 0x6B, 0x6E, 0xEA, 0x31, 0x2A, -0x7D, 0x67, 0x40, 0xA3, 0x11, 0x6B, 0x6B, 0xEB, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x44, 0x33, -0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x42, 0xC3, 0x24, 0x10, 0x7D, 0x67, 0x40, 0xA3, 0x07, 0x6B, -0x6B, 0xEB, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x44, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, -0x42, 0xC3, 0x17, 0x10, 0x7D, 0x67, 0x40, 0xA3, 0x03, 0x6B, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, -0x44, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x42, 0xC3, 0x0B, 0x10, 0x7D, 0x67, 0x40, 0xA3, -0x08, 0x6B, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x44, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, -0x42, 0xC3, 0x7D, 0x67, 0x42, 0x83, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0x44, 0x67, 0x7D, 0x67, -0x40, 0xC3, 0x7D, 0x67, 0x40, 0x83, 0x9F, 0xF7, 0x1D, 0x52, 0x58, 0x67, 0x05, 0x2A, 0x7D, 0x67, -0x40, 0x83, 0x14, 0x52, 0x58, 0x67, 0x02, 0x2A, 0x00, 0x6A, 0x0D, 0x10, 0x7D, 0x67, 0x40, 0x83, -0x00, 0x52, 0x58, 0x67, 0x02, 0x2A, 0x64, 0x6A, 0x06, 0x10, 0x7D, 0x67, 0x40, 0xA3, 0x67, 0x42, -0x5D, 0x4B, 0xFF, 0x6A, 0x6C, 0xEA, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, -0x48, 0xCB, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x50, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0xCA, 0xF7, -0x09, 0x4B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x54, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, -0x6C, 0xEA, 0x1A, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, -0x6C, 0xEA, 0x12, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x5C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, -0x6C, 0xEA, 0x0A, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x40, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, -0x6C, 0xEA, 0x02, 0x2A, 0x01, 0x6A, 0x1D, 0x10, 0x7D, 0x67, 0x48, 0xAB, 0xE0, 0xF3, 0x09, 0x5A, -0x58, 0x67, 0x0E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, -0xE1, 0xF5, 0x64, 0x9B, 0x80, 0x9B, 0x20, 0x6B, 0x8D, 0xEB, 0x60, 0xDA, 0x00, 0x6A, 0x09, 0x10, -0x32, 0x6C, 0x00, 0x18, 0xB4, 0x0C, 0x7D, 0x67, 0x48, 0xAB, 0x01, 0x4A, 0x7D, 0x67, 0x48, 0xCB, -0xC1, 0x17, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x60, 0xC4, -0x7D, 0x67, 0x44, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x48, 0x9A, 0x9D, 0x67, 0x60, 0xA4, -0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x9D, 0x67, 0x64, 0xA4, 0x60, 0xF0, -0x72, 0xC2, 0x20, 0xE8, 0xFE, 0x63, 0x1C, 0x65, 0x85, 0x67, 0x66, 0x67, 0x47, 0x67, 0xD8, 0x67, -0xBD, 0x67, 0xC8, 0xCD, 0xBD, 0x67, 0x94, 0xC5, 0xDD, 0x67, 0x78, 0xC6, 0x7D, 0x67, 0x5C, 0xC3, -0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x4C, 0x9A, 0x60, 0xAA, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, -0xE1, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x45, 0xCC, 0xBD, 0x67, 0x68, 0xAD, 0xDD, 0x67, -0x45, 0xAE, 0x49, 0xE3, 0x7D, 0x67, 0x48, 0xCB, 0x9D, 0x67, 0x48, 0xAC, 0x03, 0xD2, 0x03, 0x92, -0x5C, 0x32, 0x03, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x50, 0x9A, 0xBD, 0x67, 0x68, 0xAD, -0x60, 0xCA, 0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x54, 0x9A, 0x49, 0xE3, 0x40, 0xAA, -0xDD, 0x67, 0x44, 0xCE, 0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x58, 0x9A, 0x49, 0xE3, -0x40, 0x9A, 0x01, 0xD2, 0x7D, 0x67, 0x54, 0xA3, 0x08, 0x22, 0x9D, 0x67, 0x64, 0xAC, 0x10, 0xF0, -0x00, 0x6A, 0x4B, 0xEA, 0x6D, 0xEA, 0xBD, 0x67, 0x44, 0xCD, 0xDD, 0x67, 0x64, 0xAE, 0x47, 0xF7, -0x00, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x44, 0xCB, 0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, -0xE1, 0xF5, 0x54, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x64, 0xAC, 0x60, 0xCA, 0x03, 0x93, 0x30, 0xF0, -0x20, 0x6A, 0xE1, 0xF5, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x01, 0x6A, -0x6C, 0xEA, 0xBD, 0x67, 0x40, 0xC5, 0xDD, 0x67, 0x40, 0xA6, 0x07, 0x22, 0x01, 0x93, 0x03, 0xF7, -0x01, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x01, 0xD2, 0x0C, 0x10, 0x01, 0x93, 0x1F, 0xF7, 0x01, 0x6A, -0x4B, 0xEA, 0x6C, 0xEA, 0x01, 0xD2, 0x7D, 0x67, 0x5C, 0xA3, 0x40, 0x32, 0x01, 0x93, 0x6D, 0xEA, -0x01, 0xD2, 0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x40, 0x9A, 0x6C, 0xEA, 0x01, 0xD2, -0x9D, 0x67, 0x58, 0xA4, 0x80, 0xF4, 0x40, 0x33, 0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, -0x01, 0xF6, 0x44, 0x9A, 0x6D, 0xEA, 0x01, 0xD2, 0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, -0x58, 0x9A, 0x49, 0xE3, 0x01, 0x93, 0x60, 0xDA, 0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, -0x48, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0x03, 0x94, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x48, 0x9A, -0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0xF7, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x03, 0x92, -0x02, 0x63, 0x20, 0xE8, 0xFA, 0x63, 0x0B, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x6C, 0x9A, -0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x4C, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x7F, 0x6C, -0x8C, 0xEA, 0x40, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x50, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, -0x4C, 0xEB, 0x01, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x7D, 0x67, -0x56, 0xC3, 0x02, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x01, 0x6A, 0x7D, 0x67, 0x51, 0xCB, 0x05, 0x02, -0x82, 0x67, 0x00, 0x18, 0x4B, 0x10, 0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, 0xFE, 0x63, 0x44, 0x67, -0x7D, 0x67, 0x50, 0xC3, 0x00, 0x6A, 0x02, 0xD2, 0x00, 0x6A, 0x01, 0xD2, 0x00, 0x6A, 0x9D, 0x67, -0x40, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x54, 0x9A, 0x40, 0x9A, 0x02, 0xD2, 0x02, 0x93, -0x80, 0xF1, 0x01, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x02, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, -0x58, 0x9A, 0x40, 0x9A, 0x01, 0xD2, 0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x5C, 0x9A, -0x6C, 0xEA, 0x01, 0xD2, 0x7D, 0x67, 0x50, 0xA3, 0x01, 0x6B, 0x4E, 0xEB, 0x08, 0x23, 0x02, 0x6C, -0x8E, 0xEA, 0x0B, 0x2A, 0x02, 0x93, 0x80, 0x6A, 0x6D, 0xEA, 0x02, 0xD2, 0x06, 0x10, 0x02, 0x93, -0xFF, 0x6A, 0x01, 0x4A, 0x6D, 0xEA, 0x02, 0xD2, 0x00, 0x65, 0x50, 0x6A, 0x7D, 0x67, 0x40, 0xC3, -0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x54, 0x9A, 0x02, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, -0x01, 0xF6, 0x58, 0x9A, 0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x40, 0x9A, -0x9D, 0x67, 0x60, 0xA4, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x44, 0x9A, 0x9D, 0x67, -0x60, 0xA4, 0x60, 0xC2, 0x02, 0x63, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, 0x65, 0x67, 0x46, 0x67, -0xBD, 0x67, 0x20, 0xF0, 0x80, 0xC5, 0x9D, 0x67, 0x20, 0xF0, 0x64, 0xC4, 0xBD, 0x67, 0x20, 0xF0, -0x48, 0xC5, 0x00, 0x6A, 0x7D, 0x67, 0x52, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x51, 0xC4, 0x00, 0x6A, -0xBD, 0x67, 0x50, 0xC5, 0x7D, 0x67, 0x20, 0xF0, 0x44, 0xA3, 0x9D, 0x67, 0x51, 0xC4, 0xBD, 0x67, -0x51, 0xA5, 0x01, 0x6B, 0x6E, 0xEA, 0x05, 0x22, 0x9D, 0x67, 0x51, 0xA4, 0x03, 0x6D, 0xAE, 0xEA, -0x04, 0x2A, 0x09, 0x6A, 0x7D, 0x67, 0x52, 0xC3, 0x03, 0x10, 0x0A, 0x6A, 0x9D, 0x67, 0x52, 0xC4, -0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x68, 0x9A, 0xBD, 0x67, 0x91, 0x85, 0xFF, 0x6A, 0x8C, 0xEA, -0x0F, 0x6C, 0x8C, 0xEA, 0xBD, 0x67, 0x92, 0xA5, 0x90, 0x34, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, -0x83, 0x34, 0x8D, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, -0x40, 0xC3, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x93, 0x16, 0x30, 0xF0, -0x20, 0x6A, 0x21, 0xF6, 0x4C, 0x9A, 0x40, 0xA2, 0x9D, 0x67, 0x50, 0xC4, 0xBD, 0x67, 0x70, 0xA5, -0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x24, 0x5A, -0x58, 0x67, 0x07, 0x2A, 0x5D, 0x67, 0x70, 0xA2, 0x80, 0x6A, 0x4B, 0xEA, 0x6D, 0xEA, 0x7D, 0x67, -0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x4C, 0x9A, 0x9D, 0x67, 0x70, 0xA4, 0x60, 0xC2, -0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x65, 0x67, 0x46, 0x67, -0xBD, 0x67, 0x20, 0xF0, 0x80, 0xC5, 0x9D, 0x67, 0x20, 0xF0, 0x64, 0xC4, 0xBD, 0x67, 0x20, 0xF0, -0x48, 0xC5, 0x00, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x66, 0xF0, 0x18, 0x4A, -0x04, 0xD2, 0xBD, 0x67, 0x20, 0xF0, 0x80, 0xA5, 0x5D, 0x67, 0x20, 0xF0, 0x64, 0xA2, 0xBD, 0x67, -0x20, 0xF0, 0x48, 0xA5, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBE, 0x16, 0x7D, 0x67, 0x54, 0xA3, -0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, -0x7D, 0x67, 0x48, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x54, 0x9A, -0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x45, 0xC3, 0x7D, 0x67, 0x48, 0xA3, 0x4C, 0x32, 0x62, 0x67, -0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, -0x1F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x44, 0xC3, 0x7D, 0x67, 0x48, 0xA3, 0x4C, 0x32, 0x62, 0x67, -0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x5C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x7D, 0x67, 0x41, 0xCB, -0x7D, 0x67, 0x48, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x40, 0x9A, -0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x40, 0xC3, 0x01, 0x63, 0x20, 0xE8, 0xFE, 0x63, 0x44, 0x67, -0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, -0x81, 0xF6, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x07, 0x6A, 0x6C, 0xEA, -0x7D, 0x67, 0x4A, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, -0xA1, 0xF6, 0x44, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x10, 0x6A, -0x6C, 0xEA, 0x53, 0x32, 0x7D, 0x67, 0x49, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, -0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x44, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, -0x03, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x48, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, -0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x58, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x42, 0x32, 0x42, 0x32, -0x7D, 0x67, 0x43, 0xCB, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, -0x81, 0xF6, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x1F, 0x6A, 0x6C, 0xEA, -0x7D, 0x67, 0x44, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, -0x81, 0xF6, 0x5C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x42, 0x32, 0x4A, 0x32, 0x00, 0xD2, 0x02, 0x63, -0x20, 0xE8, 0x00, 0x65, 0xFE, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, -0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, -0xFF, 0x6A, 0x4C, 0xEB, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x4B, 0xC3, 0x7D, 0x67, 0x50, 0xA3, -0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, -0xFF, 0x6A, 0x6C, 0xEA, 0x4E, 0x33, 0xFF, 0x6A, 0x4C, 0xEB, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, -0x4A, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, -0x44, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x08, 0x6A, 0x6C, 0xEA, -0x4F, 0x32, 0x7D, 0x67, 0x49, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, -0x20, 0x6A, 0xA1, 0xF6, 0x44, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, -0x10, 0x6A, 0x6C, 0xEA, 0x53, 0x32, 0x7D, 0x67, 0x48, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, -0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x58, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x42, 0x32, -0x42, 0x32, 0x7D, 0x67, 0x43, 0xCB, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, -0x20, 0x6A, 0x81, 0xF6, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0x9A, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, -0xE0, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x42, 0xCB, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, -0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x48, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, -0x6C, 0xEA, 0x62, 0x67, 0x40, 0x6A, 0x6C, 0xEA, 0x5B, 0x32, 0x7D, 0x67, 0x43, 0xC3, 0x7D, 0x67, -0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x48, 0x9A, 0x49, 0xE3, -0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x5E, 0x32, 0x7D, 0x67, 0x42, 0xC3, 0x7D, 0x67, 0x50, 0xA3, -0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x4C, 0x9A, 0x49, 0xE3, 0x40, 0xA2, -0x7D, 0x67, 0x41, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, -0xA1, 0xF6, 0x50, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x40, 0xC3, 0x02, 0x63, 0x20, 0xE8, -0xFC, 0x63, 0x07, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x54, 0x9A, 0x40, 0xA2, 0x7D, 0x67, -0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x58, 0x9A, 0x40, 0xA2, 0x9D, 0x67, 0x51, 0xC4, -0x5D, 0x67, 0x70, 0xA2, 0x9D, 0x67, 0x51, 0xA4, 0x6E, 0xEA, 0x48, 0x22, 0x7D, 0x67, 0x50, 0xA3, -0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, -0xFF, 0x6A, 0x6C, 0xEA, 0x5A, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x01, 0x6B, 0x4E, 0xEB, 0x12, 0x23, -0x02, 0x52, 0x78, 0x67, 0x02, 0x23, 0x08, 0x22, 0x1E, 0x10, 0x02, 0x6B, 0x4E, 0xEB, 0x10, 0x23, -0x03, 0x6B, 0x6E, 0xEA, 0x13, 0x22, 0x17, 0x10, 0x9D, 0x67, 0x50, 0xA4, 0x82, 0x67, 0x00, 0x18, -0x5A, 0x31, 0x11, 0x10, 0x7D, 0x67, 0x50, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x0A, 0x17, 0x0B, 0x10, -0x9D, 0x67, 0x50, 0xA4, 0x82, 0x67, 0x00, 0x18, 0x27, 0x17, 0x05, 0x10, 0x7D, 0x67, 0x50, 0xA3, -0x82, 0x67, 0x00, 0x18, 0x59, 0x17, 0x9D, 0x67, 0x50, 0xA4, 0x01, 0x4A, 0x7D, 0x67, 0x50, 0xC3, -0x9D, 0x67, 0x71, 0xA4, 0x9D, 0x67, 0x50, 0xA4, 0x6E, 0xEA, 0xC0, 0x2A, 0x30, 0xF0, 0x20, 0x6A, -0xA1, 0xF6, 0x54, 0x9A, 0x9D, 0x67, 0x70, 0xA4, 0x60, 0xC2, 0x01, 0x10, 0x00, 0x65, 0x07, 0x97, -0x04, 0x63, 0x00, 0xEF, 0x00, 0xD4, 0x00, 0x92, 0x05, 0x6B, 0x62, 0xDA, 0x00, 0x94, 0x00, 0x6A, -0x00, 0x6B, 0x40, 0xDC, 0x61, 0xDC, 0x20, 0xE8, 0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0x66, 0xF0, -0x18, 0x4A, 0x00, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, 0x58, 0x9A, 0x03, 0x6B, 0x60, 0xC2, -0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF3, 0x60, 0x9B, -0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF3, -0x68, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, 0x58, 0x9A, 0x02, 0x6B, 0x60, 0xC2, -0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF3, 0x60, 0x9B, -0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF3, -0x68, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, 0x58, 0x9A, 0x01, 0x6B, 0x60, 0xC2, -0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF3, 0x6C, 0x9B, -0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF3, -0x68, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, 0x58, 0x9A, 0x00, 0x6B, 0x60, 0xC2, -0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF3, 0x60, 0x9B, -0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF3, -0x68, 0x9B, 0x60, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0xDC, 0x63, 0x47, 0x62, 0x30, 0xF0, 0x20, 0x6A, -0x66, 0xF0, 0x18, 0x4A, 0x04, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x07, 0x04, 0x62, 0x67, 0x01, 0xF2, -0x0C, 0x4B, 0x54, 0x6A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xD7, 0x03, 0x30, 0xF0, 0x20, 0x6A, -0x1C, 0x04, 0x62, 0x67, 0x61, 0xF2, 0x00, 0x4B, 0x54, 0x6A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, -0xD7, 0x03, 0x30, 0xF0, 0x20, 0x6A, 0x31, 0x04, 0x62, 0x67, 0xA1, 0xF2, 0x14, 0x4B, 0x54, 0x6A, -0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xD7, 0x03, 0x00, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x87, 0x10, -0x7D, 0x67, 0x58, 0xA3, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, -0x18, 0x4A, 0x49, 0xE3, 0x05, 0xD2, 0x05, 0x92, 0x49, 0x6B, 0x60, 0xC2, 0x05, 0x92, 0x00, 0x6B, -0x61, 0xC2, 0x05, 0x92, 0x00, 0x6B, 0x63, 0xC2, 0x05, 0x92, 0x09, 0x6B, 0x64, 0xC2, 0x05, 0x92, -0x8E, 0xA2, 0x0D, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6E, 0xC2, 0x05, 0x92, 0x8E, 0xA2, 0x04, 0x6B, -0x6B, 0xEB, 0x8C, 0xEB, 0x6E, 0xC2, 0x05, 0x92, 0x8F, 0xA2, 0x04, 0x6B, 0x8D, 0xEB, 0x6F, 0xC2, -0x05, 0x92, 0x8E, 0xA2, 0x31, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6E, 0xC2, 0x05, 0x92, 0x8E, 0xA2, -0x40, 0x6B, 0x8D, 0xEB, 0x6E, 0xC2, 0x05, 0x92, 0x8E, 0xA2, 0x80, 0x6B, 0x6B, 0xEB, 0x8D, 0xEB, -0x6E, 0xC2, 0x05, 0x92, 0x9D, 0xA2, 0x03, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x7D, 0xC2, 0x05, 0x92, -0x9D, 0xA2, 0x41, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x7D, 0xC2, 0x05, 0x92, 0x00, 0x6B, 0x7C, 0xC2, -0x05, 0x92, 0x91, 0xA2, 0x31, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x71, 0xC2, 0x05, 0x92, 0x00, 0x6B, -0x72, 0xC2, 0x05, 0x92, 0x8F, 0xA2, 0x41, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, 0x05, 0x92, -0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6B, 0xC2, 0x05, 0x92, 0x90, 0xA2, 0x08, 0x6B, -0x6B, 0xEB, 0x8C, 0xEB, 0x70, 0xC2, 0x05, 0x92, 0x91, 0xA2, 0x10, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, -0x71, 0xC2, 0x05, 0x92, 0x8B, 0xA2, 0x39, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6B, 0xC2, 0x05, 0x92, -0x00, 0x6B, 0x76, 0xC2, 0x05, 0x92, 0x00, 0x6B, 0x69, 0xC2, 0x05, 0x92, 0x01, 0x6B, 0x6B, 0xEB, -0x68, 0xC2, 0x05, 0x92, 0x9D, 0xA2, 0x21, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x7D, 0xC2, 0x05, 0x92, -0x49, 0x6B, 0x67, 0xC2, 0x7D, 0x67, 0x58, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, -0x58, 0x83, 0x00, 0x52, 0x58, 0x67, 0x7F, 0xF7, 0x13, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0x00, 0x6B, 0x63, 0xF4, 0x66, 0xC2, 0x00, 0x18, 0x8D, 0x1E, 0x00, 0x18, 0xE2, 0x17, -0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, 0x4C, 0x9A, 0x33, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, -0x62, 0x67, 0x65, 0xF7, 0x0C, 0x4B, 0x07, 0x02, 0x83, 0x67, 0xA2, 0x67, 0x54, 0x6E, 0x00, 0x18, -0xD7, 0x03, 0x30, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0xC5, 0xF7, 0x00, 0x4B, 0x31, 0x02, 0x83, 0x67, -0xA2, 0x67, 0x54, 0x6E, 0x00, 0x18, 0xD7, 0x03, 0x30, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x06, 0xF0, -0x14, 0x4B, 0x1C, 0x02, 0x83, 0x67, 0xA2, 0x67, 0x54, 0x6E, 0x00, 0x18, 0xD7, 0x03, 0x47, 0x97, -0x24, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x06, 0xD4, 0x07, 0xD5, 0x08, 0xD6, 0x09, 0xD7, -0x06, 0x04, 0x00, 0x18, 0x4B, 0x10, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFC, 0x63, 0x07, 0x62, -0x08, 0xD4, 0x09, 0xD5, 0x0A, 0xD6, 0x0B, 0xD7, 0x0A, 0x92, 0x01, 0x4A, 0x2D, 0x22, 0x09, 0x93, -0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x05, 0x22, 0x09, 0x93, -0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x08, 0x2A, 0x09, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, -0x48, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x07, 0x10, 0x09, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, -0x4C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x05, 0xD2, 0x0A, 0x92, 0x82, 0x67, 0x00, 0x18, 0xF0, 0x0A, -0x04, 0xD2, 0x0A, 0x92, 0x4F, 0xEB, 0x05, 0x92, 0x4C, 0xEB, 0x04, 0x92, 0x0B, 0x94, 0xA4, 0x67, -0xA4, 0xEA, 0x45, 0x67, 0x6D, 0xEA, 0x0B, 0xD2, 0x09, 0x93, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, -0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x05, 0x22, 0x09, 0x93, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, -0x09, 0x2A, 0x09, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, 0x48, 0x9A, 0x49, 0xE3, 0x0B, 0x93, -0x60, 0xDA, 0x08, 0x10, 0x09, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, 0x4C, 0x9A, 0x49, 0xE3, -0x0B, 0x93, 0x60, 0xDA, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, -0x0A, 0xD4, 0x0B, 0xD5, 0x0C, 0xD6, 0x00, 0x6A, 0x06, 0xD2, 0x0B, 0x93, 0x1F, 0xF7, 0x00, 0x6A, -0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x05, 0x22, 0x0B, 0x93, 0x1F, 0xF7, 0x00, 0x6A, -0x6C, 0xEA, 0x08, 0x2A, 0x0B, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, 0x48, 0x9A, 0x49, 0xE3, -0x40, 0x9A, 0x07, 0x10, 0x0B, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, 0x4C, 0x9A, 0x49, 0xE3, -0x40, 0x9A, 0x05, 0xD2, 0x0C, 0x92, 0x82, 0x67, 0x00, 0x18, 0xF0, 0x0A, 0x04, 0xD2, 0x05, 0x93, -0x0C, 0x92, 0x4C, 0xEB, 0x04, 0x92, 0x83, 0x67, 0x86, 0xEA, 0x44, 0x67, 0x06, 0xD2, 0x06, 0x92, -0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x30, 0xF0, 0x20, 0x6A, -0x66, 0xF0, 0x18, 0x4A, 0x05, 0xD2, 0x00, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x24, 0x10, 0x9D, 0x67, -0x58, 0xA4, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, 0x50, 0x9A, 0x49, 0xE3, -0x40, 0xA2, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x70, 0xA4, 0x08, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, -0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x58, 0xA4, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, -0x20, 0xF6, 0x50, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x70, 0xA4, 0x60, 0xC2, 0x7D, 0x67, 0x58, 0xA3, -0x01, 0x4A, 0x9D, 0x67, 0x58, 0xC4, 0x7D, 0x67, 0x58, 0x83, 0x00, 0x52, 0x58, 0x67, 0xD7, 0x22, -0x00, 0x18, 0x16, 0x18, 0x00, 0x18, 0xCB, 0x30, 0x05, 0x92, 0x82, 0x67, 0x00, 0x18, 0xDD, 0x17, -0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xF9, 0x63, 0x0E, 0xD4, 0x0F, 0xD5, 0x10, 0xD6, -0x04, 0x6A, 0x04, 0xD2, 0x00, 0x6A, 0x03, 0xD2, 0x10, 0x92, 0x02, 0xD2, 0x0E, 0x92, 0x06, 0xD2, -0x07, 0x11, 0x0F, 0x92, 0x40, 0x82, 0x25, 0x6B, 0x6E, 0xEA, 0x08, 0x22, 0x0F, 0x92, 0x60, 0x82, -0x06, 0x92, 0x60, 0xC2, 0x06, 0x92, 0x01, 0x4A, 0x06, 0xD2, 0xF7, 0x10, 0x08, 0x02, 0x05, 0xD2, -0x03, 0x92, 0x13, 0x22, 0x05, 0x92, 0x30, 0x6B, 0x60, 0xC2, 0x05, 0x92, 0x01, 0x4A, 0x05, 0xD2, -0x9D, 0x67, 0x67, 0xA4, 0x58, 0x6A, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, -0x05, 0x92, 0x60, 0xC2, 0x05, 0x92, 0x01, 0x4A, 0x05, 0xD2, 0x0F, 0x92, 0x01, 0x4A, 0x40, 0x82, -0x62, 0x6B, 0x6E, 0xEA, 0x40, 0x2A, 0x0F, 0x92, 0x02, 0x4A, 0x40, 0x82, 0x78, 0x6C, 0x8E, 0xEA, -0x06, 0x22, 0x0F, 0x92, 0x02, 0x4A, 0x40, 0x82, 0x58, 0x6B, 0x6E, 0xEA, 0x34, 0x2A, 0x02, 0x92, -0x40, 0x82, 0x9D, 0x67, 0x46, 0xC4, 0x0F, 0x92, 0x02, 0x4A, 0x40, 0x82, 0x78, 0x6B, 0x6E, 0xEA, -0x02, 0x2A, 0x20, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0x9D, 0x67, 0x47, 0xC4, 0x04, 0x6A, 0x04, 0xD2, -0x1B, 0x10, 0x5D, 0x67, 0x66, 0xA2, 0x04, 0x92, 0x67, 0xEA, 0x0F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, -0x20, 0x6A, 0x20, 0xF6, 0x14, 0x4A, 0x49, 0xE3, 0x60, 0x82, 0x9D, 0x67, 0x47, 0xA4, 0x6D, 0xEA, -0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x05, 0x92, 0x60, 0xC2, 0x05, 0x92, 0x01, 0x4A, -0x05, 0xD2, 0x04, 0x92, 0xFC, 0x4A, 0x04, 0xD2, 0x04, 0x92, 0x00, 0x52, 0x58, 0x67, 0xE1, 0x22, -0x0F, 0x92, 0x02, 0x4A, 0x0F, 0xD2, 0x0F, 0x92, 0x01, 0x4A, 0x40, 0x82, 0x77, 0x6B, 0x6E, 0xEA, -0x41, 0x2A, 0x0F, 0x92, 0x02, 0x4A, 0x40, 0x82, 0x78, 0x6C, 0x8E, 0xEA, 0x06, 0x22, 0x0F, 0x92, -0x02, 0x4A, 0x40, 0x82, 0x58, 0x6B, 0x6E, 0xEA, 0x35, 0x2A, 0x02, 0x92, 0x40, 0xAA, 0x9D, 0x67, -0x42, 0xCC, 0x0F, 0x92, 0x02, 0x4A, 0x40, 0x82, 0x78, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x20, 0x6A, -0x01, 0x10, 0x00, 0x6A, 0x9D, 0x67, 0x47, 0xC4, 0x0C, 0x6A, 0x04, 0xD2, 0x1B, 0x10, 0x5D, 0x67, -0x62, 0xAA, 0x04, 0x92, 0x67, 0xEA, 0x0F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, -0x14, 0x4A, 0x49, 0xE3, 0x60, 0x82, 0x9D, 0x67, 0x47, 0xA4, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, -0x00, 0xF6, 0x63, 0x33, 0x05, 0x92, 0x60, 0xC2, 0x05, 0x92, 0x01, 0x4A, 0x05, 0xD2, 0x04, 0x92, -0xFC, 0x4A, 0x04, 0xD2, 0x04, 0x92, 0x00, 0x52, 0x58, 0x67, 0xE1, 0x22, 0x0F, 0x92, 0x02, 0x4A, -0x0F, 0xD2, 0x3E, 0x10, 0x0F, 0x92, 0x01, 0x4A, 0x40, 0x82, 0x78, 0x6B, 0x6E, 0xEA, 0x06, 0x22, -0x0F, 0x92, 0x01, 0x4A, 0x40, 0x82, 0x58, 0x6C, 0x8E, 0xEA, 0x32, 0x2A, 0x02, 0x92, 0x40, 0x9A, -0x00, 0xD2, 0x0F, 0x92, 0x01, 0x4A, 0x40, 0x82, 0x78, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x20, 0x6A, -0x01, 0x10, 0x00, 0x6A, 0x9D, 0x67, 0x47, 0xC4, 0x1C, 0x6A, 0x04, 0xD2, 0x1A, 0x10, 0x00, 0x93, -0x04, 0x92, 0x66, 0xEA, 0x0F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, 0x14, 0x4A, -0x49, 0xE3, 0x60, 0x82, 0x9D, 0x67, 0x47, 0xA4, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, -0x63, 0x33, 0x05, 0x92, 0x60, 0xC2, 0x05, 0x92, 0x01, 0x4A, 0x05, 0xD2, 0x04, 0x92, 0xFC, 0x4A, -0x04, 0xD2, 0x04, 0x92, 0x00, 0x52, 0x58, 0x67, 0xE2, 0x22, 0x0F, 0x92, 0x01, 0x4A, 0x0F, 0xD2, -0x08, 0x02, 0x07, 0xD2, 0x0A, 0x10, 0x07, 0x92, 0x60, 0x82, 0x06, 0x92, 0x60, 0xC2, 0x06, 0x92, -0x01, 0x4A, 0x06, 0xD2, 0x07, 0x92, 0x01, 0x4A, 0x07, 0xD2, 0x07, 0x93, 0x05, 0x92, 0x43, 0xEB, -0x58, 0x67, 0xF1, 0x2A, 0x02, 0x92, 0x04, 0x4A, 0x02, 0xD2, 0x0F, 0x92, 0x01, 0x4A, 0x0F, 0xD2, -0x0F, 0x92, 0x40, 0x82, 0xFF, 0xF6, 0x15, 0x2A, 0x0E, 0x92, 0x03, 0x22, 0x06, 0x92, 0x00, 0x6B, -0x60, 0xC2, 0x06, 0x93, 0x0E, 0x92, 0x4B, 0xE3, 0x07, 0x63, 0x20, 0xE8, 0xFD, 0x63, 0x05, 0x62, -0x07, 0xD5, 0x08, 0xD6, 0x09, 0xD7, 0x06, 0xD4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x63, 0xF4, 0x48, 0xA2, 0x01, 0x6B, 0x6E, 0xEA, 0x19, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0x63, 0xF4, 0x49, 0xA2, 0x12, 0x2A, 0x06, 0x93, 0x06, 0x02, 0x04, 0x4A, 0x30, 0xF0, -0x20, 0x6C, 0xE2, 0xF2, 0x18, 0x4C, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xFA, 0x18, 0x30, 0xF0, -0x20, 0x6A, 0xE2, 0xF2, 0x18, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x25, 0x1A, 0x05, 0x97, 0x03, 0x63, -0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x02, 0xD4, 0x02, 0x92, 0x40, 0xA2, 0x7D, 0x67, 0x46, 0xC3, -0x02, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x08, 0x6A, 0x6C, 0xEA, 0x4F, 0x32, 0x9D, 0x67, -0x45, 0xC4, 0x7D, 0x67, 0x46, 0xA3, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, -0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0xD2, 0x02, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x5E, 0x33, -0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x4C, 0xEB, 0x00, 0x92, -0x7C, 0x33, 0xAE, 0xA2, 0x7F, 0x6C, 0xAC, 0xEC, 0x8D, 0xEB, 0x6E, 0xC2, 0x02, 0x92, 0x02, 0x4A, -0x40, 0xA2, 0x62, 0x67, 0x40, 0x6A, 0x6C, 0xEA, 0x5B, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, -0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x00, 0x92, 0x01, 0x6B, 0x8C, 0xEB, -0x78, 0x33, 0xAE, 0xA2, 0x41, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6E, 0xC2, 0x9D, 0x67, -0x45, 0xA4, 0x80, 0xF0, 0x0B, 0x2A, 0x02, 0x92, 0x01, 0x4A, 0x40, 0xA2, 0x1F, 0x6B, 0x6C, 0xEA, -0x00, 0x93, 0x44, 0xC3, 0x02, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, -0xFF, 0x6A, 0x4C, 0xEB, 0x03, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, -0x83, 0x67, 0x4C, 0xEC, 0x00, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0xAE, 0xA2, 0x04, 0x6C, 0x8B, 0xEC, -0xAC, 0xEC, 0x8D, 0xEB, 0x6E, 0xC2, 0x02, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x03, 0x6A, -0x4C, 0xEB, 0xFF, 0x6A, 0x4C, 0xEB, 0x03, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, -0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x00, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0x68, 0x33, 0xAE, 0xA2, -0x0D, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6E, 0xC2, 0x02, 0x92, 0x01, 0x4A, 0x40, 0xA2, -0x5E, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, -0x4C, 0xEC, 0x00, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0x68, 0x33, 0xAF, 0xA2, 0x05, 0x6C, 0x8B, 0xEC, -0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0x02, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x30, 0x6A, -0x6C, 0xEA, 0x53, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, -0x83, 0x67, 0x4C, 0xEC, 0x00, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0x70, 0x33, 0xAE, 0xA2, 0x31, 0x6C, -0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6E, 0xC2, 0x00, 0x6A, 0x7D, 0x67, 0x44, 0xC3, 0x18, 0x10, -0x9D, 0x67, 0x46, 0xA4, 0x4C, 0x32, 0x62, 0x67, 0x9D, 0x67, 0x44, 0xA4, 0x4D, 0xE3, 0x30, 0xF0, -0x20, 0x6A, 0x40, 0xF7, 0x50, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x64, 0xA4, 0x03, 0x4B, 0x02, 0x94, -0x6D, 0xE4, 0x60, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x44, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x44, 0xC4, -0x7D, 0x67, 0x44, 0xA3, 0x04, 0x5A, 0x58, 0x67, 0xE3, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x01, 0x63, -0x20, 0xE8, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x40, 0xA2, 0x7D, 0x67, -0x51, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x50, 0xC4, 0x18, 0x10, 0x7D, 0x67, 0x51, 0xA3, 0x4C, 0x32, -0x62, 0x67, 0x9D, 0x67, 0x50, 0xA4, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF7, 0x54, 0x9A, -0x49, 0xE3, 0x9D, 0x67, 0x70, 0xA4, 0x03, 0x4B, 0x08, 0x94, 0x6D, 0xE4, 0x60, 0xA3, 0x60, 0xC2, -0x7D, 0x67, 0x50, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x50, 0xC4, 0x7D, 0x67, 0x50, 0xA3, 0x02, 0x5A, -0x58, 0x67, 0xE3, 0x2A, 0x7D, 0x67, 0x51, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xEA, 0x28, 0x07, 0x97, -0x04, 0x63, 0x00, 0xEF, 0xFA, 0x63, 0x0B, 0x62, 0x0C, 0xD4, 0x00, 0x6A, 0x7D, 0x67, 0x56, 0xC3, -0x00, 0x6A, 0x9D, 0x67, 0x54, 0xC4, 0x01, 0x6A, 0xBD, 0x67, 0x53, 0xC5, 0x00, 0x6A, 0x7D, 0x67, -0x51, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x50, 0xC4, 0x00, 0x6A, 0xBD, 0x67, 0x57, 0xC5, 0x22, 0x10, -0x7D, 0x67, 0x57, 0xA3, 0x0C, 0x93, 0x49, 0xE3, 0x40, 0xA2, 0x22, 0x22, 0x9D, 0x67, 0x54, 0xA4, -0x01, 0x4A, 0xBD, 0x67, 0x54, 0xC5, 0x7D, 0x67, 0x56, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x56, 0xC4, -0xBD, 0x67, 0x56, 0xA5, 0x0B, 0x6B, 0x6E, 0xEA, 0x08, 0x2A, 0x00, 0x6A, 0x9D, 0x67, 0x56, 0xC4, -0xBD, 0x67, 0x53, 0xA5, 0x01, 0x4A, 0x7D, 0x67, 0x53, 0xC3, 0x9D, 0x67, 0x57, 0xA4, 0x01, 0x4A, -0xBD, 0x67, 0x57, 0xC5, 0x7D, 0x67, 0x57, 0xA3, 0x37, 0x5A, 0x58, 0x67, 0xD9, 0x2A, 0x01, 0x10, -0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x47, 0xA2, 0x0F, 0x5A, -0x58, 0x67, 0x10, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x47, 0xA2, -0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, -0x67, 0xC2, 0x07, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x63, 0xF4, -0x67, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x47, 0xA2, 0x50, 0x32, -0x7D, 0x67, 0x50, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x57, 0xC4, 0x8E, 0x10, 0xBD, 0x67, 0x77, 0xA5, -0x43, 0x67, 0x48, 0x32, 0x48, 0x34, 0x4B, 0xE4, 0x6B, 0xE2, 0x7D, 0x67, 0x55, 0xC3, 0x9D, 0x67, -0x73, 0xA4, 0xBD, 0x67, 0x57, 0xA5, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x6F, 0x42, 0xFF, 0x6A, -0x4C, 0xEB, 0x0F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x9D, 0x67, 0x70, 0xA4, 0xBD, 0x67, -0x51, 0xA5, 0x4D, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5A, 0xC3, 0x9D, 0x67, 0x77, 0xA4, -0xBD, 0x67, 0x53, 0xA5, 0xFF, 0x4A, 0x6E, 0xEA, 0x3A, 0x2A, 0x7D, 0x67, 0x53, 0xA3, 0x01, 0x6B, -0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x43, 0x67, 0x48, 0x32, 0x48, 0x34, 0x4B, 0xE4, -0x6F, 0xE2, 0xFF, 0x6A, 0x4C, 0xEB, 0x9D, 0x67, 0x54, 0xA4, 0x49, 0xE3, 0xBD, 0x67, 0x52, 0xC5, -0x00, 0x6A, 0x7D, 0x67, 0x56, 0xC3, 0x13, 0x10, 0x9D, 0x67, 0x56, 0xA4, 0x01, 0x4A, 0xBD, 0x67, -0x96, 0xA5, 0xBD, 0x67, 0x75, 0xA5, 0x6D, 0xE4, 0x0C, 0x94, 0x6D, 0xE4, 0x60, 0xA3, 0x04, 0x04, -0x49, 0xE4, 0x6A, 0xC2, 0x7D, 0x67, 0x56, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x56, 0xC4, 0xBD, 0x67, -0x76, 0xA5, 0x9D, 0x67, 0x52, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0xE6, 0x2A, 0x7D, 0x67, 0x52, 0xA3, -0x61, 0x42, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x53, 0xCC, 0x1F, 0x10, 0x00, 0x6A, -0xBD, 0x67, 0x56, 0xC5, 0x13, 0x10, 0x7D, 0x67, 0x56, 0xA3, 0x01, 0x4A, 0xBD, 0x67, 0x96, 0xA5, -0xBD, 0x67, 0x75, 0xA5, 0x6D, 0xE4, 0x0C, 0x94, 0x6D, 0xE4, 0x60, 0xA3, 0x04, 0x04, 0x49, 0xE4, -0x6A, 0xC2, 0x7D, 0x67, 0x56, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x56, 0xC4, 0xBD, 0x67, 0x56, 0xA5, -0x0B, 0x5A, 0x58, 0x67, 0xE8, 0x2A, 0x0C, 0x6A, 0x7D, 0x67, 0x53, 0xCB, 0x00, 0x6A, 0x9D, 0x67, -0x58, 0xC4, 0x06, 0x94, 0x07, 0x95, 0x08, 0x96, 0x09, 0x97, 0x00, 0x18, 0x8D, 0x18, 0xBD, 0x67, -0x57, 0xA5, 0x01, 0x4A, 0x7D, 0x67, 0x57, 0xC3, 0x9D, 0x67, 0x77, 0xA4, 0xBD, 0x67, 0x53, 0xA5, -0x43, 0xEB, 0x58, 0x67, 0x7F, 0xF7, 0x0A, 0x2A, 0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, 0x00, 0x65, -0xFA, 0x63, 0x0B, 0x62, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x70, 0xC4, 0x7D, 0x67, -0x20, 0xF0, 0x54, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x50, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, -0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x05, 0x6A, 0x7D, 0x67, -0x51, 0xCB, 0x0F, 0x6A, 0x9D, 0x67, 0x54, 0xC4, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, 0x9D, 0x67, -0x56, 0xC4, 0x7D, 0x67, 0x20, 0xF0, 0x54, 0xA3, 0x9D, 0x67, 0x57, 0xC4, 0x04, 0x92, 0x20, 0xF0, -0x45, 0xA2, 0x7D, 0x67, 0x58, 0xC3, 0x04, 0x92, 0x20, 0xF0, 0x46, 0xA2, 0x9D, 0x67, 0x59, 0xC4, -0x04, 0x92, 0x20, 0xF0, 0x47, 0xA2, 0x7D, 0x67, 0x5A, 0xC3, 0x05, 0x94, 0x06, 0x95, 0x07, 0x96, -0x08, 0x97, 0x00, 0x18, 0x8D, 0x18, 0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, 0xF7, 0x63, 0x11, 0x62, -0x44, 0x67, 0x7D, 0x67, 0x40, 0xF0, 0x48, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF7, 0x78, 0x9A, -0x09, 0xD3, 0x62, 0x67, 0x20, 0xF7, 0x18, 0x4B, 0x61, 0x9B, 0x0A, 0xD3, 0x20, 0xF7, 0x18, 0x4A, -0x48, 0xA2, 0x9D, 0x67, 0x20, 0xF0, 0x4C, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF7, 0x64, 0x9A, -0x0C, 0xD3, 0x62, 0x67, 0x40, 0xF7, 0x04, 0x4B, 0x61, 0x9B, 0x0D, 0xD3, 0x40, 0xF7, 0x04, 0x4A, -0x48, 0xA2, 0xBD, 0x67, 0x20, 0xF0, 0x58, 0xC5, 0x7D, 0x67, 0x40, 0xF0, 0x48, 0xA3, 0x01, 0x6C, -0x8E, 0xEA, 0x5E, 0x2A, 0x00, 0x6A, 0xBD, 0x67, 0x52, 0xC5, 0x54, 0x10, 0x7D, 0x67, 0x52, 0xA3, -0x04, 0x03, 0x49, 0xE3, 0x20, 0xF0, 0x40, 0xA2, 0xFF, 0x6B, 0x4C, 0xEB, 0x0B, 0x5B, 0x78, 0x67, -0x01, 0x2B, 0x0A, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x50, 0xA4, 0x62, 0x42, 0xFF, 0xF7, -0x1F, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x51, 0xCD, 0x0E, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x01, 0x6A, -0x9D, 0x67, 0x56, 0xC4, 0xBD, 0x67, 0x52, 0xA5, 0x04, 0x03, 0x49, 0xE3, 0x54, 0xA2, 0x7D, 0x67, -0x57, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x51, 0xC4, 0x1B, 0x10, 0xBD, 0x67, 0x51, 0xA5, 0x02, 0x4A, -0x9D, 0x67, 0x72, 0xA4, 0x04, 0x04, 0x6D, 0xE4, 0x74, 0xA3, 0x83, 0x67, 0xBD, 0x67, 0x71, 0xA5, -0x71, 0xE4, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, 0x63, 0xF3, 0x64, 0xA3, -0x04, 0x04, 0x49, 0xE4, 0x66, 0xC2, 0x7D, 0x67, 0x51, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x51, 0xC4, -0xBD, 0x67, 0x71, 0xA5, 0x9D, 0x67, 0x50, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0xDE, 0x2A, 0x05, 0x94, -0x06, 0x95, 0x07, 0x96, 0x08, 0x97, 0x00, 0x18, 0x8D, 0x18, 0x7D, 0x67, 0x52, 0xA3, 0x01, 0x4A, -0x9D, 0x67, 0x52, 0xC4, 0xBD, 0x67, 0x52, 0xA5, 0x09, 0x5A, 0x58, 0x67, 0xA7, 0x2A, 0xC7, 0x10, -0x7D, 0x67, 0x40, 0xF0, 0x48, 0xA3, 0x08, 0x6C, 0x8E, 0xEA, 0x5E, 0x2A, 0x00, 0x6A, 0xBD, 0x67, -0x52, 0xC5, 0x54, 0x10, 0x7D, 0x67, 0x52, 0xA3, 0x04, 0x03, 0x49, 0xE3, 0x20, 0xF0, 0x40, 0xA2, -0xFF, 0x6B, 0x4C, 0xEB, 0x0B, 0x5B, 0x78, 0x67, 0x01, 0x2B, 0x0A, 0x6A, 0x7D, 0x67, 0x50, 0xC3, -0x9D, 0x67, 0x50, 0xA4, 0x62, 0x42, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x51, 0xCD, -0x0E, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x08, 0x6A, 0x9D, 0x67, 0x56, 0xC4, 0xBD, 0x67, 0x52, 0xA5, -0x04, 0x03, 0x49, 0xE3, 0x54, 0xA2, 0x7D, 0x67, 0x57, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x51, 0xC4, -0x1B, 0x10, 0xBD, 0x67, 0x51, 0xA5, 0x02, 0x4A, 0x9D, 0x67, 0x72, 0xA4, 0x04, 0x04, 0x6D, 0xE4, -0x74, 0xA3, 0x83, 0x67, 0xBD, 0x67, 0x71, 0xA5, 0x71, 0xE4, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, -0x08, 0x4B, 0x6D, 0xE4, 0xA3, 0xF3, 0x78, 0xA3, 0x04, 0x04, 0x49, 0xE4, 0x66, 0xC2, 0x7D, 0x67, -0x51, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x51, 0xC4, 0xBD, 0x67, 0x71, 0xA5, 0x9D, 0x67, 0x50, 0xA4, -0x43, 0xEB, 0x58, 0x67, 0xDE, 0x2A, 0x05, 0x94, 0x06, 0x95, 0x07, 0x96, 0x08, 0x97, 0x00, 0x18, -0x8D, 0x18, 0x7D, 0x67, 0x52, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x52, 0xC4, 0xBD, 0x67, 0x52, 0xA5, -0x09, 0x5A, 0x58, 0x67, 0xA7, 0x2A, 0x63, 0x10, 0x7D, 0x67, 0x40, 0xF0, 0x48, 0xA3, 0x09, 0x6C, -0x8E, 0xEA, 0x5D, 0x2A, 0x00, 0x6A, 0xBD, 0x67, 0x52, 0xC5, 0x54, 0x10, 0x7D, 0x67, 0x52, 0xA3, -0x04, 0x03, 0x49, 0xE3, 0x20, 0xF0, 0x40, 0xA2, 0xFF, 0x6B, 0x4C, 0xEB, 0x0B, 0x5B, 0x78, 0x67, -0x01, 0x2B, 0x0A, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x50, 0xA4, 0x62, 0x42, 0xFF, 0xF7, -0x1F, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x51, 0xCD, 0x0E, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x09, 0x6A, -0x9D, 0x67, 0x56, 0xC4, 0xBD, 0x67, 0x52, 0xA5, 0x04, 0x03, 0x49, 0xE3, 0x54, 0xA2, 0x7D, 0x67, -0x57, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x51, 0xC4, 0x1B, 0x10, 0xBD, 0x67, 0x51, 0xA5, 0x02, 0x4A, -0x9D, 0x67, 0x72, 0xA4, 0x04, 0x04, 0x6D, 0xE4, 0x74, 0xA3, 0x83, 0x67, 0xBD, 0x67, 0x71, 0xA5, -0x71, 0xE4, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE4, 0x03, 0xF4, 0x6C, 0xA3, -0x04, 0x04, 0x49, 0xE4, 0x66, 0xC2, 0x7D, 0x67, 0x51, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x51, 0xC4, -0xBD, 0x67, 0x71, 0xA5, 0x9D, 0x67, 0x50, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0xDE, 0x2A, 0x05, 0x94, -0x06, 0x95, 0x07, 0x96, 0x08, 0x97, 0x00, 0x18, 0x8D, 0x18, 0x7D, 0x67, 0x52, 0xA3, 0x01, 0x4A, -0x9D, 0x67, 0x52, 0xC4, 0xBD, 0x67, 0x52, 0xA5, 0x09, 0x5A, 0x58, 0x67, 0xA7, 0x2A, 0x11, 0x97, -0x09, 0x63, 0x00, 0xEF, 0xFB, 0x63, 0x09, 0x62, 0x0A, 0xD4, 0x0A, 0x92, 0x01, 0x4A, 0x40, 0xA2, -0x7D, 0x67, 0x59, 0xC3, 0x0A, 0x92, 0x05, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x02, 0x6A, 0x6C, 0xEA, -0x06, 0x22, 0x7D, 0x67, 0x59, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xC7, 0x1A, 0x89, 0x10, 0x0A, 0x92, -0x40, 0xA2, 0x7D, 0x67, 0x5A, 0xC3, 0x0A, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x7D, 0x67, 0x58, 0xC3, -0x0A, 0x92, 0x04, 0x4A, 0x40, 0xA2, 0x50, 0x32, 0x40, 0x33, 0x60, 0x33, 0x63, 0x33, 0x63, 0x33, -0x0A, 0x92, 0x03, 0x4A, 0x40, 0xA2, 0x6D, 0xEA, 0x40, 0x32, 0x40, 0x32, 0x43, 0x32, 0x43, 0x32, -0x7D, 0x67, 0x4B, 0xCB, 0x7D, 0x67, 0x59, 0xA3, 0x01, 0x6B, 0x6E, 0xEA, 0x15, 0x2A, 0x30, 0xF0, -0x20, 0x6A, 0x40, 0xF6, 0x08, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x25, 0x1A, 0x5D, 0x67, 0x98, 0xA2, -0x5D, 0x67, 0x6B, 0xAA, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x49, 0xE4, 0x63, 0xF3, 0x64, 0xC2, 0x54, 0x10, 0x7D, 0x67, 0x59, 0xA3, 0x08, 0x6B, 0x6E, 0xEA, -0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF6, 0x14, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x25, 0x1A, -0x5D, 0x67, 0x98, 0xA2, 0x5D, 0x67, 0x6B, 0xAA, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0xA3, 0xF3, 0x78, 0xC2, 0x3A, 0x10, 0x7D, 0x67, 0x59, 0xA3, -0x09, 0x6B, 0x6E, 0xEA, 0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF6, 0x14, 0x4A, 0x82, 0x67, -0x00, 0x18, 0x25, 0x1A, 0x5D, 0x67, 0x98, 0xA2, 0x5D, 0x67, 0x6B, 0xAA, 0xFF, 0x6A, 0x4C, 0xEB, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x03, 0xF4, 0x6C, 0xC2, 0x20, 0x10, -0x7D, 0x67, 0x59, 0xA3, 0x0A, 0x6B, 0x6E, 0xEA, 0x1B, 0x2A, 0x07, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, -0x54, 0xC3, 0x28, 0xF3, 0x01, 0x6A, 0x7D, 0x67, 0x4B, 0xCB, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF7, -0x58, 0x9A, 0x04, 0xD2, 0x5D, 0x67, 0xB4, 0xA2, 0x5D, 0x67, 0x6B, 0xAA, 0x30, 0xF0, 0x20, 0x6A, -0x82, 0x67, 0x80, 0xF6, 0x04, 0x4C, 0x04, 0x92, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0x8B, 0x19, -0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, -0x40, 0xA2, 0x7D, 0x67, 0x55, 0xC3, 0x7D, 0x67, 0x55, 0xA3, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, -0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x04, 0x92, 0x5A, 0xA2, -0x7D, 0x67, 0x54, 0xC3, 0x08, 0x92, 0x02, 0x4A, 0x60, 0xA2, 0x04, 0x92, 0x7A, 0xC2, 0x08, 0x92, -0x03, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x20, 0x6A, 0x6C, 0xEA, 0x57, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, -0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x04, 0x92, 0x01, 0x6B, -0x8C, 0xEB, 0x74, 0x33, 0xBD, 0xA2, 0x21, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x7D, 0xC2, -0x08, 0x92, 0x03, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x4C, 0xEB, -0x01, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, -0x04, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0xBD, 0xA2, 0x02, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, -0x7D, 0xC2, 0x08, 0x92, 0x03, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x02, 0x6A, 0x6C, 0xEA, 0x47, 0x33, -0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, -0x04, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0x64, 0x33, 0xBD, 0xA2, 0x03, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, -0x8D, 0xEB, 0x7D, 0xC2, 0x08, 0x92, 0x03, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x40, 0x6A, 0x6C, 0xEA, -0x5B, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, -0x4C, 0xEC, 0x04, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0x78, 0x33, 0xBD, 0xA2, 0x41, 0x6C, 0x8B, 0xEC, -0xAC, 0xEC, 0x8D, 0xEB, 0x7D, 0xC2, 0x04, 0x92, 0x5D, 0xA2, 0x20, 0x6B, 0x6C, 0xEA, 0x16, 0x22, -0x7D, 0x67, 0x55, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x15, 0x31, 0x5D, 0x67, 0x95, 0xA2, 0x04, 0x92, -0x5A, 0xA2, 0x62, 0x67, 0x04, 0x92, 0x4E, 0xA2, 0x4A, 0x32, 0xA2, 0x67, 0x03, 0x6A, 0x4C, 0xED, -0xFF, 0x6A, 0xAC, 0xEA, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xB2, 0x25, 0x07, 0x97, 0x04, 0x63, -0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x40, 0xA2, 0x7D, 0x67, -0x50, 0xC3, 0x08, 0x92, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, -0x63, 0xC2, 0x08, 0x92, 0x01, 0x4A, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x63, 0xF4, 0x64, 0xC2, 0x7D, 0x67, 0x50, 0xA3, 0x03, 0x6B, 0x6E, 0xEA, 0x38, 0x2A, 0x08, 0x92, -0x02, 0x4A, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x60, 0xC2, -0x08, 0x92, 0x03, 0x4A, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, -0x61, 0xC2, 0x08, 0x92, 0x04, 0x4A, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x63, 0xF4, 0x62, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x40, 0xA2, -0xA2, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x41, 0xA2, 0x62, 0x67, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x42, 0xA2, 0x30, 0xF0, 0x20, 0x6C, -0xA0, 0xF6, 0x10, 0x4C, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x34, 0x10, 0x7D, 0x67, -0x50, 0xA3, 0x02, 0x6B, 0x6E, 0xEA, 0x2F, 0x2A, 0x08, 0x92, 0x02, 0x4A, 0x60, 0xA2, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x60, 0xC2, 0x08, 0x92, 0x03, 0x4A, 0x60, 0xA2, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x61, 0xC2, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x08, 0x4A, 0x01, 0x6B, 0x6B, 0xEB, 0x63, 0xF4, 0x62, 0xC2, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x40, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0x63, 0xF4, 0x41, 0xA2, 0x30, 0xF0, 0x20, 0x6C, 0xE0, 0xF6, 0x00, 0x4C, 0xA3, 0x67, -0xC2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x01, 0x6B, -0x63, 0xF4, 0x66, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x63, 0xF4, -0x65, 0xC2, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, -0x40, 0xA2, 0x7D, 0x67, 0x52, 0xC3, 0x08, 0x92, 0x01, 0x4A, 0x40, 0xA2, 0x9D, 0x67, 0x51, 0xC4, -0x08, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x7D, 0x67, 0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0x01, 0x6B, 0x63, 0xF4, 0x68, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x9D, 0x67, 0x72, 0xA4, 0x63, 0xF4, 0x68, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x9D, 0x67, 0x71, 0xA4, 0x63, 0xF4, 0x69, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x9D, 0x67, 0x70, 0xA4, 0x63, 0xF4, 0x6A, 0xC2, 0x7D, 0x67, 0x51, 0xA3, 0x02, 0x22, 0x00, 0x18, -0x9E, 0x21, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF7, 0x04, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, -0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFA, 0x63, 0x0B, 0x62, 0x0C, 0xD4, 0x0C, 0x92, -0x40, 0xA2, 0x7D, 0x67, 0x53, 0xC3, 0x0C, 0x92, 0x01, 0x4A, 0x40, 0xA2, 0x7D, 0x67, 0x52, 0xC3, -0x0C, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x7D, 0x67, 0x51, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, -0x0B, 0x10, 0x7D, 0x67, 0x50, 0xA3, 0x04, 0x03, 0x49, 0xE3, 0x00, 0x6B, 0x66, 0xC2, 0x7D, 0x67, -0x50, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x0C, 0x5A, 0x58, 0x67, -0xF0, 0x2A, 0x5D, 0x67, 0x71, 0xA2, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x48, 0x22, -0x7D, 0x67, 0x53, 0xA3, 0x81, 0x5A, 0x58, 0x67, 0x43, 0x2A, 0x7D, 0x67, 0x52, 0xA3, 0x81, 0x5A, -0x58, 0x67, 0x3E, 0x2A, 0x01, 0x6A, 0x7D, 0x67, 0x56, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0x45, 0xF6, 0x78, 0x9A, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x57, 0xC3, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x45, 0xF6, 0x58, 0x9A, 0x42, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, -0x7D, 0x67, 0x58, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x45, 0xF6, 0x58, 0x9A, -0x42, 0x33, 0x62, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x59, 0xC3, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x08, 0x4A, 0x45, 0xF6, 0x58, 0x9A, 0x00, 0xF6, 0x42, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, -0x7D, 0x67, 0x5A, 0xC3, 0x0D, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x05, 0x6A, 0x7D, 0x67, 0x51, 0xCB, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x45, 0xF6, 0x78, 0xDA, 0xDF, 0x11, -0x5D, 0x67, 0x71, 0xA2, 0x02, 0x6A, 0x6C, 0xEA, 0xC0, 0xF0, 0x16, 0x22, 0x02, 0x6A, 0x7D, 0x67, -0x56, 0xC3, 0x7D, 0x67, 0x53, 0xA3, 0x81, 0x5A, 0x58, 0x67, 0x5D, 0x22, 0x5D, 0x67, 0x73, 0xA2, -0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, -0x62, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x57, 0xC3, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, -0x20, 0x6A, 0xA2, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x42, 0xAA, -0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x58, 0xC3, -0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, -0x08, 0x4A, 0x49, 0xE3, 0x62, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x59, 0xC3, 0x5D, 0x67, -0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, -0x49, 0xE3, 0x42, 0xAA, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, -0x7D, 0x67, 0x5A, 0xC3, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF7, 0x0C, 0x4B, -0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, 0x5D, 0x67, 0x73, 0xA2, -0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, -0x00, 0x6B, 0x62, 0xCA, 0x04, 0x10, 0x16, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, 0x57, 0xC3, 0x7D, 0x67, -0x52, 0xA3, 0x81, 0x5A, 0x58, 0x67, 0x5D, 0x22, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, -0xA2, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x62, 0xAA, 0xFF, 0x6A, -0x6C, 0xEA, 0x7D, 0x67, 0x5B, 0xC3, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF7, -0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x42, 0xAA, 0x42, 0x33, 0xFF, 0xF7, -0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5C, 0xC3, 0x5D, 0x67, 0x72, 0xA2, -0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, -0x62, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5D, 0xC3, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, -0x20, 0x6A, 0x22, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x42, 0xAA, -0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5E, 0xC3, -0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, -0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, -0x22, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, -0x04, 0x10, 0x16, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, 0x5B, 0xC3, 0x0D, 0x6A, 0x7D, 0x67, 0x54, 0xC3, -0x09, 0x6A, 0x7D, 0x67, 0x51, 0xCB, 0x03, 0x11, 0x7D, 0x67, 0x51, 0xA3, 0xE0, 0xF0, 0x19, 0x2A, -0x7D, 0x67, 0x53, 0xA3, 0x81, 0x5A, 0x58, 0x67, 0x6F, 0x22, 0x7D, 0x67, 0x53, 0xA3, 0x7D, 0x67, -0x56, 0xC3, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF6, 0x0C, 0x4B, 0x64, 0x33, -0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x57, 0xC3, -0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF6, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, -0x08, 0x4A, 0x49, 0xE3, 0x40, 0xAA, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, -0x6C, 0xEA, 0x7D, 0x67, 0x58, 0xC3, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF6, -0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, -0x7D, 0x67, 0x59, 0xC3, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF6, 0x0C, 0x4B, -0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x40, 0xAA, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, -0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5A, 0xC3, 0x7D, 0x67, 0x53, 0xA3, 0x54, 0x32, -0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF7, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, -0x6C, 0xEA, 0x7D, 0x67, 0x5B, 0xC3, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF6, -0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, 0x5D, 0x67, -0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF6, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, -0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, 0x04, 0x10, 0x7D, 0x67, 0x53, 0xA3, 0x7D, 0x67, 0x56, 0xC3, -0x7D, 0x67, 0x52, 0xA3, 0x81, 0x5A, 0x58, 0x67, 0x71, 0x22, 0x7D, 0x67, 0x52, 0xA3, 0x7D, 0x67, -0x5C, 0xC3, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF6, 0x0C, 0x4B, 0x64, 0x33, -0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5D, 0xC3, -0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF6, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, -0x08, 0x4A, 0x49, 0xE3, 0x40, 0xAA, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, -0x6C, 0xEA, 0x7D, 0x67, 0x5E, 0xC3, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF6, -0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, -0x7D, 0x67, 0x5F, 0xC3, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF6, 0x0C, 0x4B, -0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x40, 0xAA, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, -0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x7D, 0x67, 0x52, 0xA3, -0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF7, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, -0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x41, 0xC3, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, -0x20, 0x6A, 0x22, 0xF6, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, -0x60, 0xCA, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF6, 0x0C, 0x4B, 0x64, 0x33, -0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, 0x04, 0x10, 0x7D, 0x67, 0x52, 0xA3, -0x7D, 0x67, 0x5C, 0xC3, 0x04, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x0C, 0x6A, 0x7D, 0x67, 0x51, 0xCB, -0x06, 0x10, 0x04, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x51, 0xCB, 0x05, 0x02, -0x82, 0x67, 0x00, 0x18, 0x4B, 0x10, 0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, -0x44, 0x67, 0x07, 0xD5, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0xC0, 0x4A, 0x0A, 0x5A, -0x78, 0x67, 0x2A, 0x23, 0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF7, 0x10, 0x4A, 0x49, 0xE3, -0x40, 0x9A, 0x00, 0xEA, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0xA1, 0x19, 0x1D, 0x10, 0x07, 0x92, -0x82, 0x67, 0x00, 0x18, 0xC2, 0x1B, 0x18, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0x0D, 0x1A, -0x13, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0x71, 0x1B, 0x0E, 0x10, 0x07, 0x92, 0x82, 0x67, -0x00, 0x18, 0x11, 0x1C, 0x09, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0x5E, 0x1C, 0x04, 0x10, -0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0x7E, 0x1C, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, -0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, 0x40, 0xA4, 0x20, 0x5A, 0x58, 0x67, 0x08, 0x22, -0x7D, 0x67, 0x40, 0xA3, 0xE0, 0x4A, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x01, 0x10, -0x00, 0x6A, 0x20, 0xE8, 0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, 0x40, 0xA4, 0x40, 0x5A, -0x58, 0x67, 0x0D, 0x22, 0x7D, 0x67, 0x40, 0xA3, 0x20, 0x5A, 0x58, 0x67, 0x08, 0x2A, 0x7D, 0x67, -0x40, 0xA3, 0xE0, 0x4A, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x01, 0x10, 0x00, 0x6A, -0x20, 0xE8, 0x00, 0x65, 0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, 0x40, 0xA4, 0x60, 0x5A, -0x58, 0x67, 0x0D, 0x22, 0x7D, 0x67, 0x40, 0xA3, 0x40, 0x5A, 0x58, 0x67, 0x08, 0x2A, 0x7D, 0x67, -0x40, 0xA3, 0xE0, 0x4A, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x01, 0x10, 0x00, 0x6A, -0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, -0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xC8, 0x1D, 0x62, 0x67, 0xFF, 0x6A, 0x6C, 0xEA, 0x0F, 0x6B, -0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, -0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xC8, 0x1D, 0x62, 0x67, 0xFF, 0x6A, -0x6C, 0xEA, 0xF0, 0x6B, 0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, -0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xC8, 0x1D, -0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF3, 0x48, 0x9A, 0x6C, 0xEA, 0x0C, 0x2A, 0x7D, 0x67, -0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xD1, 0x1D, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF3, -0x4C, 0x9A, 0x6C, 0xEA, 0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, -0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, -0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xC8, 0x1D, 0x62, 0x67, 0x30, 0xF0, -0x20, 0x6A, 0x01, 0xF3, 0x50, 0x9A, 0x6C, 0xEA, 0x0C, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, -0x00, 0x18, 0xD1, 0x1D, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF3, 0x54, 0x9A, 0x6C, 0xEA, -0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, -0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, -0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xC8, 0x1D, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF3, -0x58, 0x9A, 0x6C, 0xEA, 0x13, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xD1, 0x1D, -0x62, 0x67, 0x0F, 0x6A, 0x6C, 0xEA, 0x0A, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, -0xDD, 0x1D, 0x62, 0x67, 0xE0, 0xF3, 0x1F, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, -0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, -0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xD1, 0x1D, -0x62, 0x67, 0xE1, 0xF7, 0x10, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, -0x00, 0x18, 0xDD, 0x1D, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF3, 0x5C, 0x9A, 0x6C, 0xEA, -0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, -0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, -0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xC8, 0x1D, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF3, -0x40, 0x9A, 0x6C, 0xEA, 0x16, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xD1, 0x1D, -0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF3, 0x44, 0x9A, 0x6C, 0xEA, 0x0A, 0x2A, 0x7D, 0x67, -0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xDD, 0x1D, 0x62, 0x67, 0x0C, 0xF0, 0x18, 0x6A, 0x6C, 0xEA, -0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, -0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, -0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xC8, 0x1D, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF3, -0x48, 0x9A, 0x6C, 0xEA, 0x18, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xD1, 0x1D, -0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF3, 0x4C, 0x9A, 0x6C, 0xEA, 0x0C, 0x2A, 0x7D, 0x67, -0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xDD, 0x1D, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF3, -0x50, 0x9A, 0x6C, 0xEA, 0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, -0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, -0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xD1, 0x1D, 0x62, 0x67, 0x30, 0xF0, -0x20, 0x6A, 0x21, 0xF3, 0x54, 0x9A, 0x6C, 0xEA, 0x0C, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, -0x00, 0x18, 0xDD, 0x1D, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF3, 0x58, 0x9A, 0x6C, 0xEA, -0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, -0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0x66, 0xF0, 0x18, 0x4A, 0x00, 0xD2, -0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF3, 0x5C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x7F, 0x6A, -0x6C, 0xEA, 0x7D, 0x67, 0x56, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF3, 0x5C, 0x9A, 0x60, 0xA2, -0xFF, 0x6A, 0x4C, 0xEB, 0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x9D, 0x67, 0x54, 0xC4, 0x30, 0xF0, -0x20, 0x6A, 0x41, 0xF3, 0x40, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x80, 0x6A, 0x4B, 0xEA, -0x6C, 0xEA, 0x7D, 0x67, 0x57, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x40, 0x9A, 0x60, 0xA2, -0xFF, 0x6A, 0x4C, 0xEB, 0x7F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x55, 0xC4, 0x7D, 0x67, 0x54, 0xA3, -0xE0, 0xF5, 0x07, 0x22, 0x80, 0xF4, 0x0C, 0x6A, 0x9D, 0x67, 0x49, 0xCC, 0x80, 0xF4, 0x10, 0x6A, -0x7D, 0x67, 0x48, 0xCB, 0x80, 0xF4, 0x14, 0x6A, 0x9D, 0x67, 0x47, 0xCC, 0x80, 0xF4, 0x18, 0x6A, -0x7D, 0x67, 0x46, 0xCB, 0x9D, 0x67, 0x57, 0xA4, 0x10, 0x22, 0x80, 0xF4, 0x1C, 0x6A, 0x7D, 0x67, -0x49, 0xCB, 0xA0, 0xF4, 0x00, 0x6A, 0x9D, 0x67, 0x48, 0xCC, 0xA0, 0xF4, 0x04, 0x6A, 0x7D, 0x67, -0x47, 0xCB, 0xA0, 0xF4, 0x08, 0x6A, 0x9D, 0x67, 0x46, 0xCC, 0x7D, 0x67, 0x56, 0xA3, 0x4C, 0x32, -0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x02, 0xD2, -0x30, 0xF0, 0x20, 0x6A, 0xE6, 0xF2, 0x00, 0x4A, 0x01, 0xD2, 0x9D, 0x67, 0x55, 0xA4, 0x01, 0x6B, -0x4E, 0xEB, 0xA0, 0xF3, 0x0E, 0x23, 0x02, 0x52, 0x78, 0x67, 0x03, 0x23, 0x0C, 0x22, 0xA0, 0xF5, -0x09, 0x10, 0x02, 0x6B, 0x4E, 0xEB, 0xC0, 0xF1, 0x01, 0x23, 0x03, 0x6B, 0x6E, 0xEA, 0x80, 0xF4, -0x03, 0x22, 0x80, 0xF5, 0x1F, 0x10, 0x9D, 0x67, 0x69, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, -0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x69, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, -0x6C, 0xEA, 0x0B, 0x2A, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x44, 0x9A, -0x49, 0xE3, 0x02, 0x93, 0x7A, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, -0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x7A, 0xA3, 0x60, 0xC2, 0x7D, 0x67, -0x49, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, -0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0F, 0x2A, -0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x02, 0x93, -0x8E, 0xA3, 0x03, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x0E, 0x10, 0x5D, 0x67, -0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x50, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x8E, 0xA3, -0x03, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x62, 0x42, -0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, -0x49, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0E, 0x2A, 0x9D, 0x67, 0x69, 0xAC, -0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x54, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6E, 0xA3, 0x7E, 0x34, -0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x0D, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, -0x41, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6E, 0xA3, 0x7E, 0x34, 0xFF, 0x6B, 0x8C, 0xEB, -0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, -0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, -0x6C, 0xEA, 0x11, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x5C, 0x9A, -0x49, 0xE3, 0x02, 0x93, 0x6E, 0xA3, 0x72, 0x33, 0x83, 0x67, 0x03, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, -0x8C, 0xEB, 0x60, 0xC2, 0x10, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, -0x40, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6E, 0xA3, 0x72, 0x33, 0x83, 0x67, 0x03, 0x6B, 0x6C, 0xEC, -0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, -0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, -0x6C, 0xEA, 0x0B, 0x2A, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x44, 0x9A, -0x49, 0xE3, 0x02, 0x93, 0x60, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, -0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x60, 0xA3, 0x60, 0xC2, 0x7D, 0x67, -0x48, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, -0x07, 0x22, 0x7D, 0x67, 0x48, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, -0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x02, 0x93, -0x61, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, -0x50, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x61, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x48, 0xAB, 0x62, 0x42, -0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, -0x48, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x11, 0x2A, 0x9D, 0x67, 0x68, 0xAC, -0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x54, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6F, 0xA3, 0x6A, 0x33, -0x83, 0x67, 0x01, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x10, 0x10, 0x5D, 0x67, -0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6F, 0xA3, -0x6A, 0x33, 0x83, 0x67, 0x01, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x7D, 0x67, -0x48, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, -0x07, 0x22, 0x7D, 0x67, 0x48, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, -0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x02, 0x93, -0x64, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, -0x40, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x64, 0xA3, 0x60, 0xC2, 0x9D, 0x67, 0x67, 0xAC, 0x1F, 0xF7, -0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x67, 0xAC, -0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x13, 0x2A, 0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, 0x20, 0x6A, -0x41, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x6C, 0x33, 0x83, 0x67, 0x30, 0xF0, -0x20, 0x6B, 0x61, 0xF3, 0x64, 0x9B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x12, 0x10, 0x5D, 0x67, -0x67, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, -0x6C, 0x33, 0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF3, 0x64, 0x9B, 0x6D, 0xE4, 0x60, 0x9B, -0x60, 0xDA, 0x5D, 0x67, 0x66, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, -0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x66, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x13, 0x2A, -0x5D, 0x67, 0x66, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x9D, 0x67, -0x76, 0xA4, 0x6C, 0x33, 0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF3, 0x68, 0x9B, 0x6D, 0xE4, -0x60, 0x9B, 0x60, 0xDA, 0xF7, 0x13, 0x5D, 0x67, 0x66, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, -0x48, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x6C, 0x33, 0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, -0x61, 0xF3, 0x68, 0x9B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0xE4, 0x13, 0x5D, 0x67, 0x69, 0xAA, -0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, -0x69, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x11, 0x2A, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, -0x20, 0x6A, 0x41, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6E, 0xA3, 0x6A, 0x33, 0x83, 0x67, -0x03, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x10, 0x10, 0x9D, 0x67, 0x69, 0xAC, -0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6E, 0xA3, 0x6A, 0x33, -0x83, 0x67, 0x03, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, -0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, -0x7D, 0x67, 0x49, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, -0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x63, 0xA3, -0x60, 0xC2, 0x0A, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x50, 0x9A, -0x49, 0xE3, 0x02, 0x93, 0x63, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x62, 0x42, 0x1F, 0xF7, -0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, -0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, -0x20, 0x6A, 0x41, 0xF3, 0x54, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x65, 0xA3, 0x60, 0xC2, 0x0A, 0x10, -0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x02, 0x93, -0x65, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, -0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x63, 0x42, 0x1F, 0xF7, -0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, -0x5C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x66, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x5D, 0x67, 0x69, 0xAA, -0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x66, 0xA3, 0x60, 0xC2, -0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, -0x06, 0x22, 0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x5D, 0x67, -0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x76, 0xA3, -0x60, 0xC2, 0x0A, 0x10, 0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, -0x49, 0xE3, 0x02, 0x93, 0x76, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x48, 0xAB, 0x61, 0x42, 0x1F, 0xF7, -0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x48, 0xAB, -0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, -0x20, 0x6A, 0x41, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, 0x60, 0xA3, 0x60, 0xC2, -0x0B, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x50, 0x9A, 0x49, 0xE3, -0x02, 0x93, 0x20, 0xF0, 0x60, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x48, 0xAB, 0x62, 0x42, 0x1F, 0xF7, -0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x48, 0xAB, -0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, -0x20, 0x6A, 0x41, 0xF3, 0x54, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, 0x61, 0xA3, 0x60, 0xC2, -0x0B, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x58, 0x9A, 0x49, 0xE3, -0x02, 0x93, 0x20, 0xF0, 0x61, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x48, 0xAB, 0x63, 0x42, 0x1F, 0xF7, -0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x48, 0xAB, -0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, -0x20, 0x6A, 0x41, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, 0x62, 0xA3, 0x60, 0xC2, -0x0B, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x40, 0x9A, 0x49, 0xE3, -0x02, 0x93, 0x20, 0xF0, 0x62, 0xA3, 0x60, 0xC2, 0x9D, 0x67, 0x67, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, -0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x67, 0xAC, 0x1F, 0xF7, -0x00, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, -0x44, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, 0x63, 0xA3, 0x60, 0xC2, 0x0B, 0x10, 0x9D, 0x67, -0x67, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, -0x63, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x47, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, -0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x47, 0xAB, 0x61, 0x42, 0x1F, 0xF7, -0x00, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x9D, 0x67, 0x67, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, -0x4C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, 0x64, 0xA3, 0x60, 0xC2, 0x0B, 0x10, 0x5D, 0x67, -0x67, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x50, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, -0x64, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x47, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, -0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x47, 0xAB, 0x62, 0x42, 0x1F, 0xF7, -0x00, 0x6A, 0x6C, 0xEA, 0x0D, 0x2A, 0x9D, 0x67, 0x67, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, -0x54, 0x9A, 0x49, 0xE3, 0x30, 0xF0, 0x20, 0x6B, 0x40, 0xF0, 0x68, 0xA3, 0x60, 0xC2, 0x0C, 0x10, -0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x30, 0xF0, -0x20, 0x6B, 0x40, 0xF0, 0x68, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x47, 0xAB, 0x63, 0x42, 0x1F, 0xF7, -0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x47, 0xAB, -0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0E, 0x2A, 0x9D, 0x67, 0x67, 0xAC, 0x30, 0xF0, -0x20, 0x6A, 0x41, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x30, 0xF0, 0x20, 0x6B, 0x40, 0xF0, 0x08, 0x4B, -0x61, 0xA3, 0x60, 0xC2, 0x0F, 0x12, 0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, -0x40, 0x9A, 0x49, 0xE3, 0x30, 0xF0, 0x20, 0x6B, 0x40, 0xF0, 0x08, 0x4B, 0x61, 0xA3, 0x60, 0xC2, -0x01, 0x12, 0x9D, 0x67, 0x69, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, -0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x69, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x15, 0x2A, -0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x9D, 0x67, -0x76, 0xA4, 0x74, 0x33, 0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF3, 0x6C, 0x9B, 0x6D, 0xE4, -0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x14, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, -0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x74, 0x33, 0x83, 0x67, -0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF3, 0x6C, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, -0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, -0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, -0x6C, 0xEA, 0x15, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x4C, 0x9A, -0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x74, 0x33, 0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF3, -0x70, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x14, 0x10, 0x5D, 0x67, -0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x50, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, -0x74, 0x33, 0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF3, 0x70, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, -0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, -0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x62, 0x42, -0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, -0x41, 0xF3, 0x54, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x73, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x5D, 0x67, -0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x73, 0xA3, -0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, -0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, -0x6C, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x5C, 0x9A, -0x49, 0xE3, 0x02, 0x93, 0x6A, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, -0x20, 0x6A, 0x61, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6A, 0xA3, 0x60, 0xC2, 0x9D, 0x67, -0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, -0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x5D, 0x67, 0x68, 0xAA, -0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6C, 0xAB, 0x60, 0xDA, -0x29, 0x11, 0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, 0x49, 0xE3, -0x02, 0x93, 0x6C, 0xAB, 0x60, 0xDA, 0x1E, 0x11, 0x5D, 0x67, 0x69, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, -0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x69, 0xAC, 0x1F, 0xF7, -0x00, 0x6A, 0x6C, 0xEA, 0x0F, 0x2A, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, -0x44, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, 0x68, 0x33, 0x6D, 0xE4, 0x60, 0x9B, -0x60, 0xDA, 0x0E, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, -0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, 0x68, 0x33, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, -0x5D, 0x67, 0x68, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, -0x06, 0x22, 0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x13, 0x2A, 0x5D, 0x67, -0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0x9D, 0x67, -0x56, 0xA4, 0x01, 0x94, 0x48, 0x32, 0x48, 0x35, 0xA9, 0xE2, 0x49, 0xE4, 0x80, 0xF2, 0x40, 0x9A, -0x40, 0xDB, 0x12, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, -0x49, 0xE3, 0x62, 0x67, 0x9D, 0x67, 0x56, 0xA4, 0x01, 0x94, 0x48, 0x32, 0x48, 0x35, 0xA9, 0xE2, -0x49, 0xE4, 0x80, 0xF2, 0x40, 0x9A, 0x40, 0xDB, 0x5D, 0x67, 0x67, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, -0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x67, 0xAC, 0x1F, 0xF7, -0x00, 0x6A, 0x6C, 0xEA, 0x13, 0x2A, 0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, -0x44, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0x9D, 0x67, 0x56, 0xA4, 0x01, 0x94, 0x48, 0x32, 0x48, 0x35, -0xA9, 0xE2, 0x49, 0xE4, 0x80, 0xF2, 0x44, 0x9A, 0x40, 0xDB, 0x12, 0x10, 0x5D, 0x67, 0x67, 0xAA, -0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0x9D, 0x67, 0x56, 0xA4, -0x01, 0x94, 0x48, 0x32, 0x48, 0x35, 0xA9, 0xE2, 0x49, 0xE4, 0x80, 0xF2, 0x44, 0x9A, 0x40, 0xDB, -0x5D, 0x67, 0x66, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, -0x06, 0x22, 0x9D, 0x67, 0x66, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0F, 0x2A, 0x5D, 0x67, -0x66, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, -0x01, 0x94, 0x6D, 0xE4, 0x00, 0xF2, 0x60, 0xA3, 0x60, 0xC2, 0x0E, 0x10, 0x5D, 0x67, 0x66, 0xAA, -0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, -0x6D, 0xE4, 0x00, 0xF2, 0x60, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x46, 0xAB, 0x61, 0x42, 0x1F, 0xF7, -0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x46, 0xAB, -0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0F, 0x2A, 0x9D, 0x67, 0x66, 0xAC, 0x30, 0xF0, -0x20, 0x6A, 0x41, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, 0x6D, 0xE4, -0x01, 0xF5, 0x60, 0xA3, 0x60, 0xC2, 0x0E, 0x10, 0x5D, 0x67, 0x66, 0xAA, 0x30, 0xF0, 0x20, 0x6A, -0x41, 0xF3, 0x50, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, 0x6D, 0xE4, 0x01, 0xF5, -0x60, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x46, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, -0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x46, 0xAB, 0x62, 0x42, 0x1F, 0xF7, -0x00, 0x6A, 0x6C, 0xEA, 0x0F, 0x2A, 0x9D, 0x67, 0x66, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, -0x54, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, 0x6D, 0xE4, 0x81, 0xF4, 0x60, 0xA3, -0x60, 0xC2, 0x10, 0x10, 0x5D, 0x67, 0x66, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF3, 0x58, 0x9A, -0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, 0x6D, 0xE4, 0x81, 0xF4, 0x60, 0xA3, 0x60, 0xC2, -0x01, 0x10, 0x00, 0x65, 0x03, 0x63, 0x20, 0xE8, 0xFA, 0x63, 0x0B, 0x62, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x4A, 0xA2, 0x7D, 0x67, 0x54, 0xC3, 0x7D, 0x67, 0x54, 0xA3, -0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, -0x04, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x49, 0xA2, 0x02, 0x6B, -0x4E, 0xEB, 0x6B, 0x23, 0x03, 0x52, 0x78, 0x67, 0x04, 0x23, 0x01, 0x6B, 0x6E, 0xEA, 0x0A, 0x22, -0x77, 0x11, 0x03, 0x6B, 0x4E, 0xEB, 0xE0, 0xF0, 0x12, 0x23, 0x04, 0x6B, 0x6E, 0xEA, 0x40, 0xF1, -0x13, 0x22, 0x6E, 0x11, 0x0C, 0x6A, 0x7D, 0x67, 0x53, 0xCB, 0x0E, 0x6A, 0x7D, 0x67, 0x58, 0xC3, -0x0C, 0x6A, 0x7D, 0x67, 0x5A, 0xC3, 0x04, 0x92, 0x5A, 0xA2, 0x7D, 0x67, 0x5B, 0xC3, 0x04, 0x92, -0x43, 0xA2, 0x7D, 0x67, 0x5C, 0xC3, 0x04, 0x92, 0x4E, 0xA2, 0x4A, 0x32, 0x62, 0x67, 0x03, 0x6A, -0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5D, 0xC3, 0x04, 0x92, 0x6E, 0xA2, 0x03, 0x6A, -0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5E, 0xC3, 0x04, 0x92, 0x45, 0xA2, 0x7D, 0x67, -0x5F, 0xC3, 0x04, 0x92, 0x46, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x04, 0x92, 0x4E, 0xA2, -0x5E, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x41, 0xC3, 0x04, 0x92, 0x4E, 0xA2, -0x52, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, -0x42, 0xC3, 0x04, 0x92, 0x4F, 0xA2, 0x4A, 0x32, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, -0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x43, 0xC3, 0x04, 0x92, 0x53, 0xA2, 0x7D, 0x67, 0x20, 0xF0, -0x44, 0xC3, 0x04, 0x92, 0x4A, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0x45, 0xC3, 0x06, 0x94, 0x07, 0x95, -0x08, 0x96, 0x09, 0x97, 0x00, 0x18, 0x8D, 0x18, 0x13, 0x11, 0x0C, 0x6A, 0x7D, 0x67, 0x53, 0xCB, -0x0E, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x0D, 0x6A, 0x7D, 0x67, 0x5A, 0xC3, 0x04, 0x92, 0x44, 0xA2, -0x7D, 0x67, 0x5B, 0xC3, 0x04, 0x92, 0x40, 0xA2, 0x7D, 0x67, 0x5C, 0xC3, 0x04, 0x92, 0x41, 0xA2, -0x7D, 0x67, 0x5D, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, -0x61, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5E, 0xC3, -0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x54, 0x9A, -0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5F, 0xC3, 0x7D, 0x67, 0x54, 0xA3, -0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, -0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, -0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, -0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x41, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, -0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, -0x7D, 0x67, 0x20, 0xF0, 0x42, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, -0x20, 0x6A, 0x81, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, -0x20, 0xF0, 0x43, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, -0x81, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, -0x44, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, -0x48, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x45, 0xC3, -0x06, 0x94, 0x07, 0x95, 0x08, 0x96, 0x09, 0x97, 0x00, 0x18, 0x8D, 0x18, 0x81, 0x10, 0x0C, 0x6A, -0x7D, 0x67, 0x53, 0xCB, 0x0E, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x0E, 0x6A, 0x7D, 0x67, 0x5A, 0xC3, -0x04, 0x92, 0x56, 0xA2, 0x7D, 0x67, 0x5B, 0xC3, 0x04, 0x92, 0x20, 0xF0, 0x40, 0xA2, 0x7D, 0x67, -0x5C, 0xC3, 0x04, 0x92, 0x20, 0xF0, 0x41, 0xA2, 0x7D, 0x67, 0x5D, 0xC3, 0x04, 0x92, 0x20, 0xF0, -0x42, 0xA2, 0x7D, 0x67, 0x5E, 0xC3, 0x04, 0x92, 0x20, 0xF0, 0x43, 0xA2, 0x7D, 0x67, 0x5F, 0xC3, -0x04, 0x92, 0x20, 0xF0, 0x44, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x7D, 0x67, 0x54, 0xA3, -0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, -0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x41, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x54, 0x32, -0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x50, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, -0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xC3, 0x04, 0x92, 0x6C, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, -0x0F, 0x6B, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x43, 0xC3, 0x04, 0x92, 0x4C, 0xAA, 0x62, 0x67, -0xF0, 0x6A, 0x6C, 0xEA, 0x53, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, -0x04, 0x92, 0x4A, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0x45, 0xC3, 0x06, 0x94, 0x07, 0x95, 0x08, 0x96, -0x09, 0x97, 0x00, 0x18, 0x8D, 0x18, 0x1C, 0x10, 0x03, 0x6A, 0x7D, 0x67, 0x53, 0xCB, 0x0E, 0x6A, -0x7D, 0x67, 0x58, 0xC3, 0x0F, 0x6A, 0x7D, 0x67, 0x5A, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF0, -0x48, 0xA2, 0x7D, 0x67, 0x5B, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF0, 0x08, 0x4A, 0x41, 0xA2, -0x7D, 0x67, 0x5C, 0xC3, 0x06, 0x94, 0x07, 0x95, 0x08, 0x96, 0x09, 0x97, 0x00, 0x18, 0x8D, 0x18, -0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, -0x68, 0xC4, 0x7D, 0x67, 0x4C, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x25, 0x22, 0x7D, 0x67, 0x4C, 0xA3, -0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x50, 0x9A, 0x49, 0xE3, 0x40, 0xA2, -0x9D, 0x67, 0x40, 0xC4, 0x5D, 0x67, 0x60, 0xA2, 0x08, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, -0x40, 0xC3, 0x9D, 0x67, 0x60, 0xA4, 0x01, 0x6A, 0x6D, 0xEA, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, -0x4C, 0xA4, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x50, 0x9A, 0x49, 0xE3, -0x9D, 0x67, 0x60, 0xA4, 0x60, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x64, 0x67, -0x45, 0x67, 0x9D, 0x67, 0x68, 0xC4, 0x7D, 0x67, 0x4C, 0xC3, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, -0xF9, 0x63, 0x0D, 0x62, 0x1C, 0x65, 0x85, 0x67, 0x66, 0x67, 0x47, 0x67, 0xD8, 0x67, 0xBD, 0x67, -0x20, 0xF0, 0xD8, 0xC5, 0xBD, 0x67, 0x20, 0xF0, 0x9C, 0xC5, 0xDD, 0x67, 0x40, 0xF0, 0x60, 0xC6, -0x7D, 0x67, 0x40, 0xF0, 0x44, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x58, 0xA4, 0x4C, 0x32, 0x48, 0x33, -0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x07, 0xD2, 0x30, 0xF0, -0x20, 0x6A, 0x66, 0xF0, 0x18, 0x4A, 0x06, 0xD2, 0x00, 0x6A, 0xBD, 0x67, 0x20, 0xF0, 0x43, 0xC5, -0xDD, 0x67, 0x20, 0xF0, 0x58, 0xA6, 0x4E, 0x32, 0x7D, 0x67, 0x20, 0xF0, 0x49, 0xC3, 0x9D, 0x67, -0x20, 0xF0, 0x78, 0xA4, 0x07, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x20, 0xF0, 0x47, 0xC5, 0x00, 0x6A, -0xDD, 0x67, 0x20, 0xF0, 0x46, 0xC6, 0x00, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x45, 0xC3, 0x07, 0x92, -0x60, 0xA2, 0x7F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x20, 0xF0, 0x42, 0xC4, 0x07, 0x92, 0x41, 0xA2, -0xBD, 0x67, 0x20, 0xF0, 0x41, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x7C, 0xA6, 0x7F, 0x6A, 0x6C, 0xEA, -0x7D, 0x67, 0x20, 0xF0, 0x48, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x7C, 0xA4, 0x80, 0x6A, 0x4B, 0xEA, -0x6C, 0xEA, 0xBD, 0x67, 0x20, 0xF0, 0x44, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x58, 0xA6, 0x54, 0x32, -0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x50, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, -0x4C, 0xEB, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x9D, 0x67, 0x20, 0xF0, -0x48, 0xA4, 0x46, 0x6D, 0xAE, 0xEA, 0x27, 0x2A, 0xDD, 0x67, 0x40, 0xF0, 0x44, 0xA6, 0x02, 0x6B, -0x6E, 0xEA, 0x21, 0x2A, 0x07, 0x92, 0x4C, 0xA2, 0xF0, 0x6B, 0x6C, 0xEA, 0x10, 0x6C, 0x8E, 0xEA, -0x05, 0x2A, 0x47, 0x6A, 0xBD, 0x67, 0x20, 0xF0, 0x48, 0xC5, 0x0B, 0x10, 0x07, 0x92, 0x4C, 0xA2, -0xF0, 0x6B, 0x6C, 0xEA, 0x20, 0x6E, 0xCE, 0xEA, 0x04, 0x2A, 0x45, 0x6A, 0x7D, 0x67, 0x20, 0xF0, -0x48, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xA4, 0xBD, 0x67, 0x20, 0xF0, 0x44, 0xA5, 0x6D, 0xEA, -0xDD, 0x67, 0x20, 0xF0, 0x5C, 0xC6, 0x5D, 0x67, 0x20, 0xF0, 0x68, 0xA2, 0x30, 0xF0, 0x20, 0x6A, -0x64, 0x33, 0x80, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x40, 0xAA, 0x62, 0x67, 0xBD, 0x67, 0x20, 0xF0, -0x88, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x84, 0x34, 0x40, 0xF4, 0x04, 0x4A, 0x49, 0xE4, 0x40, 0xAA, -0x49, 0xE3, 0x47, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x07, 0x92, 0x6C, 0xCA, 0xDD, 0x67, -0x20, 0xF0, 0x5C, 0xA6, 0xFF, 0x6B, 0x6E, 0xEA, 0xE0, 0xF1, 0x12, 0x22, 0x9D, 0x67, 0x20, 0xF0, -0x68, 0xA4, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, 0x63, 0xEA, 0x58, 0x67, 0x16, 0x22, 0x5D, 0x67, -0x20, 0xF0, 0x7C, 0x82, 0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, -0x63, 0x33, 0x9D, 0x67, 0x20, 0xF0, 0x42, 0x84, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, -0x43, 0x32, 0xBD, 0x67, 0x20, 0xF0, 0x5C, 0xC5, 0x0F, 0x10, 0xDD, 0x67, 0x20, 0xF0, 0x68, 0xA6, -0x9D, 0x67, 0x20, 0xF0, 0x41, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0x06, 0x22, 0x7D, 0x67, 0x20, 0xF0, -0x41, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x5C, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x78, 0xA5, 0xDD, 0x67, -0x20, 0xF0, 0x48, 0xA6, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x87, 0x22, 0x7D, 0x67, 0x40, 0xF0, -0x40, 0xA3, 0x1A, 0x2A, 0x07, 0x92, 0x8F, 0xA2, 0x41, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, -0x07, 0x92, 0x9D, 0x67, 0x20, 0xF0, 0x7C, 0xA4, 0x63, 0xC2, 0xBD, 0x67, 0x20, 0xF0, 0x78, 0xA5, -0xDD, 0x67, 0x20, 0xF0, 0x5C, 0xA6, 0x00, 0x6C, 0x04, 0xD4, 0x00, 0x6C, 0x00, 0x6D, 0xC3, 0x67, -0xE2, 0x67, 0x00, 0x18, 0x8D, 0x26, 0x56, 0x10, 0x5D, 0x67, 0x20, 0xF0, 0x65, 0xA2, 0x01, 0x6A, -0x6D, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x45, 0xC3, 0x07, 0x92, 0x4F, 0xA2, 0x5A, 0x32, 0x62, 0x67, -0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x6D, 0xEA, 0x00, 0xF6, -0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, -0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x07, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0x78, 0x33, 0xAF, 0xA2, -0x41, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0x07, 0x92, 0x9D, 0x67, 0x20, 0xF0, -0x7C, 0xA4, 0x63, 0xC2, 0xBD, 0x67, 0x20, 0xF0, 0x66, 0xA5, 0x40, 0x6A, 0x6D, 0xEA, 0xDD, 0x67, -0x20, 0xF0, 0x46, 0xC6, 0x5D, 0x67, 0x20, 0xF0, 0x68, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF1, -0x04, 0x4A, 0x49, 0xE3, 0x60, 0xA2, 0x07, 0x92, 0x73, 0xC2, 0x07, 0x92, 0x7A, 0xA2, 0xBD, 0x67, -0x20, 0xF0, 0x88, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF3, 0x08, 0x4A, 0x49, 0xE4, 0x40, 0xA2, -0x43, 0xEB, 0x58, 0x67, 0x07, 0x22, 0x07, 0x92, 0x53, 0xA2, 0x64, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, -0x07, 0x92, 0x73, 0xC2, 0x7D, 0x67, 0x40, 0xF0, 0x44, 0xA3, 0x4C, 0x33, 0xFF, 0x6A, 0x4C, 0xEB, -0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x4D, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, -0x00, 0xF6, 0x63, 0x33, 0xBD, 0x67, 0x20, 0xF0, 0x46, 0x85, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, -0x00, 0xF6, 0x43, 0x32, 0xDD, 0x67, 0x20, 0xF0, 0x46, 0xC6, 0x7D, 0x67, 0x20, 0xF0, 0x58, 0xA3, -0x03, 0x5A, 0x58, 0x67, 0x10, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, 0x4C, 0x9A, 0x9D, 0x67, -0x20, 0xF0, 0x7C, 0xA4, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, 0x50, 0x9A, 0xBD, 0x67, -0x20, 0xF0, 0x66, 0xA5, 0x60, 0xC2, 0xDD, 0x67, 0x20, 0xF0, 0x58, 0xA6, 0x01, 0x6B, 0x6E, 0xEA, -0xE0, 0xF0, 0x02, 0x2A, 0x9D, 0x67, 0x40, 0xF0, 0x40, 0xA4, 0xC0, 0xF0, 0x1D, 0x2A, 0xBD, 0x67, -0x20, 0xF0, 0x5C, 0xA5, 0x04, 0x5A, 0x58, 0x67, 0x19, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, -0x0C, 0x5A, 0x58, 0x67, 0x13, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0x6C, 0x42, 0x30, 0xF0, -0x20, 0x6A, 0x40, 0xF0, 0x0C, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0xC0, 0xF7, -0x18, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0xBE, 0x10, 0x9D, 0x67, 0x20, 0xF0, -0x5C, 0xA4, 0x04, 0x5A, 0x58, 0x67, 0x12, 0x22, 0x5D, 0x67, 0x20, 0xF0, 0x7C, 0xA2, 0x30, 0xF0, -0x20, 0x6A, 0x40, 0xF0, 0x14, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0xE0, 0xF7, -0x04, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0xA6, 0x10, 0x07, 0x92, 0x4E, 0xA2, -0x30, 0x6B, 0x6C, 0xEA, 0x10, 0x6B, 0x6E, 0xEA, 0x4C, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x5C, 0xA4, -0x2C, 0x5A, 0x58, 0x67, 0x13, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0x36, 0x5A, 0x58, 0x67, -0x0D, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xD4, 0x4A, 0x30, 0xF0, 0x20, 0x6B, 0xE0, 0xF7, -0x10, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x86, 0x10, 0x9D, 0x67, 0x20, 0xF0, -0x5C, 0xA4, 0x36, 0x5A, 0x58, 0x67, 0x14, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0x40, 0x5A, -0x58, 0x67, 0x0E, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xCA, 0x4A, 0x30, 0xF0, 0x20, 0x6B, -0xE0, 0xF7, 0x1C, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x00, 0x65, 0x6C, 0x10, -0x9D, 0x67, 0x20, 0xF0, 0x5C, 0xA4, 0x40, 0x5A, 0x58, 0x67, 0x63, 0x2A, 0x7D, 0x67, 0x20, 0xF0, -0x5C, 0xA3, 0x4A, 0x5A, 0x58, 0x67, 0x5F, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xC0, 0x4A, -0x30, 0xF0, 0x20, 0x6B, 0x01, 0xF0, 0x08, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, -0x53, 0x10, 0x07, 0x92, 0x4E, 0xA2, 0x30, 0x6B, 0x6C, 0xEA, 0x4E, 0x2A, 0x9D, 0x67, 0x20, 0xF0, -0x5C, 0xA4, 0x0C, 0x5A, 0x58, 0x67, 0x13, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0x16, 0x5A, -0x58, 0x67, 0x0D, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xD4, 0x4A, 0x30, 0xF0, 0x20, 0x6B, -0x01, 0xF0, 0x14, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x35, 0x10, 0x9D, 0x67, -0x20, 0xF0, 0x5C, 0xA4, 0x16, 0x5A, 0x58, 0x67, 0x13, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, -0x20, 0x5A, 0x58, 0x67, 0x0D, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xEA, 0x4A, 0x30, 0xF0, -0x20, 0x6B, 0x21, 0xF0, 0x00, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x1C, 0x10, -0x9D, 0x67, 0x20, 0xF0, 0x5C, 0xA4, 0x20, 0x5A, 0x58, 0x67, 0x16, 0x2A, 0x7D, 0x67, 0x20, 0xF0, -0x5C, 0xA3, 0x24, 0x5A, 0x58, 0x67, 0x10, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xE0, 0x4A, -0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF0, 0x0C, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, -0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, 0x9D, 0x67, 0x20, 0xF0, 0x58, 0xA4, 0x54, 0x32, -0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0xBD, 0x67, 0x20, 0xF0, -0x7C, 0xA5, 0x60, 0xC2, 0xDD, 0x67, 0x20, 0xF0, 0x58, 0xA6, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, -0x20, 0x6A, 0x61, 0xF3, 0x50, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x20, 0xF0, 0x66, 0xA4, 0x60, 0xC2, -0xBD, 0x67, 0x20, 0xF0, 0x58, 0xA5, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF3, -0x54, 0x9A, 0x49, 0xE3, 0xDD, 0x67, 0x20, 0xF0, 0x65, 0xA6, 0x60, 0xC2, 0x00, 0x65, 0x01, 0x10, -0x00, 0x65, 0x0D, 0x97, 0x07, 0x63, 0x00, 0xEF, 0xFE, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, -0x68, 0xCC, 0x7D, 0x67, 0x4A, 0xCB, 0x01, 0x6A, 0x9D, 0x67, 0x46, 0xCC, 0x00, 0x6A, 0x7D, 0x67, -0x40, 0xCB, 0x9D, 0x67, 0x68, 0xAC, 0x9D, 0x67, 0x4A, 0xAC, 0x6E, 0xEA, 0x04, 0x2A, 0x64, 0x6A, -0x7D, 0x67, 0x46, 0xCB, 0x87, 0x10, 0x9D, 0x67, 0x48, 0xAC, 0x07, 0x22, 0x5D, 0x67, 0x68, 0xAA, -0x9D, 0x67, 0x4A, 0xAC, 0x63, 0xEA, 0x58, 0x67, 0x04, 0x22, 0x00, 0x6A, 0x7D, 0x67, 0x46, 0xCB, -0x79, 0x10, 0x9D, 0x67, 0x4A, 0xAC, 0x02, 0xF0, 0x00, 0x5A, 0x58, 0x67, 0x04, 0x22, 0x04, 0x6A, -0x7D, 0x67, 0x40, 0xCB, 0x1C, 0x10, 0x9D, 0x67, 0x4A, 0xAC, 0x04, 0xF0, 0x00, 0x5A, 0x58, 0x67, -0x04, 0x22, 0x03, 0x6A, 0x7D, 0x67, 0x40, 0xCB, 0x12, 0x10, 0x9D, 0x67, 0x4A, 0xAC, 0x08, 0xF0, -0x00, 0x5A, 0x58, 0x67, 0x04, 0x22, 0x02, 0x6A, 0x7D, 0x67, 0x40, 0xCB, 0x08, 0x10, 0x9D, 0x67, -0x4A, 0x8C, 0x00, 0x52, 0x58, 0x67, 0x03, 0x2A, 0x01, 0x6A, 0x7D, 0x67, 0x40, 0xCB, 0x9D, 0x67, -0x6A, 0xAC, 0x9D, 0x67, 0x40, 0xAC, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x02, 0xD2, 0x5D, 0x67, -0x68, 0xAA, 0x9D, 0x67, 0x40, 0xAC, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x01, 0xD2, 0x00, 0x6A, -0x7D, 0x67, 0x4E, 0xC3, 0x33, 0x10, 0x02, 0x92, 0x46, 0x32, 0x02, 0xD2, 0x01, 0x93, 0x02, 0x92, -0x63, 0xEA, 0x58, 0x67, 0x26, 0x22, 0x7D, 0x67, 0x4E, 0xA3, 0x81, 0xF4, 0x00, 0x6B, 0x67, 0xEA, -0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x9D, 0x67, 0x46, 0xAC, 0x49, 0xE3, 0x7D, 0x67, 0x46, 0xCB, -0x01, 0x93, 0x02, 0x92, 0x4B, 0xE3, 0x01, 0xD2, 0x02, 0x92, 0x01, 0x6C, 0x8E, 0xEA, 0x07, 0x2A, -0x01, 0x92, 0x02, 0x5A, 0x58, 0x67, 0x03, 0x2A, 0x02, 0x6A, 0x02, 0xD2, 0x0A, 0x10, 0x02, 0x92, -0x01, 0x6B, 0x6E, 0xEA, 0x04, 0x2A, 0x01, 0x92, 0x01, 0x6C, 0x8E, 0xEA, 0x0E, 0x22, 0x01, 0x92, -0x0B, 0x22, 0x7D, 0x67, 0x4E, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x4E, 0xC4, 0x7D, 0x67, 0x4E, 0xA3, -0x0C, 0x5A, 0x58, 0x67, 0xC8, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x7D, 0x67, 0x46, 0xAB, 0x5A, 0x32, -0x9D, 0x67, 0x46, 0xCC, 0x5D, 0x67, 0x66, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x02, 0x63, 0x20, 0xE8, -0xFC, 0x63, 0x07, 0x62, 0x64, 0x67, 0x09, 0xD5, 0x0A, 0xD6, 0x47, 0x67, 0x9D, 0x67, 0x20, 0xF0, -0x60, 0xC4, 0xBD, 0x67, 0x56, 0xCD, 0x0A, 0x92, 0x05, 0xD2, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, -0x01, 0x6A, 0x9D, 0x67, 0x52, 0xC4, 0x1D, 0x10, 0xBD, 0x67, 0x52, 0xA5, 0x7D, 0x67, 0x51, 0xC3, -0x0E, 0x10, 0x9D, 0x67, 0x51, 0xA4, 0x48, 0x32, 0x09, 0x93, 0x49, 0xE3, 0x40, 0x9A, 0x05, 0x93, -0x49, 0xE3, 0x05, 0xD2, 0xBD, 0x67, 0x51, 0xA5, 0x01, 0x4A, 0x7D, 0x67, 0x51, 0xC3, 0x9D, 0x67, -0x51, 0xA4, 0x05, 0x5A, 0x58, 0x67, 0xED, 0x2A, 0x7D, 0x67, 0x52, 0xA3, 0x01, 0x4A, 0x9D, 0x67, -0x52, 0xC4, 0xBD, 0x67, 0x52, 0xA5, 0x05, 0x5A, 0x58, 0x67, 0xDE, 0x2A, 0x05, 0x92, 0x04, 0x2A, -0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x23, 0x10, 0x05, 0x93, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, -0x0A, 0x94, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x4F, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, -0x9D, 0x67, 0x56, 0xAC, 0x4F, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x05, 0x94, -0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEC, 0xBD, 0x67, 0x56, 0xAD, 0x53, 0xE4, 0xFF, 0xF7, 0x1F, 0x6A, -0x8C, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xE6, 0x23, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, -0x50, 0xA4, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x44, 0x67, 0x03, 0xD5, 0x7D, 0x67, -0x48, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x20, 0x5A, 0x58, 0x67, 0x09, 0x22, 0x7D, 0x67, 0x48, 0xA3, -0xE0, 0x4A, 0x9D, 0x67, 0x48, 0xC4, 0x00, 0x6A, 0xBD, 0x67, 0x40, 0xC5, 0x03, 0x10, 0x01, 0x6A, -0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, 0x40, 0xA4, 0x48, 0x32, 0x03, 0x93, 0x49, 0xE3, 0x60, 0x9A, -0xBD, 0x67, 0x48, 0xA5, 0x01, 0x6C, 0xA4, 0x67, 0xA4, 0xEA, 0x45, 0x67, 0x6C, 0xEA, 0x02, 0x22, -0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x65, 0x67, -0x46, 0x67, 0xBD, 0x67, 0x88, 0xC5, 0x9D, 0x67, 0x6C, 0xC4, 0xBD, 0x67, 0x50, 0xC5, 0x7D, 0x67, -0x48, 0xA3, 0x9D, 0x67, 0x44, 0xC4, 0xBD, 0x67, 0x50, 0xA5, 0x05, 0x22, 0x7D, 0x67, 0x44, 0xA3, -0xE0, 0x4A, 0x9D, 0x67, 0x44, 0xC4, 0xBD, 0x67, 0x44, 0xA5, 0x20, 0x5A, 0x58, 0x67, 0x11, 0x2A, -0x7D, 0x67, 0x4C, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x48, 0x9A, -0x49, 0xE3, 0x40, 0x9A, 0x00, 0xD2, 0x9D, 0x67, 0x44, 0xA4, 0xE0, 0x4A, 0xBD, 0x67, 0x44, 0xC5, -0x0B, 0x10, 0x7D, 0x67, 0x4C, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, -0x44, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x00, 0xD2, 0x9D, 0x67, 0x44, 0xA4, 0x01, 0x6B, 0xA3, 0x67, -0xA4, 0xEA, 0x45, 0x67, 0x62, 0x67, 0x00, 0x92, 0x6C, 0xEA, 0x03, 0x22, 0x7D, 0x67, 0x48, 0xA3, -0x01, 0x10, 0xFF, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0xF8, 0x63, 0x0F, 0x62, 0x1C, 0x65, 0x85, 0x67, -0x66, 0x67, 0x47, 0x67, 0xD8, 0x67, 0xBD, 0x67, 0x40, 0xF0, 0xC0, 0xC5, 0xBD, 0x67, 0x40, 0xF0, -0x84, 0xC5, 0xDD, 0x67, 0x40, 0xF0, 0x68, 0xC6, 0x7D, 0x67, 0x40, 0xF0, 0x4C, 0xC3, 0x9D, 0x67, -0x40, 0xF0, 0x48, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, -0x18, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x00, 0x6A, 0xBD, 0x67, 0x5D, 0xC5, 0x03, 0x6A, 0xDD, 0x67, -0x55, 0xC6, 0x00, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x9D, 0x67, 0x40, 0xF0, 0x60, 0xA4, 0x7F, 0x6A, -0x6C, 0xEA, 0xBD, 0x67, 0x56, 0xC5, 0xDD, 0x67, 0x40, 0xF0, 0x44, 0xA6, 0x39, 0x2A, 0x7D, 0x67, -0x56, 0xA3, 0x0C, 0x5A, 0x58, 0x67, 0x0C, 0x22, 0x5D, 0x67, 0x76, 0xA2, 0x30, 0xF0, 0x20, 0x6A, -0xA0, 0xF1, 0x0C, 0x4A, 0x49, 0xE3, 0x0B, 0xD2, 0x01, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x60, 0x10, -0x9D, 0x67, 0x56, 0xA4, 0xF4, 0x4A, 0xBD, 0x67, 0x5A, 0xC5, 0xDD, 0x67, 0x40, 0xF0, 0x4C, 0xA6, -0x0D, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x82, 0x67, 0x00, 0xF2, 0x14, 0x4C, 0x5D, 0x67, 0x7A, 0xA2, -0x43, 0x67, 0x44, 0x32, 0x69, 0xE2, 0x49, 0xE4, 0x0B, 0xD2, 0x4A, 0x10, 0x7D, 0x67, 0x5A, 0xA3, -0xE0, 0x4A, 0x9D, 0x67, 0x5A, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0x82, 0x67, 0xA0, 0xF1, 0x18, 0x4C, -0xBD, 0x67, 0x7A, 0xA5, 0x43, 0x67, 0x44, 0x32, 0x69, 0xE2, 0x49, 0xE4, 0x0B, 0xD2, 0x38, 0x10, -0xDD, 0x67, 0x56, 0xA6, 0x0C, 0x5A, 0x58, 0x67, 0x0C, 0x22, 0x5D, 0x67, 0x76, 0xA2, 0x30, 0xF0, -0x20, 0x6A, 0x40, 0xF2, 0x1C, 0x4A, 0x49, 0xE3, 0x0B, 0xD2, 0x01, 0x6A, 0x7D, 0x67, 0x54, 0xC3, -0x27, 0x10, 0x9D, 0x67, 0x56, 0xA4, 0xF4, 0x4A, 0xBD, 0x67, 0x5A, 0xC5, 0xDD, 0x67, 0x40, 0xF0, -0x4C, 0xA6, 0x0D, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x82, 0x67, 0xC0, 0xF2, 0x04, 0x4C, 0x5D, 0x67, -0x7A, 0xA2, 0x43, 0x67, 0x44, 0x32, 0x69, 0xE2, 0x49, 0xE4, 0x0B, 0xD2, 0x11, 0x10, 0x7D, 0x67, -0x5A, 0xA3, 0xE0, 0x4A, 0x9D, 0x67, 0x5A, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0x82, 0x67, 0x60, 0xF2, -0x08, 0x4C, 0xBD, 0x67, 0x7A, 0xA5, 0x43, 0x67, 0x44, 0x32, 0x69, 0xE2, 0x49, 0xE4, 0x0B, 0xD2, -0xDD, 0x67, 0x54, 0xA6, 0x01, 0x6B, 0x6E, 0xEA, 0x22, 0x2A, 0x0B, 0x92, 0x40, 0xA2, 0x9D, 0x67, -0x5B, 0xC4, 0xBD, 0x67, 0x9B, 0xA5, 0xDD, 0x67, 0x40, 0xF0, 0x68, 0xA6, 0xBD, 0x67, 0x40, 0xF0, -0x4C, 0xA5, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0x7F, 0x24, 0xDD, 0x67, 0x5C, 0xC6, 0x04, 0x92, -0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, 0x7D, 0x67, 0x5C, 0xA3, 0xFF, 0x6C, -0x8E, 0xEA, 0x02, 0x2A, 0xFF, 0x6A, 0x54, 0x11, 0xBD, 0x67, 0x5C, 0xA5, 0x51, 0x11, 0x00, 0x6A, -0xDD, 0x67, 0x59, 0xC6, 0x0D, 0x10, 0x7D, 0x67, 0x59, 0xA3, 0x04, 0x03, 0x49, 0xE3, 0x01, 0x6B, -0x6B, 0xEB, 0x20, 0xF0, 0x60, 0xC2, 0x9D, 0x67, 0x59, 0xA4, 0x01, 0x4A, 0xBD, 0x67, 0x59, 0xC5, -0xDD, 0x67, 0x59, 0xA6, 0x03, 0x5A, 0x58, 0x67, 0xEE, 0x2A, 0x00, 0x6A, 0x7D, 0x67, 0x58, 0xC3, -0x00, 0x6A, 0x9D, 0x67, 0x59, 0xC4, 0x55, 0x10, 0xBD, 0x67, 0x59, 0xA5, 0x0B, 0x93, 0x49, 0xE3, -0x40, 0xA2, 0xDD, 0x67, 0x5B, 0xC6, 0x7D, 0x67, 0x5B, 0xA3, 0x2C, 0x6C, 0x8E, 0xEA, 0x07, 0x2A, -0xBD, 0x67, 0x40, 0xF0, 0x4C, 0xA5, 0x03, 0x2A, 0x0C, 0x6A, 0xDD, 0x67, 0x5B, 0xC6, 0x5D, 0x67, -0x9B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x68, 0xA5, 0xDD, 0x67, 0x40, 0xF0, 0x4C, 0xA6, 0xA3, 0x67, -0xC2, 0x67, 0x00, 0x18, 0x7F, 0x24, 0x7D, 0x67, 0x5C, 0xC3, 0x9D, 0x67, 0x59, 0xA4, 0x01, 0x4A, -0xBD, 0x67, 0x59, 0xC5, 0xDD, 0x67, 0x5C, 0xA6, 0xFF, 0x6B, 0x6E, 0xEA, 0x18, 0x2A, 0x9D, 0x67, -0x5B, 0xA4, 0x46, 0x6D, 0xAE, 0xEA, 0x0C, 0x2A, 0xDD, 0x67, 0x40, 0xF0, 0x44, 0xA6, 0x04, 0x2A, -0x47, 0x6A, 0x7D, 0x67, 0x5C, 0xC3, 0x24, 0x10, 0x45, 0x6A, 0x9D, 0x67, 0x5C, 0xC4, 0x20, 0x10, -0xBD, 0x67, 0x7D, 0xA5, 0xDD, 0x67, 0x59, 0xA6, 0x49, 0xE3, 0x7D, 0x67, 0x5D, 0xC3, 0x9D, 0x67, -0x5C, 0xA4, 0xFF, 0x6D, 0xAE, 0xEA, 0x0D, 0x22, 0xDD, 0x67, 0x58, 0xA6, 0x04, 0x03, 0x49, 0xE3, -0x9D, 0x67, 0x7C, 0xA4, 0x20, 0xF0, 0x60, 0xC2, 0xBD, 0x67, 0x58, 0xA5, 0x01, 0x4A, 0xDD, 0x67, -0x58, 0xC6, 0x5D, 0x67, 0x79, 0xA2, 0x9D, 0x67, 0x55, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0xA4, 0x2A, -0x7D, 0x67, 0x58, 0xA3, 0x6F, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, -0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x04, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0x6C, 0x33, 0xAF, 0xA2, -0x19, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0x9D, 0x67, 0x5D, 0xA4, 0x06, 0x5A, -0x58, 0x67, 0x02, 0x2A, 0xFF, 0x6A, 0xBC, 0x10, 0x0C, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, -0x10, 0x6A, 0x9D, 0x67, 0x5F, 0xC4, 0x10, 0x6A, 0xBD, 0x67, 0x5E, 0xC5, 0x04, 0x92, 0x51, 0xA2, -0x52, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0xDD, 0x67, 0x57, 0xC6, -0x00, 0x6A, 0x09, 0xD2, 0x04, 0x92, 0x5D, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, 0x33, 0x22, 0x7D, 0x67, -0x40, 0xF0, 0x4C, 0xA3, 0x06, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF4, 0x0C, 0x4A, 0x0A, 0xD2, -0x05, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF4, 0x14, 0x4A, 0x0A, 0xD2, 0x9D, 0x67, 0x57, 0xA4, -0xFF, 0x4A, 0x02, 0x5A, 0x58, 0x67, 0x1E, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x51, 0xA3, 0x09, 0xD2, -0x09, 0x92, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x62, 0x67, 0x0A, 0x92, 0x40, 0x9A, -0x6C, 0xEA, 0x10, 0x22, 0xBD, 0x67, 0x20, 0xF0, 0x51, 0xA5, 0xDD, 0x67, 0x5C, 0xC6, 0x7D, 0x67, -0x20, 0xF0, 0x50, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x51, 0xC4, 0xBD, 0x67, 0x5C, 0xA5, 0xDD, 0x67, -0x20, 0xF0, 0x50, 0xC6, 0x04, 0x92, 0x5D, 0xA2, 0x40, 0x6B, 0x6C, 0xEA, 0x2C, 0x22, 0x7D, 0x67, -0x40, 0xF0, 0x4C, 0xA3, 0x06, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF4, 0x1C, 0x4A, 0x0A, 0xD2, -0x05, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF5, 0x04, 0x4A, 0x0A, 0xD2, 0x9D, 0x67, 0x57, 0xA4, -0xFF, 0x4A, 0x02, 0x5A, 0x58, 0x67, 0x17, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x51, 0xA3, 0x01, 0x6B, -0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x62, 0x67, 0x0A, 0x92, 0x40, 0x9A, 0x6C, 0xEA, 0x0B, 0x22, -0xBD, 0x67, 0x20, 0xF0, 0x51, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x50, 0xC6, 0x01, 0x6A, 0x4B, 0xEA, -0x7D, 0x67, 0x20, 0xF0, 0x51, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x51, 0xA4, 0xFF, 0x6D, 0xAE, 0xEA, -0x11, 0x22, 0xDD, 0x67, 0x20, 0xF0, 0x52, 0xA6, 0xFF, 0x6B, 0x6E, 0xEA, 0x0B, 0x22, 0x9D, 0x67, -0x20, 0xF0, 0x71, 0xA4, 0x04, 0x92, 0x65, 0xC2, 0xBD, 0x67, 0x20, 0xF0, 0x72, 0xA5, 0x04, 0x92, -0x66, 0xC2, 0x23, 0x10, 0xDD, 0x67, 0x20, 0xF0, 0x51, 0xA6, 0xFF, 0x6B, 0x6E, 0xEA, 0x0C, 0x22, -0x9D, 0x67, 0x20, 0xF0, 0x52, 0xA4, 0xFF, 0x6D, 0xAE, 0xEA, 0x06, 0x2A, 0xDD, 0x67, 0x20, 0xF0, -0x71, 0xA6, 0x04, 0x92, 0x66, 0xC2, 0x11, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x51, 0xA3, 0xFF, 0x6C, -0x8E, 0xEA, 0x0B, 0x2A, 0xBD, 0x67, 0x20, 0xF0, 0x52, 0xA5, 0xFF, 0x6E, 0xCE, 0xEA, 0x05, 0x22, -0x5D, 0x67, 0x20, 0xF0, 0x72, 0xA2, 0x04, 0x92, 0x66, 0xC2, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, -0x0F, 0x97, 0x08, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x65, 0x67, 0x46, 0x67, -0xBD, 0x67, 0x20, 0xF0, 0x80, 0xC5, 0x9D, 0x67, 0x20, 0xF0, 0x64, 0xC4, 0xBD, 0x67, 0x20, 0xF0, -0x48, 0xC5, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, -0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x04, 0x92, 0x4E, 0xA2, 0x52, 0x32, -0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x55, 0xC4, 0x04, 0x92, -0x60, 0xA2, 0x04, 0x92, 0x42, 0xA2, 0x4B, 0xE3, 0xBD, 0x67, 0x57, 0xC5, 0x04, 0x92, 0x61, 0xA2, -0x04, 0x92, 0x42, 0xA2, 0x49, 0xE3, 0x7D, 0x67, 0x56, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x44, 0xA4, -0x38, 0x5A, 0x58, 0x67, 0x05, 0x2A, 0x04, 0x92, 0x40, 0xA2, 0x7D, 0x67, 0x54, 0xC3, 0x1A, 0x10, -0x9D, 0x67, 0x20, 0xF0, 0x44, 0xA4, 0x24, 0x5A, 0x58, 0x67, 0x05, 0x2A, 0x7D, 0x67, 0x57, 0xA3, -0x9D, 0x67, 0x54, 0xC4, 0x0F, 0x10, 0xBD, 0x67, 0x20, 0xF0, 0x44, 0xA5, 0x15, 0x5A, 0x58, 0x67, -0x05, 0x2A, 0x7D, 0x67, 0x56, 0xA3, 0x9D, 0x67, 0x54, 0xC4, 0x04, 0x10, 0x04, 0x92, 0x41, 0xA2, -0xBD, 0x67, 0x54, 0xC5, 0x5D, 0x67, 0x20, 0xF0, 0x80, 0xA2, 0xBD, 0x67, 0x74, 0xA5, 0xBD, 0x67, -0x20, 0xF0, 0x48, 0xA5, 0xA3, 0x67, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0x8C, 0x22, 0x5D, 0x67, -0x20, 0xF0, 0xA0, 0xA2, 0x9D, 0x67, 0x20, 0xF0, 0x64, 0xA4, 0x9D, 0x67, 0x54, 0xA4, 0x30, 0xF0, -0x20, 0x6C, 0x21, 0xF0, 0x18, 0x4C, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x07, 0x97, -0x04, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x68, 0xC4, 0x7D, 0x67, -0x4C, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, -0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0xD2, 0x01, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, 0x44, 0xC3, -0x00, 0x92, 0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, 0x03, 0x6C, 0x8E, 0xEA, 0x38, 0x2A, 0x7D, 0x67, -0x4C, 0xA3, 0x48, 0x5A, 0x58, 0x67, 0x1D, 0x2A, 0x7D, 0x67, 0x4C, 0xA3, 0x4A, 0x5A, 0x58, 0x67, -0x18, 0x22, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x7B, 0x22, 0x7D, 0x67, 0x4C, 0xA3, -0x6F, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x80, 0x6A, -0x4B, 0xEA, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x9D, 0x67, 0x44, 0xC4, -0x6F, 0x10, 0x7D, 0x67, 0x4C, 0xA3, 0x47, 0x6C, 0x8E, 0xEA, 0x65, 0x2A, 0x00, 0x92, 0x4E, 0xA2, -0x0C, 0x6B, 0x6C, 0xEA, 0x08, 0x6B, 0x6E, 0xEA, 0x60, 0x2A, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, -0x6C, 0xEA, 0x5D, 0x22, 0x3B, 0x6A, 0x4B, 0xEA, 0x9D, 0x67, 0x44, 0xC4, 0x59, 0x10, 0x00, 0x92, -0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, 0x02, 0x6B, 0x6E, 0xEA, 0x22, 0x2A, 0x9D, 0x67, 0x4C, 0xA4, -0x3E, 0x5A, 0x58, 0x67, 0x4D, 0x2A, 0x7D, 0x67, 0x4C, 0xA3, 0x40, 0x5A, 0x58, 0x67, 0x48, 0x22, -0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x43, 0x22, 0x7D, 0x67, 0x4C, 0xA3, 0x6F, 0x42, -0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x80, 0x6A, 0x4B, 0xEA, -0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x9D, 0x67, 0x44, 0xC4, 0x30, 0x10, -0x00, 0x92, 0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, 0x01, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, 0x9D, 0x67, -0x4C, 0xA4, 0x34, 0x5A, 0x58, 0x67, 0x24, 0x2A, 0x7D, 0x67, 0x4C, 0xA3, 0x36, 0x5A, 0x58, 0x67, -0x1F, 0x22, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x1A, 0x22, 0x7D, 0x67, 0x4C, 0xA3, -0x6F, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x80, 0x6A, -0x4B, 0xEA, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x9D, 0x67, 0x44, 0xC4, -0x07, 0x10, 0x00, 0x65, 0x05, 0x10, 0x00, 0x65, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, -0x7D, 0x67, 0x44, 0xA3, 0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, -0x68, 0xC4, 0x7D, 0x67, 0x4C, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, -0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0xD2, 0x5D, 0x67, 0x6C, 0xA2, -0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x45, 0xC3, 0x9D, 0x67, 0x6C, 0xA4, 0x80, 0x6A, 0x4B, 0xEA, -0x6C, 0xEA, 0x7D, 0x67, 0x44, 0xC3, 0x9D, 0x67, 0x44, 0xA4, 0x0A, 0x22, 0x7D, 0x67, 0x45, 0xA3, -0x48, 0x6C, 0x8E, 0xEA, 0x02, 0x2A, 0x49, 0x6A, 0x62, 0x10, 0x7D, 0x67, 0x45, 0xA3, 0x5F, 0x10, -0x01, 0x6A, 0x4B, 0xEA, 0x9D, 0x67, 0x46, 0xC4, 0x00, 0x92, 0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, -0x03, 0x6B, 0x6E, 0xEA, 0x17, 0x2A, 0x9D, 0x67, 0x45, 0xA4, 0x45, 0x5A, 0x58, 0x67, 0x4D, 0x2A, -0x7D, 0x67, 0x45, 0xA3, 0x49, 0x5A, 0x58, 0x67, 0x48, 0x22, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, -0x6C, 0xEA, 0x43, 0x22, 0x5D, 0x67, 0x65, 0xA2, 0x80, 0x6A, 0x4B, 0xEA, 0x6D, 0xEA, 0x7D, 0x67, -0x46, 0xC3, 0x3B, 0x10, 0x00, 0x92, 0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, 0x02, 0x6C, 0x8E, 0xEA, -0x17, 0x2A, 0x7D, 0x67, 0x45, 0xA3, 0x3D, 0x5A, 0x58, 0x67, 0x2F, 0x2A, 0x7D, 0x67, 0x45, 0xA3, -0x3F, 0x5A, 0x58, 0x67, 0x2A, 0x22, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x25, 0x22, -0x5D, 0x67, 0x65, 0xA2, 0x80, 0x6A, 0x4B, 0xEA, 0x6D, 0xEA, 0x7D, 0x67, 0x46, 0xC3, 0x1D, 0x10, -0x00, 0x92, 0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, 0x01, 0x6C, 0x8E, 0xEA, 0x16, 0x2A, 0x7D, 0x67, -0x45, 0xA3, 0x33, 0x5A, 0x58, 0x67, 0x11, 0x2A, 0x7D, 0x67, 0x45, 0xA3, 0x35, 0x5A, 0x58, 0x67, -0x0C, 0x22, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x07, 0x22, 0x5D, 0x67, 0x65, 0xA2, -0x80, 0x6A, 0x4B, 0xEA, 0x6D, 0xEA, 0x7D, 0x67, 0x46, 0xC3, 0x9D, 0x67, 0x46, 0xA4, 0x01, 0x63, -0x20, 0xE8, 0x00, 0x65, 0xF9, 0x63, 0x0D, 0x62, 0x1C, 0x65, 0x86, 0x67, 0x67, 0x67, 0x12, 0x92, -0xF8, 0x67, 0xDD, 0x67, 0x20, 0xF0, 0xF8, 0xC6, 0xDD, 0x67, 0x20, 0xF0, 0xBC, 0xC6, 0xFD, 0x67, -0x40, 0xF0, 0x80, 0xC7, 0x9D, 0x67, 0x40, 0xF0, 0x64, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x48, 0xC5, -0xDD, 0x67, 0x40, 0xF0, 0x40, 0xA6, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, -0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x04, 0x92, 0x5B, 0xA2, 0xFD, 0x67, 0x40, 0xF0, -0x64, 0xA7, 0x6E, 0xEA, 0x38, 0x22, 0x7D, 0x67, 0x40, 0xF0, 0x44, 0xA3, 0x9D, 0x67, 0x56, 0xC4, -0xBD, 0x67, 0x40, 0xF0, 0x40, 0xA5, 0xDD, 0x67, 0x57, 0xC6, 0xFD, 0x67, 0x20, 0xF0, 0x5C, 0xA7, -0x44, 0x32, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x9D, 0x67, 0x20, 0xF0, 0x58, 0x84, -0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, -0x58, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x48, 0xA6, 0xFD, 0x67, 0x5A, 0xC7, 0x04, 0x92, 0x56, 0xA2, -0x7D, 0x67, 0x5B, 0xC3, 0x0C, 0x6A, 0x9D, 0x67, 0x54, 0xC4, 0x06, 0x6A, 0xBD, 0x67, 0x51, 0xCD, -0x05, 0x94, 0x06, 0x95, 0x07, 0x96, 0x08, 0x97, 0x00, 0x18, 0x8D, 0x18, 0x04, 0x92, 0xDD, 0x67, -0x40, 0xF0, 0x64, 0xA6, 0x7B, 0xC2, 0x0D, 0x97, 0x07, 0x63, 0x00, 0xEF, 0xFB, 0x63, 0x09, 0x62, -0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x4C, 0xC5, -0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, -0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x54, 0x32, -0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0xBD, 0x67, -0x54, 0xC5, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, -0x61, 0xF3, 0x50, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x18, 0x6A, -0x6C, 0xEA, 0x4F, 0x32, 0x9D, 0x67, 0x55, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x48, 0xA5, 0x82, 0x67, -0x00, 0x18, 0xDC, 0x0A, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x4E, 0x32, 0x9D, 0x67, 0x58, 0xC4, -0xBD, 0x67, 0x20, 0xF0, 0x68, 0xA5, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x57, 0xC3, 0x04, 0x92, -0x4F, 0xA2, 0x5A, 0x32, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, -0x56, 0xC4, 0xBD, 0x67, 0x56, 0xA5, 0x80, 0xF0, 0x04, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x4C, 0xA3, -0x22, 0x22, 0x04, 0x92, 0x8C, 0xA2, 0x10, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6C, 0xC2, 0x04, 0x92, -0x91, 0xA2, 0x10, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x71, 0xC2, 0xBD, 0x67, 0x20, 0xF0, 0x88, 0xA5, -0x5D, 0x67, 0x74, 0xA2, 0xBD, 0x67, 0x55, 0xA5, 0xA3, 0x67, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, -0x8C, 0x22, 0x04, 0x92, 0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, 0x04, 0x92, -0x00, 0x6B, 0x72, 0xC2, 0x41, 0x10, 0x04, 0x92, 0x4F, 0xA2, 0x18, 0x6B, 0x6C, 0xEA, 0x18, 0x2A, -0x04, 0x92, 0x71, 0xA2, 0x0F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x61, 0x42, 0xFF, 0x6A, -0x6C, 0xEA, 0x62, 0x67, 0x0F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x04, 0x92, -0x0F, 0x6B, 0x8C, 0xEB, 0xB1, 0xA2, 0x10, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x71, 0xC2, -0x04, 0x92, 0x71, 0xA2, 0x0F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x06, 0x52, 0x58, 0x67, -0x12, 0x2A, 0x04, 0x92, 0x4C, 0xA2, 0xF0, 0x6B, 0x6C, 0xEA, 0x10, 0x6B, 0x6E, 0xEA, 0x0B, 0x2A, -0x04, 0x92, 0x7A, 0xA2, 0x04, 0x92, 0x72, 0xC2, 0x04, 0x92, 0x91, 0xA2, 0x10, 0x6B, 0x6B, 0xEB, -0x8C, 0xEB, 0x71, 0xC2, 0x03, 0x10, 0x04, 0x92, 0x00, 0x6B, 0x72, 0xC2, 0x9D, 0x67, 0x20, 0xF0, -0x48, 0xA4, 0x82, 0x67, 0x00, 0x18, 0xAD, 0x28, 0x04, 0x92, 0x8F, 0xA2, 0x41, 0x6B, 0x6B, 0xEB, -0x8C, 0xEB, 0x6F, 0xC2, 0x04, 0x92, 0x90, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, -0x02, 0x6B, 0x8D, 0xEB, 0x70, 0xC2, 0x04, 0x92, 0x72, 0xA2, 0x04, 0x92, 0x90, 0xA2, 0x07, 0x6A, -0x4C, 0xEC, 0xFF, 0x6A, 0x8C, 0xEA, 0x4D, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x04, 0x92, 0x72, 0xC2, -0x01, 0x10, 0x00, 0x65, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFA, 0x63, 0x0B, 0x62, -0x65, 0x67, 0x46, 0x67, 0xBD, 0x67, 0x20, 0xF0, 0x90, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x74, 0xC6, -0x7D, 0x67, 0x20, 0xF0, 0x58, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x50, 0xA4, 0x4C, 0x32, 0x48, 0x33, -0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x05, 0xD2, 0x30, 0xF0, -0x20, 0x6A, 0x66, 0xF0, 0x18, 0x4A, 0x04, 0xD2, 0xBD, 0x67, 0x20, 0xF0, 0x50, 0xA5, 0x54, 0x32, -0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0xDD, 0x67, -0x20, 0xF0, 0x43, 0xC6, 0x5D, 0x67, 0x20, 0xF0, 0x63, 0xA2, 0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, -0x5D, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x63, 0xA4, 0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0xBD, 0x67, -0x20, 0xF0, 0x40, 0xC5, 0x05, 0x92, 0x40, 0xA2, 0xDD, 0x67, 0x5A, 0xC6, 0x05, 0x92, 0x41, 0xA2, -0x7D, 0x67, 0x5B, 0xC3, 0x05, 0x92, 0x4E, 0xA2, 0x52, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, -0xFF, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x20, 0xF0, 0x41, 0xC4, 0x05, 0x92, 0x4E, 0xA2, 0x4A, 0x32, -0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xC5, -0xDD, 0x67, 0x7D, 0xA6, 0x30, 0xF0, 0x20, 0x6A, 0x64, 0x33, 0x40, 0xF4, 0x04, 0x4A, 0x49, 0xE3, -0x60, 0xAA, 0x05, 0x92, 0x6C, 0xCA, 0x5D, 0x67, 0x20, 0xF0, 0x62, 0xA2, 0x03, 0x6A, 0x4C, 0xEB, -0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x05, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0xAF, 0xA2, 0x04, 0x6C, -0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0x05, 0x92, 0x01, 0x6B, 0x6B, 0xEB, 0x65, 0xC2, -0x05, 0x92, 0x01, 0x6B, 0x6B, 0xEB, 0x66, 0xC2, 0x01, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x05, 0x92, -0x90, 0xA2, 0x7F, 0x6B, 0x8C, 0xEB, 0x70, 0xC2, 0x05, 0x92, 0x8F, 0xA2, 0x80, 0x6B, 0x6B, 0xEB, -0x8D, 0xEB, 0x6F, 0xC2, 0x05, 0x92, 0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, -0x05, 0x92, 0x00, 0x6B, 0x72, 0xC2, 0x9D, 0x67, 0x7D, 0xA4, 0xBD, 0x67, 0x5A, 0xA5, 0x63, 0xEA, -0x58, 0x67, 0x05, 0x22, 0x7D, 0x67, 0x5A, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x43, 0xC4, 0xBD, 0x67, -0x20, 0xF0, 0x54, 0xA5, 0x04, 0x2A, 0x00, 0x6A, 0xDD, 0x67, 0x58, 0xC6, 0xAA, 0x10, 0x7D, 0x67, -0x20, 0xF0, 0x54, 0xA3, 0x9D, 0x67, 0x5C, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x40, 0xA5, 0x0A, 0x22, -0xDD, 0x67, 0x5D, 0xA6, 0x7D, 0x67, 0x20, 0xF0, 0x43, 0xC3, 0x9D, 0x67, 0x5C, 0xA4, 0xFF, 0x4A, -0xBD, 0x67, 0x5C, 0xC5, 0xDD, 0x67, 0x5C, 0xA6, 0x04, 0x2A, 0x00, 0x6A, 0x7D, 0x67, 0x58, 0xC3, -0x90, 0x10, 0x9D, 0x67, 0x20, 0xF0, 0x70, 0xA4, 0xBD, 0x67, 0x20, 0xF0, 0x43, 0xA5, 0x83, 0x67, -0xA2, 0x67, 0x00, 0x18, 0xED, 0x25, 0xDD, 0x67, 0x59, 0xC6, 0x7D, 0x67, 0x59, 0xA3, 0xFF, 0x6C, -0x8E, 0xEA, 0x1A, 0x22, 0xBD, 0x67, 0x59, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x43, 0xC6, 0x5D, 0x67, -0x20, 0xF0, 0x63, 0xA2, 0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5D, 0xC3, 0x9D, 0x67, 0x20, 0xF0, -0x63, 0xA4, 0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0xBD, 0x67, 0x20, 0xF0, 0x40, 0xC5, 0xDD, 0x67, -0x5C, 0xA6, 0xFF, 0x4A, 0x7D, 0x67, 0x5C, 0xC3, 0x9D, 0x67, 0x5C, 0xA4, 0x04, 0x2A, 0x01, 0x6A, -0xBD, 0x67, 0x58, 0xC5, 0x5E, 0x10, 0xDD, 0x67, 0x7D, 0xA6, 0x9D, 0x67, 0x5B, 0xA4, 0x63, 0xEA, -0x58, 0x67, 0x0C, 0x2A, 0x7D, 0x67, 0x5B, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x43, 0xC4, 0x00, 0x6A, -0xBD, 0x67, 0x5C, 0xC5, 0x00, 0x6A, 0xDD, 0x67, 0x58, 0xC6, 0x4B, 0x10, 0x01, 0x6A, 0x7D, 0x67, -0x58, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x5E, 0xC4, 0x3D, 0x10, 0x00, 0x6A, 0xBD, 0x67, 0x5F, 0xC5, -0x2D, 0x10, 0xDD, 0x67, 0x9D, 0xA6, 0x5D, 0x67, 0x20, 0xF0, 0x70, 0xA2, 0xBD, 0x67, 0x20, 0xF0, -0x41, 0xA5, 0x01, 0x6D, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0xA2, 0x24, 0xDD, 0x67, 0x20, 0xF0, -0x43, 0xC6, 0x5D, 0x67, 0x7D, 0xA2, 0x9D, 0x67, 0x5B, 0xA4, 0x63, 0xEA, 0x58, 0x67, 0x06, 0x2A, -0x7D, 0x67, 0x5B, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x43, 0xC4, 0x17, 0x10, 0xBD, 0x67, 0x20, 0xF0, -0x43, 0xA5, 0xFF, 0x6E, 0xCE, 0xEA, 0x10, 0x2A, 0x7D, 0x67, 0x5D, 0xA3, 0xFF, 0x4A, 0x9D, 0x67, -0x5D, 0xC4, 0xBD, 0x67, 0x5F, 0xA5, 0x01, 0x4A, 0xDD, 0x67, 0x5F, 0xC6, 0x7D, 0x67, 0x5F, 0xA3, -0x54, 0x5A, 0x58, 0x67, 0xCE, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x7D, 0x67, 0x5E, 0xA3, 0x01, 0x4A, -0x9D, 0x67, 0x5E, 0xC4, 0xBD, 0x67, 0x7E, 0xA5, 0xDD, 0x67, 0x5C, 0xA6, 0x43, 0xEB, 0x58, 0x67, -0xBC, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x58, 0xA3, 0x01, 0x6C, 0x8E, 0xEA, 0x09, 0x2A, 0x00, 0x6A, -0xBD, 0x67, 0x58, 0xC5, 0x05, 0x92, 0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, -0x05, 0x92, 0xDD, 0x67, 0x20, 0xF0, 0x63, 0xA6, 0x6A, 0xC2, 0x7D, 0x67, 0x20, 0xF0, 0x43, 0xA3, -0xFF, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x43, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x50, 0xA5, 0x03, 0x5A, -0x58, 0x67, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, -0xA1, 0xF3, 0x70, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x81, 0x43, 0xFF, 0x6B, 0x8C, 0xEB, -0x60, 0xC2, 0x05, 0x92, 0x8C, 0xA2, 0x0F, 0x6B, 0x8C, 0xEB, 0x83, 0x67, 0x20, 0x6B, 0x8D, 0xEB, -0x6C, 0xC2, 0x5D, 0x67, 0x20, 0xF0, 0x90, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0xA3, 0xA3, 0xDD, 0x67, -0x78, 0xA6, 0xDD, 0x67, 0x20, 0xF0, 0x42, 0xA6, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0x8C, 0x22, -0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFA, 0x63, 0x0B, 0x62, 0x64, 0x67, 0x45, 0x67, -0x9D, 0x67, 0x20, 0xF0, 0x70, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x54, 0xC5, 0xDD, 0x67, 0x20, 0xF0, -0x50, 0xA6, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, -0x49, 0xE3, 0x05, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x66, 0xF0, 0x18, 0x4A, 0x04, 0xD2, 0x7D, 0x67, -0x20, 0xF0, 0x50, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x4C, 0x9A, -0x49, 0xE3, 0x40, 0xA2, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x60, 0xA5, -0x7F, 0x6A, 0x6C, 0xEA, 0xDD, 0x67, 0x5F, 0xC6, 0x5D, 0x67, 0x20, 0xF0, 0x60, 0xA2, 0x80, 0x6A, -0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x5C, 0xC3, 0x05, 0x92, 0x40, 0xA2, 0x9D, 0x67, 0x5A, 0xC4, -0x05, 0x92, 0x4E, 0xA2, 0x52, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, -0xBD, 0x67, 0x59, 0xC5, 0x05, 0x92, 0x4E, 0xA2, 0x4A, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, -0xFF, 0x6A, 0x6C, 0xEA, 0xDD, 0x67, 0x5B, 0xC6, 0x5D, 0x67, 0x7F, 0xA2, 0x30, 0xF0, 0x20, 0x6A, -0x64, 0x33, 0x80, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x60, 0xAA, 0x05, 0x92, 0x6C, 0xCA, 0x05, 0x92, -0x9D, 0x67, 0x20, 0xF0, 0x60, 0xA4, 0x6A, 0xC2, 0xBD, 0x67, 0x7B, 0xA5, 0x03, 0x6A, 0x4C, 0xEB, -0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x05, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0xAF, 0xA2, 0x04, 0x6C, -0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0x05, 0x92, 0x01, 0x6B, 0x6B, 0xEB, 0x65, 0xC2, -0x05, 0x92, 0x01, 0x6B, 0x6B, 0xEB, 0x66, 0xC2, 0x05, 0x92, 0x90, 0xA2, 0x7F, 0x6B, 0x8C, 0xEB, -0x70, 0xC2, 0x05, 0x92, 0x8F, 0xA2, 0x80, 0x6B, 0x6B, 0xEB, 0x8D, 0xEB, 0x6F, 0xC2, 0x05, 0x92, -0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, 0x05, 0x92, 0x00, 0x6B, 0x72, 0xC2, -0xDD, 0x67, 0x7F, 0xA6, 0x9D, 0x67, 0x5A, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0x57, 0x22, 0x5D, 0x67, -0x20, 0xF0, 0x70, 0xA2, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, -0x46, 0x26, 0xBD, 0x67, 0x58, 0xC5, 0xDD, 0x67, 0x58, 0xA6, 0xFF, 0x6B, 0x6E, 0xEA, 0x0F, 0x22, -0x9D, 0x67, 0x58, 0x84, 0x00, 0x52, 0x58, 0x67, 0x06, 0x22, 0x7D, 0x67, 0x58, 0xA3, 0x9D, 0x67, -0x20, 0xF0, 0x40, 0xC4, 0x6D, 0x10, 0xBD, 0x67, 0x58, 0xA5, 0xDD, 0x67, 0x5F, 0xC6, 0x00, 0x6A, -0x7D, 0x67, 0x5E, 0xC3, 0x2D, 0x10, 0xBD, 0x67, 0x9F, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x70, 0xA6, -0xBD, 0x67, 0x59, 0xA5, 0x00, 0x6D, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0xA2, 0x24, 0xDD, 0x67, -0x20, 0xF0, 0x40, 0xC6, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0xFF, 0x6C, 0x8E, 0xEA, 0x4F, 0x2A, -0xBD, 0x67, 0x7F, 0xA5, 0xDD, 0x67, 0x5A, 0xA6, 0x43, 0xEB, 0x58, 0x67, 0x07, 0x2A, 0x7D, 0x67, -0x5A, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xC4, 0x00, 0x65, 0x42, 0x10, 0xBD, 0x67, 0x5F, 0xA5, -0x01, 0x4A, 0xDD, 0x67, 0x5F, 0xC6, 0x7D, 0x67, 0x5E, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x5E, 0xC4, -0xBD, 0x67, 0x5E, 0xA5, 0x54, 0x5A, 0x58, 0x67, 0xCE, 0x2A, 0x32, 0x10, 0x5D, 0x67, 0x7F, 0xA2, -0x9D, 0x67, 0x5A, 0xA4, 0x6E, 0xEA, 0x1D, 0x2A, 0x05, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, -0x0C, 0x22, 0xBD, 0x67, 0x5C, 0xA5, 0x09, 0x2A, 0xDD, 0x67, 0x7A, 0xA6, 0x80, 0x6A, 0x4B, 0xEA, -0x6D, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x1B, 0x10, 0x9D, 0x67, 0x7F, 0xA4, 0x30, 0xF0, -0x20, 0x6A, 0x64, 0x33, 0x80, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x60, 0xAA, 0x05, 0x92, 0x6C, 0xCA, -0x4E, 0x10, 0xBD, 0x67, 0x5A, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x40, 0xC6, 0x01, 0x6A, 0x7D, 0x67, -0x20, 0xF0, 0x54, 0xC3, 0x05, 0x92, 0x9D, 0x67, 0x7A, 0xA4, 0x6A, 0xC2, 0x01, 0x10, 0x00, 0x65, -0xBD, 0x67, 0x20, 0xF0, 0x54, 0xA5, 0x01, 0x6E, 0xCE, 0xEA, 0x0A, 0x2A, 0x00, 0x6A, 0x7D, 0x67, -0x5D, 0xC3, 0x05, 0x92, 0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, 0x03, 0x10, -0x01, 0x6A, 0x9D, 0x67, 0x5D, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x50, 0xA5, 0x03, 0x5A, 0x58, 0x67, -0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF3, -0x74, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x81, 0x43, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, -0x05, 0x92, 0x8C, 0xA2, 0x0F, 0x6B, 0x8C, 0xEB, 0x83, 0x67, 0x10, 0x6B, 0x8D, 0xEB, 0x6C, 0xC2, -0x5D, 0x67, 0x20, 0xF0, 0x90, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0xA0, 0xA3, 0xDD, 0x67, 0x7D, 0xA6, -0xDD, 0x67, 0x5B, 0xA6, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0x8C, 0x22, 0x00, 0x65, 0x0B, 0x97, -0x06, 0x63, 0x00, 0xEF, 0xFC, 0x63, 0x07, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, -0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, -0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x04, 0x92, 0x40, 0xA2, 0xBD, 0x67, 0x54, 0xC5, -0x04, 0x92, 0x4A, 0xA2, 0x7D, 0x67, 0x57, 0xC3, 0x04, 0x92, 0x6F, 0xA2, 0x03, 0x6A, 0x4C, 0xEB, -0xFF, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x55, 0xC4, 0xBD, 0x67, 0x77, 0xA5, 0x7F, 0x6A, 0x6C, 0xEA, -0x7D, 0x67, 0x56, 0xC3, 0x9D, 0x67, 0x76, 0xA4, 0xBD, 0x67, 0x54, 0xA5, 0x63, 0xEA, 0x58, 0x67, -0x04, 0x22, 0x7D, 0x67, 0x54, 0xA3, 0x9D, 0x67, 0x57, 0xC4, 0x04, 0x92, 0x4A, 0xA2, 0x00, 0xF6, -0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, -0x00, 0xF6, 0x63, 0x33, 0xBD, 0x67, 0x57, 0x85, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, -0x43, 0x32, 0x7D, 0x67, 0x57, 0xC3, 0xBD, 0x67, 0x20, 0xF0, 0x80, 0xA5, 0x5D, 0x67, 0x77, 0xA2, -0xBD, 0x67, 0x55, 0xA5, 0xA3, 0x67, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0x8C, 0x22, 0x07, 0x97, -0x04, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, 0x7D, 0x67, 0x48, 0xA3, -0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, -0x00, 0xD2, 0x00, 0x92, 0x90, 0xA2, 0x7F, 0x6B, 0x8C, 0xEB, 0x70, 0xC2, 0x00, 0x92, 0x8F, 0xA2, -0x7F, 0x6B, 0x8C, 0xEB, 0x6F, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x02, 0xD4, -0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xF9, 0x63, 0x0D, 0x62, 0x44, 0x67, 0x7D, 0x67, -0x20, 0xF0, 0x58, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x58, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, -0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x04, 0x92, 0x44, 0xA2, -0x7D, 0x67, 0x20, 0xF0, 0x46, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x46, 0xA4, 0x0F, 0x5A, 0x78, 0x67, -0x7B, 0x23, 0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF0, 0x08, 0x4A, 0x49, 0xE3, 0x40, 0x9A, -0x00, 0xEA, 0x04, 0x92, 0x1B, 0x6B, 0x67, 0xC2, 0x05, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, -0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x03, 0x6B, 0x8D, 0xEB, -0x6B, 0xC2, 0x6C, 0x10, 0x04, 0x92, 0x3D, 0x6B, 0x67, 0xC2, 0x05, 0x6A, 0x9D, 0x67, 0x20, 0xF0, -0x44, 0xC4, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x02, 0x6B, -0x8D, 0xEB, 0x6B, 0xC2, 0x5B, 0x10, 0x04, 0x92, 0x13, 0x6B, 0x67, 0xC2, 0x04, 0x6A, 0x7D, 0x67, -0x20, 0xF0, 0x44, 0xC3, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, -0x01, 0x6B, 0x8D, 0xEB, 0x6B, 0xC2, 0x04, 0x92, 0x33, 0x6B, 0x67, 0xC2, 0x04, 0x6A, 0x9D, 0x67, -0x20, 0xF0, 0x44, 0xC4, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, -0x01, 0x6B, 0x8D, 0xEB, 0x6B, 0xC2, 0x3A, 0x10, 0x04, 0x92, 0x0B, 0x6B, 0x67, 0xC2, 0x03, 0x6A, -0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, -0x6B, 0xC2, 0x2C, 0x10, 0x04, 0x92, 0x47, 0x6B, 0x67, 0xC2, 0x05, 0x6A, 0x9D, 0x67, 0x20, 0xF0, -0x44, 0xC4, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x03, 0x6B, -0x8D, 0xEB, 0x6B, 0xC2, 0x1B, 0x10, 0x04, 0x92, 0x23, 0x6B, 0x67, 0xC2, 0x05, 0x6A, 0x7D, 0x67, -0x20, 0xF0, 0x44, 0xC3, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, -0x03, 0x6B, 0x8D, 0xEB, 0x6B, 0xC2, 0x0A, 0x10, 0x03, 0x6A, 0x9D, 0x67, 0x20, 0xF0, 0x44, 0xC4, -0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6B, 0xC2, 0x00, 0x6A, 0x7D, 0x67, -0x20, 0xF0, 0x4B, 0xC3, 0x5C, 0x10, 0x9D, 0x67, 0x20, 0xF0, 0x58, 0xA4, 0x4C, 0x32, 0x62, 0x67, -0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xA4, 0x48, 0x32, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, -0x44, 0x9A, 0x49, 0xE3, 0x60, 0x9A, 0x5D, 0x67, 0x20, 0xF0, 0xA6, 0xA2, 0x5D, 0x67, 0x20, 0xF0, -0x8B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA4, 0x35, 0x91, 0xE5, 0x88, 0x34, 0x60, 0xF7, 0x00, 0x4A, -0x49, 0xE4, 0x40, 0x9A, 0x6C, 0xEA, 0x05, 0xD2, 0x04, 0x92, 0x4E, 0xA2, 0x03, 0x6B, 0x6C, 0xEA, -0x02, 0x6B, 0x6E, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xA4, 0x01, 0x6B, 0x6E, 0xEA, -0x05, 0x2A, 0x05, 0x93, 0x41, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x05, 0xD2, 0x9D, 0x67, 0x20, 0xF0, -0x58, 0xA4, 0x4C, 0x32, 0x62, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xA4, 0x48, 0x32, 0x4D, 0xE3, -0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x05, 0x93, 0x60, 0xDA, 0x7D, 0x67, -0x20, 0xF0, 0x58, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xA4, 0x48, 0x32, -0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x05, 0xD2, -0x7D, 0x67, 0x20, 0xF0, 0x4B, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xC4, 0x7D, 0x67, -0x20, 0xF0, 0x4B, 0xA3, 0x02, 0x5A, 0x58, 0x67, 0x9E, 0x2A, 0x04, 0x92, 0x4E, 0xA2, 0x52, 0x32, -0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x4A, 0xC3, -0x9D, 0x67, 0x20, 0xF0, 0x58, 0xA4, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, -0x44, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x08, 0xD2, 0x7D, 0x67, 0x20, 0xF0, 0x58, 0xA3, 0x4C, 0x32, -0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x07, 0xD2, -0x00, 0x6A, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xC4, 0x07, 0x92, 0x07, 0x22, 0x20, 0x6A, 0x7D, 0x67, -0x20, 0xF0, 0x45, 0xC3, 0x07, 0x92, 0x06, 0xD2, 0x06, 0x10, 0x00, 0x6A, 0x9D, 0x67, 0x20, 0xF0, -0x45, 0xC4, 0x08, 0x92, 0x06, 0xD2, 0x1F, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x4B, 0xC3, 0x2E, 0x10, -0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xA4, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x62, 0x67, -0x06, 0x92, 0x6C, 0xEA, 0x1C, 0x22, 0x5D, 0x67, 0x20, 0xF0, 0x6B, 0xA2, 0x9D, 0x67, 0x20, 0xF0, -0x45, 0xA4, 0x49, 0xE3, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x4A, 0xA4, -0x1C, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x0C, 0x5A, 0x58, 0x67, 0x18, 0x2A, 0x7D, 0x67, -0x20, 0xF0, 0x48, 0xA3, 0x20, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xC4, 0x11, 0x10, 0x7D, 0x67, -0x20, 0xF0, 0x4B, 0xA3, 0xFF, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xC4, 0x7D, 0x67, 0x20, 0xF0, -0x4B, 0xA3, 0x20, 0x5A, 0x58, 0x67, 0xCC, 0x2A, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, -0x00, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x47, 0xC3, 0x08, 0x92, 0x07, 0x22, 0x00, 0x6A, 0x9D, 0x67, -0x20, 0xF0, 0x45, 0xC4, 0x08, 0x92, 0x06, 0xD2, 0x06, 0x10, 0x20, 0x6A, 0x7D, 0x67, 0x20, 0xF0, -0x45, 0xC3, 0x07, 0x92, 0x06, 0xD2, 0x00, 0x6A, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xC4, 0x2E, 0x10, -0x7D, 0x67, 0x20, 0xF0, 0x4B, 0xA3, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x62, 0x67, -0x06, 0x92, 0x6C, 0xEA, 0x1C, 0x22, 0x5D, 0x67, 0x20, 0xF0, 0x6B, 0xA2, 0x9D, 0x67, 0x20, 0xF0, -0x45, 0xA4, 0x49, 0xE3, 0x7D, 0x67, 0x20, 0xF0, 0x47, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x4A, 0xA4, -0x1C, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x47, 0xA3, 0x0C, 0x5A, 0x58, 0x67, 0x18, 0x2A, 0x7D, 0x67, -0x20, 0xF0, 0x47, 0xA3, 0x20, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x47, 0xC4, 0x11, 0x10, 0x7D, 0x67, -0x20, 0xF0, 0x4B, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xC4, 0x7D, 0x67, 0x20, 0xF0, -0x4B, 0xA3, 0x20, 0x5A, 0x58, 0x67, 0xCC, 0x2A, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, -0x04, 0x92, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xA4, 0x60, 0xC2, 0x04, 0x92, 0x9D, 0x67, 0x20, 0xF0, -0x67, 0xA4, 0x61, 0xC2, 0x7D, 0x67, 0x20, 0xF0, 0x58, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, -0x20, 0x6A, 0x61, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x7F, 0x6A, -0x6C, 0xEA, 0x9D, 0x67, 0x20, 0xF0, 0x49, 0xC4, 0x5D, 0x67, 0x20, 0xF0, 0x69, 0xA2, 0x9D, 0x67, -0x20, 0xF0, 0x48, 0xA4, 0x63, 0xEA, 0x58, 0x67, 0x07, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, -0x9D, 0x67, 0x20, 0xF0, 0x49, 0xC4, 0x0F, 0x10, 0x5D, 0x67, 0x20, 0xF0, 0x69, 0xA2, 0x9D, 0x67, -0x20, 0xF0, 0x47, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0x06, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x47, 0xA3, -0x9D, 0x67, 0x20, 0xF0, 0x49, 0xC4, 0x5D, 0x67, 0x20, 0xF0, 0x98, 0xA2, 0x5D, 0x67, 0x20, 0xF0, -0x69, 0xA2, 0x04, 0x92, 0x4E, 0xA2, 0x4A, 0x32, 0xA2, 0x67, 0x03, 0x6A, 0x4C, 0xED, 0xFF, 0x6A, -0xAC, 0xEA, 0xA3, 0x67, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0x8C, 0x22, 0x04, 0x92, 0x9D, 0x67, -0x20, 0xF0, 0x64, 0xA4, 0x62, 0xC2, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x4A, 0x5A, 0x58, 0x67, -0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x48, 0x6B, -0x8D, 0xEB, 0x70, 0xC2, 0x86, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x40, 0x5A, 0x58, 0x67, -0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x40, 0x6B, -0x8D, 0xEB, 0x70, 0xC2, 0x76, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x36, 0x5A, 0x58, 0x67, -0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x38, 0x6B, -0x8D, 0xEB, 0x70, 0xC2, 0x66, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x2C, 0x5A, 0x58, 0x67, -0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x30, 0x6B, -0x8D, 0xEB, 0x70, 0xC2, 0x56, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x24, 0x5A, 0x58, 0x67, -0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x28, 0x6B, -0x8D, 0xEB, 0x70, 0xC2, 0x46, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x1C, 0x5A, 0x58, 0x67, -0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x20, 0x6B, -0x8D, 0xEB, 0x70, 0xC2, 0x36, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x14, 0x5A, 0x58, 0x67, -0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x18, 0x6B, -0x8D, 0xEB, 0x70, 0xC2, 0x26, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x0C, 0x5A, 0x58, 0x67, -0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x10, 0x6B, -0x8D, 0xEB, 0x70, 0xC2, 0x16, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x04, 0x5A, 0x58, 0x67, -0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x08, 0x6B, -0x8D, 0xEB, 0x70, 0xC2, 0x06, 0x10, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, -0x70, 0xC2, 0x00, 0x18, 0x8D, 0x1E, 0x0D, 0x97, 0x07, 0x63, 0x00, 0xEF, 0x64, 0x67, 0x45, 0x67, -0x9D, 0x67, 0x60, 0xC4, 0x7D, 0x67, 0x44, 0xC3, 0x9D, 0x67, 0x44, 0xA4, 0x20, 0xE8, 0x00, 0x65, -0xFD, 0x63, 0x06, 0xD4, 0x65, 0x67, 0x46, 0x67, 0x9D, 0x67, 0x7C, 0xC4, 0x7D, 0x67, 0x20, 0xF0, -0x40, 0xC3, 0x9D, 0x67, 0x5C, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, -0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x66, 0xF5, -0x00, 0x4B, 0x9D, 0x67, 0x5C, 0xA4, 0x48, 0x32, 0x48, 0x34, 0x89, 0xE2, 0x49, 0xE3, 0x01, 0xD2, -0x30, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x40, 0xF0, 0x1C, 0x4B, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, -0x44, 0x32, 0x48, 0x34, 0x4B, 0xE4, 0x49, 0xE3, 0x02, 0xD2, 0x00, 0x92, 0x4C, 0xAA, 0x05, 0xD2, -0x00, 0x6A, 0x7D, 0x67, 0x4C, 0xC3, 0x15, 0x10, 0x9D, 0x67, 0x4C, 0xA4, 0x48, 0x32, 0x01, 0x93, -0x49, 0xE3, 0x80, 0x9A, 0x7D, 0x67, 0x4C, 0xA3, 0x02, 0x93, 0x49, 0xE3, 0x40, 0xA2, 0x58, 0xEC, -0x12, 0xEB, 0x05, 0x92, 0x69, 0xE2, 0x05, 0xD2, 0x7D, 0x67, 0x4C, 0xA3, 0x01, 0x4A, 0x9D, 0x67, -0x4C, 0xC4, 0x7D, 0x67, 0x4C, 0xA3, 0x05, 0x5A, 0x58, 0x67, 0xE6, 0x2A, 0x02, 0x92, 0x05, 0x4A, -0x40, 0xA2, 0x62, 0x67, 0x06, 0x92, 0x58, 0xEB, 0x12, 0xEA, 0x04, 0xD2, 0x05, 0x93, 0x04, 0x92, -0x63, 0xEA, 0x58, 0x67, 0x04, 0x22, 0x05, 0x93, 0x04, 0x92, 0x4B, 0xE3, 0x01, 0x10, 0x00, 0x6A, -0x05, 0xD2, 0x05, 0x93, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x00, 0x92, 0x6C, 0xCA, 0x05, 0x92, -0x03, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0x66, 0xF0, 0x18, 0x4A, 0x00, 0xD2, -0x30, 0xF0, 0x20, 0x6A, 0x66, 0xF0, 0x0F, 0x4A, 0x01, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, -0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x10, 0x6A, 0x6C, 0xEA, 0x53, 0x33, -0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, -0x01, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0xA4, 0xA2, 0x02, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, -0x64, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, -0x62, 0x67, 0x20, 0x6A, 0x6C, 0xEA, 0x57, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, -0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x01, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0x68, 0x33, -0xA4, 0xA2, 0x05, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x64, 0xC2, 0x30, 0xF0, 0x20, 0x6A, -0xA1, 0xF3, 0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x40, 0x6A, 0x6C, 0xEA, -0x5B, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, -0x4C, 0xEC, 0x01, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0x64, 0x33, 0xA4, 0xA2, 0x03, 0x6C, 0x8B, 0xEC, -0xAC, 0xEC, 0x8D, 0xEB, 0x64, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xF3, 0x63, 0x19, 0x62, -0x30, 0xF0, 0x20, 0x6A, 0x66, 0xF0, 0x0F, 0x4A, 0x04, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x66, 0xF0, -0x18, 0x4A, 0x05, 0xD2, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xC3, 0xC0, 0xF5, 0x03, 0x10, -0x9D, 0x67, 0x40, 0xF0, 0x4B, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, -0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, 0x06, 0xD2, 0xBD, 0x67, 0x40, 0xF0, 0x4B, 0xA5, 0x82, 0x67, -0x00, 0x18, 0xDC, 0x0A, 0xA0, 0xF5, 0x03, 0x22, 0x06, 0x92, 0x4E, 0xA2, 0x80, 0x6B, 0x6C, 0xEA, -0x80, 0xF5, 0x1F, 0x2A, 0x5D, 0x67, 0x40, 0xF0, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF7, -0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x40, 0x9A, 0x0E, 0xD2, 0x7D, 0x67, -0x40, 0xF0, 0x4B, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x4C, 0x9A, -0x49, 0xE3, 0x40, 0xA2, 0x9D, 0x67, 0x40, 0xF0, 0x4A, 0xC4, 0xBD, 0x67, 0x40, 0xF0, 0x6A, 0xA5, -0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x40, 0xF0, 0x49, 0xC3, 0x9D, 0x67, 0x40, 0xF0, 0x6A, 0xA4, -0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0xBD, 0x67, 0x40, 0xF0, 0x48, 0xC5, 0x06, 0x92, 0x40, 0xA2, -0x7D, 0x67, 0x20, 0xF0, 0x47, 0xC3, 0x06, 0x92, 0x4E, 0xA2, 0x4A, 0x32, 0x62, 0x67, 0x03, 0x6A, -0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x20, 0xF0, 0x46, 0xC4, 0x06, 0x92, 0x4F, 0xA2, -0x40, 0x6B, 0x6C, 0xEA, 0x00, 0xF4, 0x16, 0x2A, 0x0E, 0x92, 0x65, 0x5A, 0x58, 0x67, 0x1C, 0x2A, -0x06, 0x92, 0x52, 0xA2, 0x19, 0x22, 0x06, 0x92, 0x52, 0xA2, 0x6F, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, -0x06, 0x92, 0x72, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF0, 0x04, 0x4A, 0x82, 0x67, 0x00, 0x18, -0x8B, 0x19, 0x06, 0x92, 0x52, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF0, 0x10, 0x4B, 0x83, 0x67, -0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0xF9, 0x13, 0x06, 0x92, 0x00, 0x6B, 0x72, 0xC2, 0x7D, 0x67, -0x40, 0xF0, 0x4B, 0xA3, 0x48, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x66, 0xF5, -0x00, 0x4A, 0x49, 0xE3, 0x13, 0x03, 0x83, 0x67, 0xA2, 0x67, 0x14, 0x6E, 0x00, 0x18, 0xD7, 0x03, -0x9D, 0x67, 0x40, 0xF0, 0x6B, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, -0xC4, 0xF0, 0x58, 0xA2, 0xBD, 0x67, 0x5A, 0xCD, 0x14, 0x93, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, -0x15, 0x94, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x4D, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, -0x16, 0x94, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x4D, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, -0x17, 0x94, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x49, 0xE3, 0x7D, 0x67, 0x58, 0xCB, 0x13, 0x93, -0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x9D, 0x67, 0x58, 0xAC, 0x49, 0xE3, 0xBD, 0x67, 0x59, 0xCD, -0x14, 0x93, 0x15, 0x92, 0x44, 0x32, 0x4D, 0xE3, 0x16, 0x92, 0x44, 0x34, 0x16, 0x92, 0x49, 0xE4, -0x4D, 0xE3, 0x17, 0x92, 0x48, 0x32, 0x49, 0xE3, 0x0B, 0xD2, 0x06, 0x92, 0x5C, 0xA2, 0x05, 0x5A, -0x58, 0x67, 0xE0, 0xF4, 0x00, 0x22, 0x5D, 0x67, 0x40, 0xF0, 0x69, 0xA2, 0x9D, 0x67, 0x20, 0xF0, -0x47, 0xA4, 0x63, 0xEA, 0x58, 0x67, 0x19, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x47, 0xA3, 0x9D, 0x67, -0x40, 0xF0, 0x49, 0xC4, 0xBD, 0x67, 0x40, 0xF0, 0x48, 0xA5, 0x09, 0x22, 0x5D, 0x67, 0x20, 0xF0, -0x67, 0xA2, 0x80, 0x6A, 0x4B, 0xEA, 0x4D, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x03, 0x10, 0x7D, 0x67, -0x20, 0xF0, 0x47, 0xA3, 0x9D, 0x67, 0x40, 0xF0, 0x4A, 0xC4, 0x06, 0x92, 0x7A, 0xA2, 0xBD, 0x67, -0x40, 0xF0, 0x89, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF3, 0x08, 0x4A, 0x49, 0xE4, 0x40, 0xA2, -0x43, 0xEB, 0x58, 0x67, 0x0E, 0x2A, 0x5D, 0x67, 0x40, 0xF0, 0x69, 0xA2, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x63, 0xF3, 0x44, 0xA2, 0x6E, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, -0x0A, 0x10, 0x9D, 0x67, 0x40, 0xF0, 0x69, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x49, 0xE3, 0x63, 0xF3, 0x44, 0xA2, 0xBD, 0x67, 0x20, 0xF0, 0x48, 0xC5, 0x7D, 0x67, 0x40, 0xF0, -0x48, 0xA3, 0x07, 0x22, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x02, 0x4A, 0xBD, 0x67, 0x20, 0xF0, -0x48, 0xC5, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0xFF, 0x6B, 0x4C, 0xEB, 0x1C, 0x5B, 0x78, 0x67, -0x01, 0x2B, 0x1B, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xC3, 0x9D, 0x67, 0x40, 0xF0, 0x69, 0xA4, -0xBD, 0x67, 0x20, 0xF0, 0x48, 0xA5, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x47, 0x2A, 0x7D, 0x67, -0x20, 0xF0, 0x48, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x40, 0xF0, 0x1C, 0x4B, 0x9D, 0x67, -0x20, 0xF0, 0x48, 0xA4, 0x44, 0x32, 0x48, 0x34, 0x4B, 0xE4, 0x49, 0xE3, 0x11, 0xD2, 0xBD, 0x67, -0x40, 0xF0, 0x8B, 0xA5, 0x7D, 0x67, 0x5A, 0xAB, 0x13, 0x05, 0x0E, 0x93, 0xC3, 0x67, 0xE2, 0x67, -0x00, 0x18, 0x38, 0x24, 0x9D, 0x67, 0x20, 0xF0, 0x45, 0xC4, 0x06, 0x92, 0x56, 0xA2, 0x46, 0x33, -0xFF, 0x6A, 0x4C, 0xEB, 0xBD, 0x67, 0x20, 0xF0, 0x45, 0xA5, 0x46, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, -0x4D, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x06, 0x92, 0x76, 0xC2, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, -0x03, 0x5A, 0x58, 0x67, 0x07, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x5C, 0x9A, 0x06, 0x93, -0x76, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x5A, 0xAB, 0x03, 0x5A, 0x58, 0x67, 0x09, 0x2A, 0x7D, 0x67, -0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, 0x01, 0x6E, 0x00, 0x18, 0x2F, 0x27, 0xED, 0x12, -0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, -0x20, 0x6A, 0x6C, 0xEA, 0x24, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF0, 0x1C, 0x4A, 0x82, 0x67, -0x00, 0x18, 0x8B, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x40, 0x9A, 0x40, 0xA2, 0x9D, 0x67, -0x40, 0xF0, 0x4A, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x44, 0x9A, 0x40, 0xA2, 0xBD, 0x67, -0x5C, 0xC5, 0x5D, 0x67, 0x40, 0xF0, 0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x6A, 0xA5, 0xBD, 0x67, -0x5C, 0xA5, 0xA3, 0x67, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0x8C, 0x22, 0xBE, 0x12, 0x0E, 0x92, -0x19, 0x5A, 0x58, 0x67, 0x1F, 0x22, 0x0E, 0x92, 0x1D, 0x22, 0x06, 0x92, 0x4B, 0xA2, 0x5A, 0x33, -0xFF, 0x6A, 0x6C, 0xEA, 0x03, 0x52, 0x58, 0x67, 0x15, 0x22, 0x06, 0x92, 0x4B, 0xA2, 0x5A, 0x33, -0xFF, 0x6A, 0x6C, 0xEA, 0x61, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, -0xFF, 0x6A, 0x4C, 0xEB, 0x06, 0x92, 0x78, 0x33, 0xAB, 0xA2, 0x3F, 0x6C, 0xAC, 0xEC, 0x8D, 0xEB, -0x6B, 0xC2, 0x05, 0x10, 0x06, 0x92, 0x8B, 0xA2, 0x3F, 0x6B, 0x8C, 0xEB, 0x6B, 0xC2, 0x06, 0x92, -0x4B, 0xA2, 0xC0, 0x6B, 0x6C, 0xEA, 0x80, 0x6B, 0x6E, 0xEA, 0xE0, 0xF0, 0x10, 0x2A, 0x30, 0xF0, -0x20, 0x6A, 0xC1, 0xF0, 0x04, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x9D, 0x67, 0x40, 0xF0, -0x4B, 0xA4, 0x03, 0x5A, 0x58, 0x67, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x48, 0x9A, -0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF3, 0x68, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x81, 0x43, -0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x17, 0x93, 0x16, 0x92, 0x4D, 0xE3, 0x15, 0x92, 0x4D, 0xE3, -0x14, 0x92, 0x4D, 0xE3, 0x0E, 0x92, 0x4A, 0x32, 0x63, 0xEA, 0x58, 0x67, 0x02, 0x2A, 0x17, 0x92, -0x33, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF0, 0x14, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, -0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x4C, 0x9A, 0x0E, 0x94, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, -0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x50, 0x9A, 0x17, 0x94, 0xFF, 0x6B, 0x6C, 0xEC, 0x16, 0x95, -0xFF, 0x6B, 0xAC, 0xEB, 0x71, 0xE4, 0xFF, 0x6B, 0x6C, 0xEC, 0x15, 0x95, 0xFF, 0x6B, 0xAC, 0xEB, -0x71, 0xE4, 0xFF, 0x6B, 0x6C, 0xEC, 0x14, 0x95, 0xFF, 0x6B, 0xAC, 0xEB, 0x71, 0xE4, 0xFF, 0x6B, -0x8C, 0xEB, 0x60, 0xC2, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, 0x01, 0x6E, -0x00, 0x18, 0x2F, 0x27, 0x00, 0x65, 0x31, 0x12, 0x9D, 0x67, 0x5A, 0xAC, 0x10, 0x22, 0x30, 0xF0, -0x20, 0x6A, 0xE1, 0xF0, 0x00, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, 0xBD, 0x67, 0x40, 0xF0, -0x4B, 0xA5, 0x82, 0x67, 0x01, 0x6D, 0x01, 0x6E, 0x00, 0x18, 0x2F, 0x27, 0x1E, 0x12, 0x13, 0x93, -0x0E, 0x92, 0x43, 0xEB, 0x58, 0x67, 0x00, 0xF2, 0x17, 0x2A, 0x01, 0x6A, 0x7D, 0x67, 0x20, 0xF0, -0x44, 0xC3, 0x06, 0x92, 0x6B, 0xA2, 0x07, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x02, 0x52, -0x58, 0x67, 0x51, 0x2A, 0x06, 0x92, 0x47, 0xA2, 0x9D, 0x67, 0x40, 0xF0, 0x69, 0xA4, 0x43, 0xEB, -0x58, 0x67, 0x16, 0x2A, 0x06, 0x92, 0x47, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF0, 0x0C, 0x4B, -0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF0, 0x1C, 0x4A, -0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x00, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, 0x33, 0x10, -0x06, 0x92, 0x5A, 0xA2, 0x32, 0x5A, 0x58, 0x67, 0x15, 0x22, 0x5D, 0x67, 0x40, 0xF0, 0x69, 0xA2, -0x06, 0x92, 0x47, 0xA2, 0xFE, 0x4A, 0x42, 0xEB, 0x58, 0x67, 0x0C, 0x2A, 0x30, 0xF0, 0x20, 0x6A, -0x01, 0xF1, 0x0C, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x00, 0x6A, 0x7D, 0x67, 0x20, 0xF0, -0x44, 0xC3, 0x19, 0x10, 0x06, 0x92, 0x5A, 0xA2, 0x28, 0x5A, 0x58, 0x67, 0x14, 0x22, 0x5D, 0x67, -0x40, 0xF0, 0x69, 0xA2, 0x06, 0x92, 0x47, 0xA2, 0xFC, 0x4A, 0x42, 0xEB, 0x58, 0x67, 0x0B, 0x2A, -0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF1, 0x1C, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x00, 0x6A, -0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x44, 0xA4, 0x01, 0x6D, 0xAE, 0xEA, -0x0E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF1, 0x0C, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, -0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, 0x00, 0x18, 0xFE, 0x27, 0x30, 0xF0, -0x20, 0x6A, 0x21, 0xF1, 0x14, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x9E, 0x11, 0x06, 0x92, -0x4F, 0xA2, 0x18, 0x6B, 0x6C, 0xEA, 0x10, 0x6C, 0x8E, 0xEA, 0x2F, 0x2A, 0x06, 0x92, 0x45, 0xA2, -0xBD, 0x67, 0x40, 0xF0, 0x4A, 0xC5, 0x06, 0x92, 0x4F, 0xA2, 0x4E, 0x32, 0x62, 0x67, 0x03, 0x6A, -0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x6F, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, -0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x06, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0x6C, 0x33, -0xAF, 0xA2, 0x19, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0x5D, 0x67, 0x40, 0xF0, -0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x6A, 0xA5, 0xBD, 0x67, 0x20, 0xF0, 0x46, 0xA5, 0xA3, 0x67, -0x01, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0x8C, 0x22, 0x68, 0x11, 0x06, 0x92, 0x4F, 0xA2, 0x18, 0x6B, -0x6C, 0xEA, 0x08, 0x6B, 0x6E, 0xEA, 0x2F, 0x2A, 0x06, 0x92, 0x46, 0xA2, 0x9D, 0x67, 0x40, 0xF0, -0x4A, 0xC4, 0x06, 0x92, 0x4F, 0xA2, 0x4E, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, -0x6C, 0xEA, 0x6F, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, -0x83, 0x67, 0x4C, 0xEC, 0x06, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0x6C, 0x33, 0xAF, 0xA2, 0x19, 0x6C, -0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0xBD, 0x67, 0x40, 0xF0, 0x8B, 0xA5, 0x5D, 0x67, -0x40, 0xF0, 0x6A, 0xA2, 0xBD, 0x67, 0x20, 0xF0, 0x46, 0xA5, 0xA3, 0x67, 0x01, 0x6E, 0xE2, 0x67, -0x00, 0x18, 0x8C, 0x22, 0x32, 0x11, 0x06, 0x92, 0x4C, 0xAA, 0x0F, 0xD2, 0x00, 0x6A, 0x7D, 0x67, -0x5D, 0xC3, 0x17, 0x10, 0x9D, 0x67, 0x5D, 0xA4, 0x48, 0x32, 0x04, 0x03, 0x49, 0xE3, 0x8F, 0x9A, -0xBD, 0x67, 0x5D, 0xA5, 0x11, 0x93, 0x49, 0xE3, 0x40, 0xA2, 0x58, 0xEC, 0x12, 0xEA, 0x10, 0xD2, -0x0F, 0x93, 0x10, 0x92, 0x49, 0xE3, 0x0F, 0xD2, 0x7D, 0x67, 0x5D, 0xA3, 0x01, 0x4A, 0x9D, 0x67, -0x5D, 0xC4, 0xBD, 0x67, 0x5D, 0xA5, 0x05, 0x5A, 0x58, 0x67, 0xE4, 0x2A, 0x11, 0x92, 0x05, 0x4A, -0x40, 0xA2, 0x62, 0x67, 0x0E, 0x92, 0x58, 0xEB, 0x12, 0xEA, 0x08, 0xD2, 0x0F, 0x93, 0x08, 0x92, -0x63, 0xEA, 0x58, 0x67, 0x05, 0x22, 0x0F, 0x93, 0x08, 0x92, 0x4B, 0xE3, 0x0F, 0xD2, 0x02, 0x10, -0x00, 0x6A, 0x0F, 0xD2, 0x0F, 0x93, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x06, 0x92, 0x6C, 0xCA, -0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, -0x10, 0x6A, 0x6C, 0xEA, 0x7B, 0x22, 0x06, 0x92, 0x56, 0xA2, 0x17, 0x5A, 0x58, 0x67, 0x0F, 0x2A, -0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, 0x01, 0x6E, 0x00, 0x18, 0x2F, 0x27, -0x06, 0x92, 0x8B, 0xA2, 0x39, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6B, 0xC2, 0xD6, 0x10, 0x0E, 0x92, -0x65, 0x5A, 0x58, 0x67, 0x00, 0xF2, 0x17, 0x2A, 0x06, 0x92, 0x76, 0xA2, 0x5D, 0x67, 0x40, 0xF0, -0x89, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x03, 0xF4, 0x4C, 0xA2, -0x63, 0xEA, 0x58, 0x67, 0x0F, 0x22, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, -0x00, 0x6E, 0x00, 0x18, 0x2F, 0x27, 0x06, 0x92, 0x8B, 0xA2, 0x39, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, -0x6B, 0xC2, 0xB3, 0x10, 0x06, 0x92, 0x76, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x89, 0xA5, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0xA3, 0xF3, 0x58, 0xA2, 0x43, 0xEB, 0x58, 0x67, -0xA0, 0xF0, 0x03, 0x22, 0x06, 0x92, 0x4B, 0xA2, 0x4E, 0x32, 0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, -0xFF, 0x6A, 0x6C, 0xEA, 0x61, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, -0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x06, 0x92, 0x07, 0x6B, 0x8C, 0xEB, 0x6C, 0x33, 0xAB, 0xA2, -0x39, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6B, 0xC2, 0x06, 0x92, 0x4B, 0xA2, 0x4E, 0x32, -0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x05, 0x52, 0x58, 0x67, 0x7D, 0x2A, -0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x00, 0x6D, 0x00, 0x18, 0xFE, 0x27, 0x06, 0x92, -0x8B, 0xA2, 0x39, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6B, 0xC2, 0x6F, 0x10, 0x9D, 0x67, 0x40, 0xF0, -0x69, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0x64, 0x33, 0x80, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x40, 0xAA, -0x62, 0x67, 0x0F, 0x92, 0x43, 0xEB, 0x58, 0x67, 0x0F, 0x22, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, -0x82, 0x67, 0x00, 0x6D, 0x00, 0x18, 0xFE, 0x27, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF1, 0x00, 0x4A, -0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x51, 0x10, 0x9D, 0x67, 0x40, 0xF0, 0x69, 0xA4, 0x30, 0xF0, -0x20, 0x6A, 0x64, 0x33, 0x40, 0xF4, 0x04, 0x4A, 0x49, 0xE3, 0x40, 0xAA, 0x62, 0x67, 0x0F, 0x92, -0x63, 0xEA, 0x58, 0x67, 0x05, 0x2A, 0x06, 0x92, 0x56, 0xA2, 0x17, 0x5A, 0x58, 0x67, 0x32, 0x2A, -0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, 0x00, 0x6E, 0x00, 0x18, 0x2F, 0x27, -0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF1, 0x08, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x06, 0x92, -0x56, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0x41, 0xF1, 0x14, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, -0x8B, 0x19, 0x0F, 0x92, 0x4E, 0x33, 0xBD, 0x67, 0x40, 0xF0, 0x89, 0xA5, 0x30, 0xF0, 0x20, 0x6A, -0x84, 0x34, 0x40, 0xF4, 0x04, 0x4A, 0x49, 0xE4, 0x40, 0xAA, 0x4E, 0x34, 0xFF, 0xF7, 0x1F, 0x6A, -0x8C, 0xEA, 0x30, 0xF0, 0x20, 0x6C, 0x61, 0xF1, 0x00, 0x4C, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, -0x8B, 0x19, 0x0B, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF1, 0x14, 0x4A, 0x82, 0x67, 0x00, 0x18, -0x8B, 0x19, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, 0x00, 0x18, 0x8D, 0x1E, 0x30, 0xF0, -0x20, 0x6A, 0x81, 0xF1, 0x00, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x7D, 0x67, 0x40, 0xF0, -0x4B, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x2F, 0x31, 0x9D, 0x67, 0x40, 0xF0, 0x6B, 0xA4, 0x30, 0xF0, -0x20, 0x6A, 0xA2, 0xF6, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x40, 0xAA, -0x62, 0x67, 0xBD, 0x67, 0x5A, 0xAD, 0xFF, 0xF7, 0x1F, 0x6C, 0x4B, 0xE4, 0x62, 0xEA, 0x58, 0x67, -0x1F, 0x2A, 0x5D, 0x67, 0x40, 0xF0, 0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x6B, 0xA5, 0x30, 0xF0, -0x20, 0x6A, 0xA2, 0xF6, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x60, 0xAA, -0xBD, 0x67, 0x5A, 0xAD, 0x4D, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, -0xA2, 0xF6, 0x0C, 0x4C, 0x84, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x60, 0xCA, 0x0E, 0x10, -0x5D, 0x67, 0x40, 0xF0, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF6, 0x0C, 0x4B, 0x64, 0x33, -0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xCA, 0x9D, 0x67, 0x40, 0xF0, -0x6B, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF6, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, -0x49, 0xE3, 0x40, 0xAA, 0x62, 0x67, 0xBD, 0x67, 0x59, 0xAD, 0xFF, 0xF7, 0x1F, 0x6C, 0x4B, 0xE4, -0x62, 0xEA, 0x58, 0x67, 0x1F, 0x2A, 0x5D, 0x67, 0x40, 0xF0, 0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, -0x6B, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF6, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, -0x49, 0xE3, 0x60, 0xAA, 0xBD, 0x67, 0x59, 0xAD, 0x4D, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, -0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF6, 0x0C, 0x4C, 0x84, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, -0x60, 0xCA, 0x0E, 0x10, 0x5D, 0x67, 0x40, 0xF0, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF6, -0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xCA, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x45, 0xF6, 0x78, 0x9A, 0x9D, 0x67, 0x58, 0xAC, -0x4F, 0xEA, 0x63, 0xEA, 0x58, 0x67, 0x10, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x45, 0xF6, 0x78, 0x9A, 0x9D, 0x67, 0x58, 0xAC, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0x45, 0xF6, 0x78, 0xDA, 0x08, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x01, 0x6B, 0x6B, 0xEB, 0x45, 0xF6, 0x78, 0xDA, 0xBD, 0x67, 0x40, 0xF0, 0x6B, 0xA5, 0x30, 0xF0, -0x20, 0x6A, 0x22, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x42, 0xAA, -0x62, 0x67, 0xFF, 0xF7, 0x1F, 0x6C, 0x0B, 0x92, 0x4B, 0xE4, 0x63, 0xEA, 0x58, 0x67, 0x21, 0x2A, -0x5D, 0x67, 0x40, 0xF0, 0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x6B, 0xA5, 0x30, 0xF0, 0x20, 0x6A, -0x22, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x62, 0xAA, 0x0B, 0x95, -0xFF, 0xF7, 0x1F, 0x6A, 0xAC, 0xEA, 0x4D, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, -0x20, 0x6A, 0x22, 0xF7, 0x0C, 0x4C, 0x84, 0x34, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x62, 0xCA, -0x0E, 0x10, 0x5D, 0x67, 0x40, 0xF0, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF7, 0x0C, 0x4B, -0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x01, 0x6B, 0x6B, 0xEB, 0x62, 0xCA, 0x9D, 0x67, -0x40, 0xF0, 0x6B, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, -0x08, 0x4A, 0x49, 0xE3, 0x42, 0xAA, 0x62, 0x67, 0xFF, 0xF7, 0x1F, 0x6C, 0x0E, 0x92, 0x4B, 0xE4, -0x63, 0xEA, 0x58, 0x67, 0x21, 0x2A, 0x5D, 0x67, 0x40, 0xF0, 0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, -0x6B, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, -0x49, 0xE3, 0x62, 0xAA, 0x0E, 0x95, 0xFF, 0xF7, 0x1F, 0x6A, 0xAC, 0xEA, 0x4D, 0xE3, 0xFF, 0xF7, -0x1F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF7, 0x0C, 0x4C, 0x84, 0x34, 0x02, 0xF4, -0x08, 0x4A, 0x49, 0xE4, 0x62, 0xCA, 0x18, 0x10, 0x5D, 0x67, 0x40, 0xF0, 0x6B, 0xA2, 0x30, 0xF0, -0x20, 0x6A, 0xA2, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x01, 0x6B, -0x6B, 0xEB, 0x62, 0xCA, 0x09, 0x10, 0x06, 0x92, 0x00, 0x6B, 0x7C, 0xC2, 0x05, 0x10, 0x00, 0x65, -0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x01, 0x4A, -0x9D, 0x67, 0x40, 0xF0, 0x4B, 0xC4, 0xBD, 0x67, 0x40, 0xF0, 0x4B, 0x85, 0x00, 0x52, 0x58, 0x67, -0x3F, 0xF2, 0x16, 0x22, 0x19, 0x97, 0x0D, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, -0x44, 0x67, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x54, 0xC4, 0x30, 0xF0, -0x20, 0x6A, 0x66, 0xF0, 0x18, 0x4A, 0x04, 0xD2, 0x00, 0x6A, 0x7D, 0x67, 0x55, 0xC3, 0x15, 0x10, -0x9D, 0x67, 0x20, 0xF0, 0x60, 0xA4, 0x9D, 0x67, 0x55, 0xA4, 0x67, 0xEA, 0x01, 0x6A, 0x4C, 0xEB, -0xFF, 0x6A, 0x6C, 0xEA, 0x05, 0x22, 0x7D, 0x67, 0x54, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x54, 0xC4, -0x7D, 0x67, 0x55, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x55, 0xC4, 0x7D, 0x67, 0x55, 0xA3, 0x04, 0x5A, -0x58, 0x67, 0xE6, 0x2A, 0x7D, 0x67, 0x54, 0xA3, 0x01, 0x6C, 0x8E, 0xEA, 0x56, 0x2A, 0x7D, 0x67, -0x20, 0xF0, 0x40, 0xA3, 0x21, 0xF1, 0x1C, 0x6C, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF3, 0x74, 0x9B, -0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xED, 0x14, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x01, 0x6B, -0x6E, 0xEA, 0x0C, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x58, 0x9A, -0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x28, 0x13, 0x9D, 0x67, 0x20, 0xF0, -0x40, 0xA4, 0x02, 0x6B, 0x6E, 0xEA, 0x0C, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, -0xC1, 0xF3, 0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x16, 0x13, -0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x04, 0x6B, 0x6E, 0xEA, 0x0C, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, -0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, -0xED, 0x14, 0x04, 0x13, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x08, 0x6B, 0x6E, 0xEA, 0xE0, 0xF2, -0x1D, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, 0x83, 0x67, -0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0xF1, 0x12, 0x9D, 0x67, 0x54, 0xA4, 0x02, 0x6B, -0x6E, 0xEA, 0x20, 0xF1, 0x12, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x21, 0xF1, 0x1C, 0x6C, -0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF3, 0x74, 0x9B, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xED, 0x14, -0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x41, 0xF1, 0x00, 0x6B, 0x83, 0x67, 0xF0, 0x6D, 0xC2, 0x67, -0x00, 0x18, 0xED, 0x14, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x03, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, -0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, -0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, -0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, -0x00, 0xF3, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, -0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, -0xA5, 0x12, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x05, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, 0x21, 0xF1, -0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, -0x00, 0x18, 0xED, 0x14, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, -0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x00, 0xF3, -0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, -0x06, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x76, 0x12, -0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x09, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, -0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, -0xED, 0x14, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, 0x83, 0x67, -0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x00, 0xF3, 0x00, 0x6A, -0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, -0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x47, 0x12, 0x9D, 0x67, -0x20, 0xF0, 0x40, 0xA4, 0x06, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, -0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, -0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x83, 0x67, 0xA2, 0x67, -0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, -0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x06, 0xF0, 0x00, 0x6A, -0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x18, 0x12, 0x9D, 0x67, 0x20, 0xF0, -0x40, 0xA4, 0x0A, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, -0xC1, 0xF3, 0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x21, 0xF1, -0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, -0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, -0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, 0x00, 0x6A, 0x83, 0x67, -0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0xE9, 0x11, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, -0x0C, 0x6B, 0x6E, 0xEA, 0xE0, 0xF1, 0x02, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, -0xE1, 0xF3, 0x40, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x21, 0xF1, -0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, -0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x06, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, -0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, 0x00, 0x6A, 0x83, 0x67, -0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0xB9, 0x11, 0x9D, 0x67, 0x54, 0xA4, 0x03, 0x6B, -0x6E, 0xEA, 0xA0, 0xF1, 0x13, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x21, 0xF1, 0x1C, 0x6C, -0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF3, 0x74, 0x9B, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xED, 0x14, -0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x41, 0xF1, 0x00, 0x6B, 0x83, 0x67, 0xF0, 0x6D, 0xC2, 0x67, -0x00, 0x18, 0xED, 0x14, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x41, 0xF1, 0x00, 0x6C, 0x30, 0xF0, -0x20, 0x6B, 0xE1, 0xF3, 0x68, 0x9B, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xED, 0x14, 0x7D, 0x67, -0x20, 0xF0, 0x40, 0xA3, 0x07, 0x6C, 0x8E, 0xEA, 0x5E, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, -0x20, 0x6A, 0xC1, 0xF3, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, -0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, -0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, -0x40, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, -0x00, 0xF3, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, -0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, -0x41, 0xF1, 0x00, 0x6B, 0x06, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, -0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x4C, 0x9A, 0x83, 0x67, -0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, -0xE1, 0xF3, 0x50, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, -0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, -0x00, 0x18, 0xED, 0x14, 0x2B, 0x11, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x0B, 0x6C, 0x8E, 0xEA, -0x5E, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x58, 0x9A, 0x83, 0x67, -0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, -0xC1, 0xF3, 0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x21, 0xF1, -0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, -0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x00, 0xF3, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, -0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, -0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, 0x00, 0x6A, -0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, -0x20, 0x6A, 0xE1, 0xF3, 0x4C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, -0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x50, 0x9A, 0x83, 0x67, 0xA2, 0x67, -0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, -0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xED, 0x14, 0xC7, 0x10, 0x7D, 0x67, -0x20, 0xF0, 0x40, 0xA3, 0x0D, 0x6C, 0x8E, 0xEA, 0x5E, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, -0x20, 0x6A, 0xC1, 0xF3, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, -0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x83, 0x67, 0xA2, 0x67, -0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, -0x44, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, -0x00, 0xF3, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, -0x00, 0x6B, 0x06, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, -0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, -0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x4C, 0x9A, 0x83, 0x67, -0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, -0xC1, 0xF3, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, -0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, -0x00, 0x18, 0xED, 0x14, 0x63, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x0E, 0x6C, 0x8E, 0xEA, -0x5D, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x83, 0x67, -0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, -0xE1, 0xF3, 0x40, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x21, 0xF1, -0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, -0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, -0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x06, 0xF0, 0x00, 0x6A, 0x83, 0x67, -0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, 0x00, 0x6A, -0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, -0x20, 0x6A, 0xE1, 0xF3, 0x50, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xED, 0x14, -0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, -0x01, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, -0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xED, 0x14, 0x07, 0x97, 0x04, 0x63, -0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x68, 0xC4, 0x7D, 0x67, -0x4C, 0xC3, 0x9D, 0x67, 0x4C, 0xA4, 0x2D, 0x2A, 0x7D, 0x67, 0x48, 0xA3, 0x0C, 0x5A, 0x58, 0x67, -0x09, 0x2A, 0x7D, 0x67, 0x48, 0xA3, 0x14, 0x5A, 0x58, 0x67, 0x04, 0x22, 0x01, 0x6A, 0x7D, 0x67, -0x42, 0xC3, 0x1B, 0x10, 0x9D, 0x67, 0x48, 0xA4, 0x14, 0x5A, 0x58, 0x67, 0x09, 0x2A, 0x7D, 0x67, -0x48, 0xA3, 0x1C, 0x5A, 0x58, 0x67, 0x04, 0x22, 0x02, 0x6A, 0x7D, 0x67, 0x42, 0xC3, 0x0D, 0x10, -0x9D, 0x67, 0x48, 0xA4, 0x1C, 0x5A, 0x58, 0x67, 0x08, 0x2A, 0x7D, 0x67, 0x48, 0xA3, 0x24, 0x5A, -0x58, 0x67, 0x03, 0x22, 0x03, 0x6A, 0x7D, 0x67, 0x42, 0xC3, 0x07, 0x6A, 0x9D, 0x67, 0x40, 0xC4, -0x29, 0x10, 0x7D, 0x67, 0x48, 0xA3, 0x2C, 0x5A, 0x58, 0x67, 0x09, 0x2A, 0x7D, 0x67, 0x48, 0xA3, -0x36, 0x5A, 0x58, 0x67, 0x04, 0x22, 0x01, 0x6A, 0x7D, 0x67, 0x42, 0xC3, 0x1B, 0x10, 0x9D, 0x67, -0x48, 0xA4, 0x36, 0x5A, 0x58, 0x67, 0x09, 0x2A, 0x7D, 0x67, 0x48, 0xA3, 0x40, 0x5A, 0x58, 0x67, -0x04, 0x22, 0x02, 0x6A, 0x7D, 0x67, 0x42, 0xC3, 0x0D, 0x10, 0x9D, 0x67, 0x48, 0xA4, 0x40, 0x5A, -0x58, 0x67, 0x08, 0x2A, 0x7D, 0x67, 0x48, 0xA3, 0x4A, 0x5A, 0x58, 0x67, 0x03, 0x22, 0x03, 0x6A, -0x7D, 0x67, 0x42, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x44, 0xA2, -0x03, 0x6C, 0x8E, 0xEA, 0x4E, 0x2A, 0x7D, 0x67, 0x42, 0xA3, 0x03, 0x6C, 0x8E, 0xEA, 0x05, 0x2A, -0x7D, 0x67, 0x48, 0xA3, 0x9D, 0x67, 0x41, 0xC4, 0x6F, 0x10, 0x7D, 0x67, 0x42, 0xA3, 0x02, 0x6C, -0x8E, 0xEA, 0x1D, 0x2A, 0x7D, 0x67, 0x4C, 0xA3, 0x0D, 0x2A, 0x9D, 0x67, 0x48, 0xA4, 0x68, 0x42, -0xF4, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, -0x41, 0xC3, 0x5A, 0x10, 0x9D, 0x67, 0x48, 0xA4, 0x68, 0x42, 0xD2, 0x4B, 0x30, 0xF0, 0x20, 0x6A, -0x20, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x41, 0xC3, 0x4D, 0x10, 0x9D, 0x67, -0x42, 0xA4, 0x01, 0x6B, 0x6E, 0xEA, 0x48, 0x2A, 0x9D, 0x67, 0x4C, 0xA4, 0x0D, 0x2A, 0x7D, 0x67, -0x48, 0xA3, 0x68, 0x42, 0xFC, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF3, 0x14, 0x4A, 0x49, 0xE3, -0x40, 0xA2, 0x9D, 0x67, 0x41, 0xC4, 0x38, 0x10, 0x7D, 0x67, 0x48, 0xA3, 0x68, 0x42, 0xDC, 0x4B, -0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF3, 0x10, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x9D, 0x67, 0x41, 0xC4, -0x2B, 0x10, 0x7D, 0x67, 0x42, 0xA3, 0x02, 0x6C, 0x8E, 0xEA, 0x05, 0x2A, 0x7D, 0x67, 0x48, 0xA3, -0x9D, 0x67, 0x41, 0xC4, 0x21, 0x10, 0x7D, 0x67, 0x42, 0xA3, 0x01, 0x6C, 0x8E, 0xEA, 0x1C, 0x2A, -0x7D, 0x67, 0x4C, 0xA3, 0x0D, 0x2A, 0x9D, 0x67, 0x48, 0xA4, 0x68, 0x42, 0xFC, 0x4B, 0x30, 0xF0, -0x20, 0x6A, 0x00, 0xF3, 0x0C, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x41, 0xC3, 0x0C, 0x10, -0x9D, 0x67, 0x48, 0xA4, 0x68, 0x42, 0xDC, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF3, 0x04, 0x4A, -0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x41, 0xC3, 0x9D, 0x67, 0x41, 0xA4, 0x01, 0x63, 0x20, 0xE8, -0xF8, 0x63, 0x0F, 0x62, 0x0E, 0xD0, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, -0x45, 0xA2, 0x7D, 0x67, 0x5E, 0xC3, 0xBD, 0x67, 0x5E, 0xA5, 0x30, 0xF0, 0x20, 0x6B, 0x81, 0xF1, -0x0C, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x7D, 0x67, 0x5E, 0xA3, 0x58, 0x2A, -0x00, 0x6A, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xC5, 0x4C, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, -0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, 0x18, 0x4A, 0x49, 0xE3, -0x06, 0xD2, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, 0x82, 0x67, 0x00, 0x18, 0xDC, 0x0A, 0x32, 0x22, -0x06, 0x92, 0x4E, 0xA2, 0x80, 0x6B, 0x6C, 0xEA, 0x2D, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, -0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x40, 0xA2, -0xBD, 0x67, 0x20, 0xF0, 0x41, 0xC5, 0x5D, 0x67, 0x20, 0xF0, 0x61, 0xA2, 0x7F, 0x6A, 0x6C, 0xEA, -0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, 0x01, 0x6B, 0x6E, 0xEA, -0x0B, 0x2A, 0xBD, 0x67, 0x20, 0xF0, 0x40, 0xA5, 0x30, 0xF0, 0x20, 0x6B, 0x81, 0xF1, 0x18, 0x4B, -0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, 0x82, 0x67, -0x00, 0x18, 0x2F, 0x31, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, 0x01, 0x4A, 0x7D, 0x67, 0x20, 0xF0, -0x42, 0xC3, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0x85, 0x00, 0x52, 0x58, 0x67, 0xAE, 0x22, 0x06, 0x11, -0x7D, 0x67, 0x5E, 0xA3, 0x00, 0xF1, 0x02, 0x22, 0xBD, 0x67, 0x5E, 0xA5, 0x04, 0x5A, 0x58, 0x67, -0xE0, 0xF0, 0x1C, 0x22, 0x00, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xC3, 0xF0, 0x10, 0xBD, 0x67, -0x20, 0xF0, 0x42, 0xA5, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0xF3, -0x18, 0x4A, 0x49, 0xE3, 0x06, 0xD2, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, 0x82, 0x67, 0x00, 0x18, -0xDC, 0x0A, 0xC0, 0xF0, 0x15, 0x22, 0x06, 0x92, 0x4E, 0xA2, 0x80, 0x6B, 0x6C, 0xEA, 0xC0, 0xF0, -0x0F, 0x2A, 0xBD, 0x67, 0x20, 0xF0, 0x62, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF7, 0x16, 0x4B, -0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x40, 0x9A, 0x7D, 0x67, 0x5D, 0xC3, 0xBD, 0x67, -0x20, 0xF0, 0x62, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0xC4, 0xF0, -0x58, 0xA2, 0x7D, 0x67, 0x5C, 0xC3, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, 0x48, 0x32, 0x48, 0x33, -0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x66, 0xF5, 0x00, 0x4A, 0x49, 0xE3, 0x09, 0x03, 0x83, 0x67, -0xA2, 0x67, 0x14, 0x6E, 0x00, 0x18, 0xD7, 0x03, 0x7D, 0x67, 0x5E, 0xA3, 0x0F, 0x42, 0xBD, 0x67, -0x20, 0xF0, 0x82, 0xA5, 0x5D, 0x67, 0x7D, 0xA2, 0xBD, 0x67, 0x5C, 0xA5, 0x09, 0x05, 0xC3, 0x67, -0xE2, 0x67, 0x00, 0x18, 0x38, 0x24, 0x64, 0x6B, 0x4F, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x06, 0x92, -0x09, 0xE2, 0x20, 0xF0, 0x65, 0xC2, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, 0x01, 0x6D, 0xAE, 0xEA, -0x29, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF1, 0x04, 0x4B, -0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x09, 0x95, 0x0A, 0x93, 0x0B, 0x92, 0x0C, 0x97, -0x0D, 0x96, 0x30, 0xF0, 0x20, 0x6C, 0xA1, 0xF1, 0x0C, 0x4C, 0x04, 0xD7, 0x05, 0xD6, 0xC3, 0x67, -0xE2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0xBD, 0x67, 0x5E, 0xA5, 0xFF, 0x4A, 0x06, 0x93, 0x49, 0xE3, -0x20, 0xF0, 0x45, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF1, 0x10, 0x4B, 0x83, 0x67, 0xA2, 0x67, -0x00, 0x18, 0x8B, 0x19, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x2F, 0x31, -0xBD, 0x67, 0x5E, 0xA5, 0x03, 0x6B, 0x6E, 0xEA, 0x53, 0x2A, 0x06, 0x92, 0x20, 0xF0, 0x65, 0xA2, -0x06, 0x92, 0x20, 0xF0, 0x46, 0xA2, 0x43, 0xEB, 0x58, 0x67, 0x0D, 0x2A, 0x06, 0x92, 0x20, 0xF0, -0x65, 0xA2, 0x06, 0x92, 0x20, 0xF0, 0x47, 0xA2, 0x43, 0xEB, 0x58, 0x67, 0x04, 0x2A, 0x00, 0x6A, -0x7D, 0x67, 0x5F, 0xC3, 0x10, 0x10, 0x06, 0x92, 0x20, 0xF0, 0x66, 0xA2, 0x06, 0x92, 0x20, 0xF0, -0x47, 0xA2, 0x43, 0xEB, 0x58, 0x67, 0x04, 0x2A, 0x01, 0x6A, 0x7D, 0x67, 0x5F, 0xC3, 0x03, 0x10, -0x02, 0x6A, 0xBD, 0x67, 0x5F, 0xC5, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, 0x01, 0x6D, 0xAE, 0xEA, -0x27, 0x2A, 0x5D, 0x67, 0x7F, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, -0x63, 0xF4, 0x40, 0xA2, 0x82, 0x67, 0x00, 0x18, 0xA3, 0x2D, 0x7D, 0x67, 0x5F, 0xA3, 0x30, 0xF0, -0x20, 0x6B, 0xC1, 0xF1, 0x18, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0xBD, 0x67, -0x7F, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x63, 0xF4, 0x40, 0xA2, -0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF1, 0x04, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, -0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, 0x01, 0x4A, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xC5, 0x7D, 0x67, -0x20, 0xF0, 0x42, 0x83, 0x00, 0x52, 0x58, 0x67, 0x1F, 0xF7, 0x09, 0x22, 0x7D, 0x67, 0x5E, 0xA3, -0x03, 0x5A, 0x58, 0x67, 0x34, 0x22, 0x5D, 0x67, 0x7E, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0x49, 0xE3, 0x63, 0xF4, 0x40, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF1, 0x14, 0x4B, -0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x8B, 0x19, 0xBD, 0x67, 0x7E, 0xA5, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x63, 0xF4, 0x40, 0xA2, 0x82, 0x67, 0x00, 0x18, 0xA3, 0x2D, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x01, 0x6B, 0x63, 0xF4, 0x66, 0xC2, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x45, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x63, 0xF4, 0x65, 0xC2, 0x1A, 0x10, 0x7D, 0x67, -0x5E, 0xA3, 0x03, 0x6D, 0xAE, 0xEA, 0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF2, 0x04, 0x4A, -0x82, 0x67, 0x00, 0x18, 0x8B, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, -0x63, 0xF4, 0x66, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x63, 0xF4, -0x65, 0xC2, 0x0F, 0x97, 0x0E, 0x90, 0x08, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, -0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x59, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, -0x20, 0x6A, 0xE2, 0xF3, 0x79, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x59, 0xA2, 0x02, 0x5A, -0x58, 0x67, 0x08, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0x6B, 0xE2, 0xF3, 0x79, 0xC2, 0x00, 0x18, -0xB3, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x00, 0x6A, -0x7D, 0x67, 0x41, 0xC3, 0x80, 0x10, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0x18, 0x10, 0x5D, 0x67, -0x61, 0xA2, 0x5D, 0x67, 0xA0, 0xA2, 0x30, 0xF0, 0x20, 0x6C, 0x43, 0x67, 0x48, 0x32, 0x69, 0xE2, -0xA9, 0xE2, 0x41, 0xF0, 0x16, 0x4A, 0x48, 0x33, 0x44, 0x67, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, -0x00, 0x6B, 0x60, 0xDA, 0x7D, 0x67, 0x40, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, -0x40, 0xA3, 0x05, 0x5A, 0x58, 0x67, 0xE3, 0x2A, 0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0xC4, 0xF0, 0x78, 0xC2, 0x5D, 0x67, 0x61, 0xA2, -0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF7, 0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, -0x00, 0x6B, 0x60, 0xDA, 0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x49, 0xE3, 0x00, 0x6B, 0x45, 0xF3, 0x78, 0xC2, 0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0xC5, 0xF3, 0x78, 0xC2, 0x5D, 0x67, 0x61, 0xA2, -0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF6, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, -0x00, 0x6B, 0x60, 0xCA, 0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF6, 0x0C, 0x4B, -0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, 0x5D, 0x67, 0x61, 0xA2, -0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, -0x00, 0x6B, 0x62, 0xCA, 0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF7, 0x0C, 0x4B, -0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, 0x7D, 0x67, 0x41, 0xA3, -0x01, 0x4A, 0x7D, 0x67, 0x41, 0xC3, 0x7D, 0x67, 0x41, 0x83, 0x00, 0x52, 0x58, 0x67, 0x7F, 0xF7, -0x1A, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x00, 0x6B, 0x45, 0xF6, 0x78, 0xDA, -0x01, 0x63, 0x20, 0xE8, 0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, -0x20, 0x6A, 0xA2, 0xF6, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, -0x60, 0xCA, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x22, 0xF6, 0x0C, 0x4B, 0x64, 0x33, -0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, -0x20, 0x6A, 0x22, 0xF7, 0x0C, 0x4B, 0x64, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, -0x62, 0xCA, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA2, 0xF7, 0x0C, 0x4B, 0x64, 0x33, -0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, 0x20, 0xE8, 0xFF, 0x63, 0x44, 0x67, -0x7D, 0x67, 0x48, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0x18, 0x10, 0x5D, 0x67, 0x68, 0xA2, -0x5D, 0x67, 0xA0, 0xA2, 0x30, 0xF0, 0x20, 0x6C, 0x43, 0x67, 0x48, 0x32, 0x69, 0xE2, 0xA9, 0xE2, -0x41, 0xF0, 0x16, 0x4A, 0x48, 0x33, 0x44, 0x67, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, -0x60, 0xDA, 0x7D, 0x67, 0x40, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, 0x40, 0xA3, -0x05, 0x5A, 0x58, 0x67, 0xE3, 0x2A, 0x5D, 0x67, 0x68, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0xC4, 0xF0, 0x78, 0xC2, 0x5D, 0x67, 0x68, 0xA2, 0x30, 0xF0, -0x20, 0x6A, 0xA0, 0xF7, 0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, -0x60, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x5D, 0x67, -0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x45, 0xF3, -0x78, 0xC2, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, -0x00, 0x6B, 0xC5, 0xF3, 0x78, 0xC2, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, 0x44, 0x67, 0x7D, 0x67, -0x20, 0xF0, 0x40, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, -0x20, 0x6A, 0xE1, 0xF3, 0x54, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, -0x10, 0x6A, 0x6C, 0xEA, 0x40, 0xF1, 0x1F, 0x2A, 0xBD, 0x67, 0x20, 0xF0, 0x40, 0xA5, 0x4C, 0x32, -0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0xDD, 0x67, -0x56, 0xC6, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, -0xE1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x3F, 0x6A, 0x6C, 0xEA, -0x9D, 0x67, 0x55, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x40, 0xA5, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, -0x20, 0x6A, 0x01, 0xF4, 0x40, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x56, 0x32, -0xDD, 0x67, 0x52, 0xC6, 0x7D, 0x67, 0x56, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, -0x01, 0xF4, 0x44, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x7F, 0x6A, 0x6C, 0xEA, -0x9D, 0x67, 0x51, 0xC4, 0xBD, 0x67, 0x51, 0xA5, 0x49, 0x6E, 0xCE, 0xEA, 0x04, 0x2A, 0x01, 0x6A, -0x7D, 0x67, 0x50, 0xC3, 0x03, 0x10, 0x02, 0x6A, 0x9D, 0x67, 0x50, 0xC4, 0xBD, 0x67, 0x20, 0xF0, -0x40, 0xA5, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x48, 0x9A, 0x49, 0xE3, -0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x00, 0x52, -0x58, 0x67, 0x7A, 0x22, 0x7D, 0x67, 0x56, 0xA3, 0x30, 0xF0, 0x20, 0x6B, 0x4C, 0x32, 0x48, 0x34, -0x89, 0xE2, 0x02, 0xF4, 0x08, 0x4B, 0x69, 0xE2, 0x00, 0xF7, 0x5F, 0xA2, 0x5A, 0x32, 0x62, 0x67, -0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x67, 0x22, 0x9D, 0x67, 0x55, 0xA4, 0x37, 0x2A, -0xBD, 0x67, 0x56, 0xA5, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE2, 0x45, 0xF3, -0x78, 0xA3, 0x81, 0x43, 0xFF, 0x6B, 0x8C, 0xEB, 0x30, 0xF0, 0x20, 0x6C, 0x02, 0xF4, 0x08, 0x4C, -0x89, 0xE2, 0x45, 0xF3, 0x78, 0xC2, 0xDD, 0x67, 0x76, 0xA6, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0x49, 0xE3, 0x45, 0xF3, 0x78, 0xA2, 0x9D, 0x67, 0x56, 0xA4, 0x30, 0xF0, 0x20, 0x6C, -0x4C, 0x32, 0x48, 0x35, 0xA9, 0xE2, 0x02, 0xF4, 0x08, 0x4C, 0x89, 0xE2, 0x20, 0xF7, 0x43, 0xA2, -0x6E, 0xEA, 0xC0, 0xF0, 0x02, 0x2A, 0xBD, 0x67, 0x56, 0xA5, 0x82, 0x67, 0x01, 0x6D, 0x00, 0x18, -0xBF, 0x26, 0xDD, 0x67, 0x56, 0xA6, 0x82, 0x67, 0x00, 0x18, 0x4E, 0x31, 0xB9, 0x10, 0x7D, 0x67, -0x56, 0xA3, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF4, 0x08, 0x4B, 0x6D, 0xE2, 0xC5, 0xF3, 0x78, 0xA3, -0x81, 0x43, 0xFF, 0x6B, 0x8C, 0xEB, 0x30, 0xF0, 0x20, 0x6C, 0x02, 0xF4, 0x08, 0x4C, 0x89, 0xE2, -0xC5, 0xF3, 0x78, 0xC2, 0x9D, 0x67, 0x76, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, -0x49, 0xE3, 0xC5, 0xF3, 0x58, 0xA2, 0xBD, 0x67, 0x70, 0xA5, 0x6E, 0xEA, 0x80, 0xF0, 0x17, 0x2A, -0xDD, 0x67, 0x56, 0xA6, 0x82, 0x67, 0x00, 0x6D, 0x00, 0x18, 0xBF, 0x26, 0x7D, 0x67, 0x56, 0xA3, -0x82, 0x67, 0x00, 0x18, 0x4E, 0x31, 0x8C, 0x10, 0x9D, 0x67, 0x55, 0xA4, 0xFF, 0x6B, 0x4C, 0xEB, -0x05, 0x5B, 0x78, 0x67, 0x01, 0x2B, 0x04, 0x6A, 0x7D, 0x67, 0x55, 0xC3, 0x9D, 0x67, 0x20, 0xF0, -0x40, 0xA4, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x48, 0x9A, 0x49, 0xE3, -0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x3F, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x54, 0xC5, 0xDD, 0x67, -0x20, 0xF0, 0x40, 0xA6, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x4C, 0x9A, -0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x3F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x53, 0xC3, -0x9D, 0x67, 0x76, 0xA4, 0xBD, 0x67, 0xD5, 0xA5, 0x5D, 0x67, 0x96, 0xA2, 0xBD, 0x67, 0xF5, 0xA5, -0x30, 0xF0, 0x20, 0x6D, 0x44, 0x67, 0x48, 0x32, 0x89, 0xE2, 0xE9, 0xE2, 0x41, 0xF0, 0x16, 0x4A, -0x48, 0x34, 0x45, 0x67, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0x80, 0x9A, 0xBD, 0x67, 0x54, 0xA5, -0x51, 0xE4, 0x30, 0xF0, 0x20, 0x6D, 0x43, 0x67, 0x48, 0x32, 0x69, 0xE2, 0xC9, 0xE2, 0x41, 0xF0, -0x16, 0x4A, 0x48, 0x33, 0x45, 0x67, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x80, 0xDA, 0xDD, 0x67, -0x96, 0xA6, 0x5D, 0x67, 0x76, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE3, -0xC4, 0xF0, 0x78, 0xA2, 0xBD, 0x67, 0x53, 0xA5, 0x4D, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF4, 0x08, 0x4A, 0x49, 0xE4, 0xC4, 0xF0, 0x78, 0xC2, 0xDD, 0x67, 0x96, 0xA6, -0x5D, 0x67, 0x76, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF7, 0x16, 0x4B, 0x68, 0x33, 0x02, 0xF4, -0x08, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0xDD, 0x67, 0xB4, 0xA6, 0xDD, 0x67, 0x53, 0xA6, 0x49, 0xE5, -0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF7, 0x16, 0x4C, 0x88, 0x34, 0x02, 0xF4, 0x08, 0x4A, -0x49, 0xE4, 0x60, 0xDA, 0x05, 0x10, 0x00, 0x65, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, -0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xEE, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - -}; -u32 array_length_mp_8814a_fw_ap = 56224; - - -#else - - -u8 array_mp_8814a_fw_nic[] = { -0x14, 0x88, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x42, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x0A, 0x1C, 0x13, 0x30, 0xDF, 0x07, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, -0x00, 0x00, 0x20, 0x80, 0xF8, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x10, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x12, 0x80, 0x00, 0x00, 0x00, 0x80, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0x02, 0x00, 0x80, 0xF9, 0x02, 0x00, 0x80, -0x09, 0x03, 0x00, 0x80, 0x19, 0x03, 0x00, 0x80, 0x29, 0x03, 0x00, 0x80, 0x39, 0x03, 0x00, 0x80, -0x49, 0x03, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, -0x35, 0x04, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, 0x35, 0x04, 0x00, 0x80, -0x35, 0x04, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x01, 0x11, 0x00, 0x00, 0x06, 0x09, 0x0C, 0x12, -0x18, 0x24, 0x30, 0x36, 0x01, 0x02, 0x05, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x08, 0x03, 0x03, -0x00, 0x04, 0x09, 0x07, 0x03, 0x03, 0x00, 0x04, 0x08, 0x06, 0x03, 0x02, 0x00, 0x04, 0x08, 0x05, -0x03, 0x01, 0x00, 0x04, 0x0D, 0x0A, 0x07, 0x05, 0x00, 0x08, 0x0C, 0x0A, 0x07, 0x04, 0x00, 0x08, -0x0B, 0x0A, 0x06, 0x05, 0x00, 0x08, 0x0B, 0x0A, 0x05, 0x03, 0x00, 0x08, 0x0B, 0x0A, 0x03, 0x02, -0x00, 0x08, 0x14, 0x12, 0x0C, 0x04, 0x00, 0x10, 0x14, 0x12, 0x09, 0x04, 0x00, 0x10, 0x24, 0x22, -0x1C, 0x12, 0x00, 0x20, 0x24, 0x22, 0x18, 0x0C, 0x00, 0x20, 0x24, 0x22, 0x14, 0x06, 0x00, 0x20, -0x24, 0x22, 0x0F, 0x04, 0x00, 0x20, 0x24, 0x21, 0x0A, 0x04, 0x00, 0x20, 0x23, 0x21, 0x0C, 0x04, -0x00, 0x20, 0x23, 0x1F, 0x0A, 0x04, 0x00, 0x20, 0x22, 0x1F, 0x0F, 0x04, 0x00, 0x20, 0x21, 0x1F, -0x16, 0x0C, 0x00, 0x20, 0x31, 0x2F, 0x20, 0x14, 0x00, 0x30, 0x31, 0x2F, 0x18, 0x10, 0x00, 0x30, -0x31, 0x2C, 0x18, 0x0C, 0x00, 0x30, 0x31, 0x2A, 0x14, 0x0C, 0x00, 0x30, 0x31, 0x28, 0x14, 0x00, -0x00, 0x30, 0x31, 0x24, 0x14, 0x00, 0x00, 0x30, 0x31, 0x1E, 0x14, 0x00, 0x00, 0x30, 0x31, 0x18, -0x0A, 0x00, 0x00, 0x30, 0x02, 0x02, 0x02, 0x04, 0x02, 0x04, 0x06, 0x06, 0x08, 0x08, 0x09, 0x09, -0x04, 0x08, 0x08, 0x08, 0x0C, 0x10, 0x10, 0x18, 0x04, 0x08, 0x08, 0x08, 0x0C, 0x10, 0x10, 0x18, -0x05, 0x08, 0x08, 0x09, 0x10, 0x14, 0x1C, 0x20, 0x04, 0x06, 0x08, 0x0A, 0x10, 0x18, 0x18, 0x20, -0x03, 0x05, 0x08, 0x09, 0x10, 0x14, 0x1C, 0x24, 0x2A, 0x2C, 0x05, 0x07, 0x09, 0x0A, 0x10, 0x14, -0x1C, 0x28, 0x2C, 0x30, 0x06, 0x08, 0x0A, 0x0C, 0x12, 0x18, 0x1E, 0x30, 0x38, 0x42, 0x0A, 0x0C, -0x0C, 0x12, 0x16, 0x1C, 0x20, 0x24, 0x24, 0x30, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, 0x04, -0x05, 0x06, 0x07, 0x08, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x02, 0x04, 0x06, 0x07, -0x08, 0x0A, 0x0B, 0x0C, 0x03, 0x05, 0x06, 0x07, 0x08, 0x0A, 0x0B, 0x0C, 0x05, 0x06, 0x07, 0x08, -0x09, 0x0A, 0x0B, 0x0C, 0x02, 0x04, 0x06, 0x07, 0x08, 0x09, 0x0B, 0x0C, 0x0C, 0x0C, 0x03, 0x05, -0x06, 0x07, 0x08, 0x09, 0x0B, 0x0C, 0x0C, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, -0x0C, 0x0C, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0C, 0x0C, 0x01, 0x02, 0x03, 0x06, -0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x2C, 0x2D, 0xFF, 0xFF, 0x2E, 0xFF, 0xFF, 0x37, 0x2F, -0xFF, 0x41, 0x38, 0x30, 0x39, 0x42, 0x31, 0x42, 0x3A, 0x32, 0x43, 0x3A, 0x33, 0x43, 0x3A, 0x34, -0x3A, 0x44, 0x35, 0x44, 0x3B, 0xFF, 0x37, 0x2E, 0x40, 0x38, 0x30, 0x41, 0x39, 0x42, 0x31, 0x3A, -0x43, 0x32, 0x3B, 0x43, 0x35, 0x3C, 0x44, 0xFF, 0x3D, 0x45, 0xFF, 0x3E, 0x45, 0xFF, 0x45, 0x3F, -0xFF, 0x46, 0xFF, 0xFF, 0x37, 0x41, 0x2F, 0x39, 0x42, 0x31, 0x43, 0x3A, 0x33, 0x44, 0x3B, 0x35, -0x45, 0x3D, 0xFF, 0x46, 0x47, 0x3E, 0x47, 0xFF, 0xFF, 0x48, 0xFF, 0xFF, 0x49, 0xFF, 0xFF, 0xFF, -0xFF, 0xFF, 0x00, 0x00, 0x0D, 0x14, 0xFF, 0x15, 0x0E, 0xFF, 0x15, 0x0F, 0xFF, 0x16, 0x10, 0xFF, -0x17, 0x1E, 0x11, 0x1E, 0x18, 0x12, 0x1F, 0x18, 0x13, 0x18, 0x1F, 0xFF, 0x15, 0x0E, 0xFF, 0x16, -0x1D, 0x10, 0x17, 0x1E, 0x10, 0x18, 0x1E, 0x11, 0x19, 0x1F, 0xFF, 0x1A, 0x20, 0xFF, 0x21, 0x1B, -0xFF, 0x21, 0xFF, 0xFF, 0x15, 0x13, 0x0F, 0x17, 0x1E, 0x11, 0x18, 0x1F, 0x13, 0x20, 0x19, 0xFF, -0x21, 0x1B, 0xFF, 0x22, 0xFF, 0xFF, 0x23, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x02, -0x02, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x04, 0x04, 0x04, 0x2C, 0xFF, 0xFF, 0x2D, 0xFF, -0xFF, 0x2E, 0x37, 0xFF, 0x38, 0x41, 0x2F, 0x39, 0x42, 0x30, 0x43, 0x39, 0x31, 0x42, 0x39, 0x32, -0x43, 0x3A, 0x33, 0x43, 0x3A, 0x34, 0x2D, 0xFF, 0xFF, 0x36, 0x2E, 0xFF, 0x37, 0x2F, 0x40, 0x38, -0x30, 0x41, 0x42, 0x33, 0x39, 0x43, 0x35, 0x3A, 0x3B, 0x43, 0x34, 0x44, 0x3C, 0x3B, 0x45, 0x3D, -0x3C, 0x45, 0x3E, 0x3D, 0x37, 0x2E, 0xFF, 0x38, 0x2F, 0x40, 0x39, 0x31, 0x41, 0x3A, 0x42, 0xFF, -0x43, 0x3B, 0xFF, 0x44, 0x3C, 0xFF, 0x45, 0x3D, 0x3C, 0x46, 0x3F, 0x45, 0x47, 0x46, 0x45, 0x48, -0x47, 0x47, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0x0C, 0xFF, 0xFF, 0x0D, 0x14, 0xFF, 0x0E, 0x15, 0xFF, -0x16, 0x0F, 0xFF, 0x17, 0x10, 0xFF, 0x17, 0x11, 0xFF, 0x17, 0x12, 0xFF, 0x0D, 0x0C, 0xFF, 0x14, -0x0E, 0xFF, 0x15, 0x0F, 0xFF, 0x16, 0x1D, 0x10, 0x17, 0x1E, 0x12, 0x18, 0x1F, 0x13, 0x19, 0x20, -0x19, 0x20, 0x1A, 0x19, 0x14, 0x0E, 0xFF, 0x15, 0x1C, 0xFF, 0x17, 0x1D, 0x11, 0x18, 0x1E, 0x13, -0x19, 0x1F, 0x1E, 0x20, 0x1A, 0x1F, 0x21, 0x1B, 0x20, 0x22, 0x21, 0x1B, 0x14, 0x14, 0x15, 0x15, -0x16, 0x17, 0x17, 0x18, 0x1C, 0x1C, 0x1C, 0x1C, 0x1D, 0x1D, 0x1E, 0x1E, 0x1C, 0x1C, 0x1D, 0x1E, -0x1F, 0x20, 0x20, 0x20, 0x36, 0x36, 0x37, 0x37, 0x38, 0x39, 0x39, 0x3A, 0x3A, 0x3A, 0x00, 0x00, -0x40, 0x40, 0x40, 0x40, 0x41, 0x41, 0x42, 0x42, 0x43, 0x43, 0x00, 0x00, 0x40, 0x40, 0x41, 0x42, -0x43, 0x44, 0x44, 0x44, 0x45, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x24, 0x26, 0x2A, 0x00, 0x00, 0x00, 0x1F, 0x21, 0x25, 0x27, 0x28, 0x00, 0x00, 0x00, 0x00, -0x23, 0x26, 0x28, 0x30, 0x00, 0x00, 0x00, 0x00, 0x23, 0x26, 0x28, 0x2A, 0x00, 0x00, 0x00, 0x00, -0x23, 0x26, 0x28, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x24, 0x28, 0x2A, 0x2C, 0x2E, 0x30, 0x00, 0x00, -0x00, 0x00, 0x26, 0x29, 0x2B, 0x2D, 0x2F, 0x31, 0x00, 0x00, 0x00, 0x00, 0x28, 0x2A, 0x2C, 0x2E, -0x30, 0x32, 0x00, 0x00, 0x00, 0x1F, 0x23, 0x26, 0x28, 0x2A, 0x2A, 0x2A, 0x04, 0x00, 0x04, 0x00, -0x08, 0x00, 0x10, 0x00, 0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x90, 0x00, -0xC0, 0x00, 0xD8, 0x00, 0x50, 0x00, 0x64, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xF0, 0x00, 0x40, 0x01, -0x90, 0x01, 0xE0, 0x01, 0xC8, 0x00, 0xF0, 0x00, 0x40, 0x01, 0x90, 0x01, 0x58, 0x02, 0x20, 0x03, -0xB0, 0x04, 0x40, 0x06, 0xC8, 0x00, 0x18, 0x01, 0xE0, 0x01, 0xF4, 0x01, 0x84, 0x03, 0x20, 0x03, -0xB0, 0x04, 0x40, 0x06, 0xC8, 0x00, 0x18, 0x01, 0xE0, 0x01, 0xD0, 0x02, 0x20, 0x03, 0xE8, 0x03, -0xB0, 0x04, 0x40, 0x06, 0x3C, 0x00, 0x64, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xF0, 0x00, 0x40, 0x01, -0x90, 0x01, 0xE0, 0x01, 0x58, 0x02, 0x20, 0x03, 0x78, 0x00, 0xF0, 0x00, 0x68, 0x01, 0xA4, 0x01, -0xE0, 0x01, 0x1C, 0x02, 0x58, 0x02, 0x20, 0x03, 0xE8, 0x03, 0xB0, 0x04, 0xB4, 0x00, 0x2C, 0x01, -0xA4, 0x01, 0xE0, 0x01, 0x1C, 0x02, 0x58, 0x02, 0x20, 0x03, 0xE8, 0x03, 0xB0, 0x04, 0x78, 0x05, -0xC8, 0x00, 0x18, 0x01, 0xE0, 0x01, 0xD0, 0x02, 0xE8, 0x03, 0xB0, 0x04, 0x40, 0x06, 0xD0, 0x07, -0xD0, 0x07, 0xD0, 0x07, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x12, 0x00, -0x18, 0x00, 0x24, 0x00, 0x30, 0x00, 0x48, 0x00, 0x60, 0x00, 0x6C, 0x00, 0x28, 0x00, 0x32, 0x00, -0x3C, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x00, 0xF0, 0x00, 0x64, 0x00, 0x78, 0x00, -0xA0, 0x00, 0xC8, 0x00, 0x2C, 0x01, 0x90, 0x01, 0x58, 0x02, 0x20, 0x03, 0x64, 0x00, 0x8C, 0x00, -0xF0, 0x00, 0xFA, 0x00, 0xC2, 0x01, 0x90, 0x01, 0x58, 0x02, 0x20, 0x03, 0x64, 0x00, 0x8C, 0x00, -0xF0, 0x00, 0x68, 0x01, 0xF4, 0x01, 0x20, 0x03, 0xE8, 0x03, 0x78, 0x05, 0x1E, 0x00, 0x32, 0x00, -0x3C, 0x00, 0x50, 0x00, 0x78, 0x00, 0xA0, 0x00, 0xC8, 0x00, 0xF0, 0x00, 0x2C, 0x01, 0x90, 0x01, -0x3C, 0x00, 0x78, 0x00, 0xB4, 0x00, 0xD2, 0x00, 0xF0, 0x00, 0x0E, 0x01, 0x2C, 0x01, 0x90, 0x01, -0xF4, 0x01, 0x58, 0x02, 0x5A, 0x00, 0x96, 0x00, 0xD2, 0x00, 0xF0, 0x00, 0x0E, 0x01, 0x2C, 0x01, -0x90, 0x01, 0xF4, 0x01, 0x58, 0x02, 0xBC, 0x02, 0x64, 0x00, 0x8C, 0x00, 0xF0, 0x00, 0x68, 0x01, -0xF4, 0x01, 0x58, 0x02, 0x20, 0x03, 0xE8, 0x03, 0xE8, 0x03, 0xE8, 0x03, 0x00, 0xF0, 0x01, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, -0x00, 0x00, 0x30, 0xC0, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0E, 0x38, 0x18, 0x00, 0x00, 0x00, -0x00, 0x83, 0x01, 0x06, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x70, 0xE0, 0x00, 0x00, 0x60, 0xB8, -0x00, 0x00, 0x64, 0xB8, 0x81, 0x39, 0x00, 0x80, 0xBB, 0x3A, 0x00, 0x80, 0xF9, 0x39, 0x00, 0x80, -0xBB, 0x3A, 0x00, 0x80, 0x11, 0x39, 0x00, 0x80, 0xBB, 0x3A, 0x00, 0x80, 0xBB, 0x3A, 0x00, 0x80, -0xBB, 0x3A, 0x00, 0x80, 0x7B, 0x3A, 0x00, 0x80, 0xBB, 0x3A, 0x00, 0x80, 0xBB, 0x3A, 0x00, 0x80, -0xBB, 0x3A, 0x00, 0x80, 0x8F, 0x38, 0x00, 0x80, 0x5B, 0x01, 0x64, 0xB8, 0x92, 0x06, 0x64, 0xB8, -0x3C, 0x01, 0x64, 0xB8, 0x53, 0x04, 0x64, 0xB8, 0x89, 0x00, 0x60, 0xB8, 0x8A, 0x00, 0x60, 0xB8, -0x04, 0x06, 0x64, 0xB8, 0x0A, 0x06, 0x64, 0xB8, 0x1A, 0x04, 0x64, 0xB8, 0x1B, 0x04, 0x64, 0xB8, -0x00, 0x00, 0x1E, 0x00, 0x58, 0x05, 0x64, 0xB8, 0x57, 0x01, 0x64, 0xB8, 0x87, 0x02, 0x64, 0xB8, -0x96, 0x02, 0x64, 0xB8, 0x86, 0x02, 0x64, 0xB8, 0x34, 0x01, 0x64, 0xB8, 0xA8, 0x06, 0x64, 0xB8, -0x60, 0x05, 0x64, 0xB8, 0x73, 0x05, 0x64, 0xB8, 0xAB, 0x06, 0x64, 0xB8, 0xAA, 0x06, 0x64, 0xB8, -0x0D, 0x00, 0x78, 0xB8, 0x12, 0x00, 0x78, 0xB8, 0x11, 0x00, 0x78, 0xB8, 0x06, 0x00, 0x78, 0xB8, -0xA7, 0x04, 0x64, 0xB8, 0xA6, 0x04, 0x64, 0xB8, 0xA5, 0x04, 0x64, 0xB8, 0xA4, 0x04, 0x64, 0xB8, -0x14, 0x00, 0x78, 0xB8, 0x09, 0x00, 0x78, 0xB8, 0x29, 0x00, 0x78, 0xB8, 0x1D, 0x04, 0x64, 0xB8, -0x7A, 0x04, 0x64, 0xB8, 0x04, 0x02, 0x64, 0xB8, 0x04, 0x06, 0x64, 0xB8, 0x22, 0x05, 0x64, 0xB8, -0x00, 0x00, 0x64, 0xB8, 0x00, 0x00, 0x60, 0xB8, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x42, -0xE0, 0x00, 0x60, 0xB8, 0xFF, 0xFF, 0xFF, 0xFD, 0xE3, 0x00, 0x60, 0xB8, 0xA3, 0x4D, 0x00, 0x80, -0xAB, 0x4D, 0x00, 0x80, 0xB3, 0x4D, 0x00, 0x80, 0xBB, 0x4D, 0x00, 0x80, 0xC3, 0x4D, 0x00, 0x80, -0xCB, 0x4D, 0x00, 0x80, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x04, -0xFF, 0xFF, 0xFF, 0xFB, 0x00, 0x00, 0x00, 0x20, 0xFF, 0xFF, 0xFF, 0xDF, 0x00, 0x00, 0x60, 0xB8, -0xFF, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x64, 0xB8, 0x04, 0x00, 0x60, 0xB8, 0x04, 0x00, 0x64, 0xB8, -0x08, 0x00, 0x60, 0xB8, 0x08, 0x00, 0x64, 0xB8, 0xF8, 0x10, 0x60, 0xB8, 0xE8, 0x12, 0x64, 0xB8, -0x80, 0x00, 0x60, 0xB8, 0x50, 0x14, 0x60, 0xB8, 0x50, 0x14, 0x64, 0xB8, 0xFC, 0x10, 0x60, 0xB8, -0xFC, 0x10, 0x60, 0xB8, 0xFA, 0xFA, 0xFA, 0xFA, 0x4C, 0x04, 0x64, 0xB8, 0x50, 0x04, 0x64, 0xB8, -0x84, 0x04, 0x64, 0xB8, 0x88, 0x04, 0x64, 0xB8, 0x8C, 0x04, 0x64, 0xB8, 0x90, 0x04, 0x64, 0xB8, -0x94, 0x04, 0x64, 0xB8, 0x98, 0x04, 0x64, 0xB8, 0x9C, 0x04, 0x64, 0xB8, 0xA0, 0x04, 0x64, 0xB8, -0xA4, 0x04, 0x64, 0xB8, 0xA8, 0x04, 0x64, 0xB8, 0xD0, 0x04, 0x64, 0xB8, 0x00, 0x0C, 0x01, 0x00, -0x00, 0x00, 0x60, 0xB8, 0x00, 0x00, 0x64, 0xB8, 0x01, 0x00, 0x66, 0xB8, 0x30, 0x31, 0x32, 0x33, -0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x00, 0x00, 0x00, 0x00, -0x53, 0x65, 0x74, 0x5F, 0x50, 0x6E, 0x74, 0x79, 0x00, 0x00, 0x00, 0x00, 0x53, 0x65, 0x74, 0x5F, -0x52, 0x41, 0x5F, 0x55, 0x70, 0x5F, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x5F, 0x66, 0x6F, 0x72, 0x5F, -0x52, 0x41, 0x5F, 0x64, 0x65, 0x62, 0x75, 0x67, 0x00, 0x00, 0x00, 0x00, 0x53, 0x65, 0x74, 0x5F, -0x44, 0x6F, 0x77, 0x6E, 0x5F, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x00, 0x00, 0x76, 0x61, 0x6C, 0x75, -0x65, 0x38, 0x3D, 0x30, 0x78, 0x25, 0x62, 0x58, 0x2C, 0x20, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x31, -0x36, 0x3D, 0x30, 0x78, 0x25, 0x77, 0x78, 0x2C, 0x20, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x33, 0x32, -0x3D, 0x30, 0x78, 0x25, 0x78, 0x00, 0x00, 0x00, 0x53, 0x65, 0x74, 0x5F, 0x43, 0x61, 0x6E, 0x64, -0x69, 0x5F, 0x33, 0x3A, 0x20, 0x5B, 0x31, 0x5D, 0x3D, 0x30, 0x78, 0x25, 0x62, 0x58, 0x2C, 0x20, -0x20, 0x5B, 0x32, 0x5D, 0x3D, 0x30, 0x78, 0x25, 0x62, 0x58, 0x2C, 0x20, 0x20, 0x5B, 0x33, 0x5D, -0x3D, 0x30, 0x78, 0x25, 0x62, 0x58, 0x00, 0x00, 0x53, 0x65, 0x74, 0x5F, 0x43, 0x61, 0x6E, 0x64, -0x69, 0x5F, 0x32, 0x3A, 0x20, 0x5B, 0x31, 0x5D, 0x3D, 0x30, 0x78, 0x25, 0x62, 0x58, 0x2C, 0x20, -0x20, 0x5B, 0x32, 0x5D, 0x3D, 0x30, 0x78, 0x25, 0x62, 0x58, 0x20, 0x00, 0x46, 0x57, 0x20, 0x74, -0x72, 0x61, 0x20, 0x65, 0x6E, 0x00, 0x00, 0x00, 0x81, 0x9F, 0x00, 0x80, 0xC7, 0x9F, 0x00, 0x80, -0x8B, 0x9F, 0x00, 0x80, 0xBD, 0x9F, 0x00, 0x80, 0xCF, 0x9F, 0x00, 0x80, 0xCF, 0x9F, 0x00, 0x80, -0x95, 0x9F, 0x00, 0x80, 0x9F, 0x9F, 0x00, 0x80, 0xA9, 0x9F, 0x00, 0x80, 0xB3, 0x9F, 0x00, 0x80, -0x00, 0x04, 0x0C, 0x14, 0x1C, 0x24, 0x2C, 0x36, 0x40, 0x00, 0x00, 0x00, 0x04, 0x08, 0x08, 0x08, -0x08, 0x08, 0x0A, 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x66, 0xB8, 0x04, 0x1C, 0x66, 0xB8, -0xCD, 0x9B, 0x78, 0x56, 0x00, 0x00, 0x66, 0xB8, 0x15, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, -0x15, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, -0x05, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xF0, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, -0x10, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, -0x15, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0xF0, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, -0x00, 0xF0, 0xFF, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x15, 0xF0, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x00, -0x52, 0x41, 0x3A, 0x4F, 0x46, 0x44, 0x4D, 0x25, 0x62, 0x58, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x43, -0x43, 0x4B, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x56, 0x31, 0x2D, 0x4D, 0x25, -0x62, 0x58, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x56, 0x32, 0x2D, 0x4D, 0x25, 0x62, 0x58, 0x00, 0x00, -0x52, 0x41, 0x3A, 0x56, 0x33, 0x2D, 0x4D, 0x25, 0x62, 0x58, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x48, -0x2D, 0x4D, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x48, 0x2D, 0x4D, 0x31, 0x2C, -0x25, 0x62, 0x58, 0x00, 0x52, 0x41, 0x3A, 0x48, 0x2D, 0x4D, 0x32, 0x2C, 0x25, 0x62, 0x58, 0x00, -0x5B, 0x49, 0x4E, 0x49, 0x54, 0x5F, 0x52, 0x61, 0x74, 0x65, 0x5F, 0x52, 0x53, 0x53, 0x49, 0x5D, -0x20, 0x6D, 0x61, 0x63, 0x69, 0x64, 0x3A, 0x25, 0x62, 0x78, 0x20, 0x52, 0x53, 0x53, 0x49, 0x3A, -0x25, 0x62, 0x58, 0x20, 0x52, 0x61, 0x74, 0x65, 0x3A, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, 0x00, -0xA3, 0xCC, 0x00, 0x80, 0xE7, 0xCC, 0x00, 0x80, 0xA3, 0xCC, 0x00, 0x80, 0xE7, 0xCC, 0x00, 0x80, -0xA3, 0xCC, 0x00, 0x80, 0xE7, 0xCC, 0x00, 0x80, 0x29, 0xCD, 0x00, 0x80, 0x29, 0xCD, 0x00, 0x80, -0x29, 0xCD, 0x00, 0x80, 0xC5, 0xCC, 0x00, 0x80, 0x07, 0xCD, 0x00, 0x80, 0x07, 0xCD, 0x00, 0x80, -0xC5, 0xCC, 0x00, 0x80, 0x45, 0xCD, 0x00, 0x80, 0x67, 0xCD, 0x00, 0x80, 0x52, 0x41, 0x50, 0x65, -0x6E, 0x64, 0x69, 0x6E, 0x67, 0x00, 0x00, 0x00, 0x43, 0x6E, 0x74, 0x3A, 0x20, 0x25, 0x62, 0x58, -0x00, 0x00, 0x00, 0x00, 0x46, 0x57, 0x46, 0x69, 0x78, 0x00, 0x00, 0x00, 0x52, 0x41, 0x3A, 0x46, -0x61, 0x73, 0x74, 0x44, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6F, 0x6E, 0x00, 0x46, 0x44, 0x3A, 0x20, -0x44, 0x6F, 0x77, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, 0x44, 0x72, 0x6F, 0x70, -0x00, 0x00, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, 0x4C, 0x56, 0x31, 0x3A, 0x20, 0x25, 0x62, 0x58, -0x00, 0x00, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, 0x46, 0x61, 0x69, 0x6C, 0x20, 0x4C, 0x76, 0x31, -0x00, 0x00, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, 0x46, 0x61, 0x69, 0x6C, 0x20, 0x4C, 0x76, 0x32, -0x00, 0x00, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, 0x46, 0x61, 0x69, 0x6C, 0x20, 0x4C, 0x76, 0x33, -0x00, 0x00, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, 0x55, 0x70, 0x00, 0x00, 0x46, 0x44, 0x3A, 0x20, -0x55, 0x70, 0x46, 0x61, 0x69, 0x6C, 0x00, 0x00, 0x52, 0x61, 0x74, 0x65, 0x55, 0x70, 0x00, 0x00, -0x52, 0x61, 0x74, 0x65, 0x44, 0x6F, 0x77, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x52, 0x61, 0x74, 0x69, -0x6F, 0x20, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, 0x4E, 0x73, 0x63, 0x20, 0x25, 0x62, 0x58, 0x2C, -0x20, 0x4E, 0x54, 0x48, 0x20, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, 0x00, 0x52, 0x61, 0x74, 0x65, -0x53, 0x74, 0x61, 0x79, 0x00, 0x00, 0x00, 0x00, 0x52, 0x53, 0x54, 0x54, 0x78, 0x52, 0x50, 0x54, -0x00, 0x00, 0x00, 0x00, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x25, 0x62, 0x58, 0x20, 0x00, 0x00, -0x72, 0x61, 0x74, 0x65, 0x3A, 0x20, 0x25, 0x62, 0x58, 0x00, 0x00, 0x00, 0x49, 0x44, 0x3A, 0x25, -0x62, 0x58, 0x00, 0x00, 0x52, 0x5B, 0x30, 0x3A, 0x34, 0x5D, 0x20, 0x25, 0x62, 0x58, 0x20, 0x2C, -0x20, 0x25, 0x62, 0x58, 0x2C, 0x20, 0x25, 0x62, 0x58, 0x2C, 0x20, 0x25, 0x62, 0x58, 0x2C, 0x20, -0x25, 0x62, 0x58, 0x20, 0x00, 0x00, 0x00, 0x00, 0x55, 0x3A, 0x20, 0x25, 0x62, 0x58, 0x20, 0x00, -0x54, 0x47, 0x3A, 0x20, 0x25, 0x62, 0x58, 0x20, 0x00, 0x00, 0x00, 0x00, 0x54, 0x47, 0x70, 0x61, -0x74, 0x68, 0x3A, 0x20, 0x25, 0x62, 0x58, 0x20, 0x00, 0x00, 0x00, 0x00, 0x53, 0x65, 0x74, 0x50, -0x61, 0x74, 0x68, 0x3A, 0x20, 0x25, 0x62, 0x58, 0x20, 0x00, 0x00, 0x00, 0x44, 0x54, 0x50, 0x5F, -0x65, 0x6E, 0x64, 0x00, 0x06, 0x06, 0x06, 0x07, 0x07, 0x07, 0x09, 0x09, 0x0C, 0x0E, 0x10, 0x12, -0x06, 0x06, 0x07, 0x0A, 0x0C, 0x0F, 0x10, 0x12, 0x07, 0x08, 0x09, 0x0A, 0x0C, 0x0F, 0x11, 0x12, -0x09, 0x09, 0x09, 0x09, 0x0C, 0x0F, 0x11, 0x13, 0x09, 0x09, 0x09, 0x09, 0x0C, 0x0E, 0x11, 0x13, -0x08, 0x0A, 0x0A, 0x0A, 0x0D, 0x10, 0x10, 0x11, 0x12, 0x12, 0x08, 0x0A, 0x0A, 0x0A, 0x0D, 0x10, -0x10, 0x12, 0x12, 0x13, 0x08, 0x0A, 0x0A, 0x0A, 0x0D, 0x10, 0x11, 0x12, 0x14, 0x15, 0x08, 0x0A, -0x0B, 0x0C, 0x0D, 0x0F, 0x0E, 0x0F, 0x12, 0x13, 0x28, 0x28, 0x32, 0x28, 0x1E, 0x19, 0x19, 0x19, -0x18, 0x18, 0x12, 0x0F, 0x1E, 0x1E, 0x19, 0x1E, 0x18, 0x16, 0x0C, 0x0C, 0x1E, 0x1E, 0x19, 0x1E, -0x18, 0x16, 0x0C, 0x0C, 0x1E, 0x1E, 0x19, 0x1C, 0x18, 0x14, 0x0C, 0x0A, 0x1E, 0x1E, 0x19, 0x1E, -0x19, 0x18, 0x0F, 0x0E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1C, 0x16, 0x14, 0x12, 0x0C, 0x0A, 0x1E, 0x1E, -0x1E, 0x1E, 0x1A, 0x16, 0x12, 0x10, 0x0C, 0x0A, 0x1E, 0x1E, 0x1E, 0x1E, 0x18, 0x16, 0x0D, 0x0D, -0x0A, 0x08, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x12, 0x12, 0x14, 0x12, -0x0F, 0x0F, 0x0C, 0x0C, 0x09, 0x08, 0x08, 0x07, 0x0A, 0x0A, 0x09, 0x07, 0x07, 0x06, 0x05, 0x04, -0x0C, 0x0C, 0x0A, 0x0A, 0x09, 0x07, 0x07, 0x06, 0x0C, 0x0C, 0x0A, 0x0A, 0x09, 0x07, 0x07, 0x06, -0x0C, 0x0C, 0x0A, 0x0A, 0x09, 0x07, 0x07, 0x06, 0x0A, 0x0A, 0x08, 0x08, 0x08, 0x07, 0x07, 0x06, -0x04, 0x04, 0x0C, 0x0C, 0x0A, 0x0A, 0x09, 0x07, 0x07, 0x06, 0x05, 0x04, 0x0C, 0x0C, 0x0A, 0x0A, -0x09, 0x07, 0x07, 0x05, 0x04, 0x04, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, -0x00, 0xF0, 0x0F, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0xF0, 0x0F, 0x00, 0x00, 0xC0, 0xFF, -0x00, 0x00, 0x00, 0xF0, 0x00, 0xFC, 0x0F, 0x00, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x01, 0x06, -0x00, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x38, 0xE0, 0x80, 0x03, 0x00, 0x00, 0x00, 0x30, 0xC0, -0x00, 0x03, 0x0C, 0x00, 0x4A, 0x04, 0x64, 0xB8, 0x49, 0x04, 0x64, 0xB8, 0x00, 0x00, 0x60, 0xB8, -0x00, 0x00, 0x64, 0xB8, 0x01, 0x00, 0x60, 0xB8, 0x01, 0x00, 0x64, 0xB8, 0x02, 0x00, 0x60, 0xB8, -0x02, 0x00, 0x64, 0xB8, 0x03, 0x00, 0x60, 0xB8, 0x03, 0x00, 0x64, 0xB8, 0x00, 0x1C, 0x66, 0xB8, -0x04, 0x1C, 0x66, 0xB8, 0x00, 0x00, 0x66, 0xB8, 0x01, 0x00, 0x66, 0xB8, 0x01, 0x1C, 0x66, 0xB8, -0x02, 0x1C, 0x66, 0xB8, 0x03, 0x1C, 0x66, 0xB8, 0x05, 0x1C, 0x66, 0xB8, 0x06, 0x1C, 0x66, 0xB8, -0x07, 0x1C, 0x66, 0xB8, 0xF0, 0x10, 0x60, 0xB8, 0xF1, 0x10, 0x60, 0xB8, 0x06, 0x00, 0x66, 0xB8, -0x23, 0x04, 0x64, 0xB8, 0x30, 0x04, 0x64, 0xB8, 0x00, 0x00, 0x00, 0x02, 0x34, 0x04, 0x64, 0xB8, -0x04, 0x05, 0x07, 0x08, 0x01, 0x01, 0x01, 0x02, 0xF3, 0x10, 0x60, 0xB8, 0xF2, 0x10, 0x60, 0xB8, -0x53, 0x04, 0x64, 0xB8, 0x52, 0x04, 0x64, 0xB8, 0x50, 0x04, 0x64, 0xB8, 0x51, 0x04, 0x64, 0xB8, -0xF7, 0x10, 0x60, 0xB8, 0xF4, 0x10, 0x60, 0xB8, 0xF5, 0x10, 0x60, 0xB8, 0x00, 0x00, 0xF0, 0x00, -0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xC0, -0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x07, 0x10, 0x66, 0xB8, -0x02, 0x10, 0x66, 0xB8, 0x00, 0x10, 0x66, 0xB8, 0x01, 0x10, 0x66, 0xB8, 0x00, 0x00, 0x66, 0xB8, -0x04, 0x10, 0x66, 0xB8, 0x05, 0x10, 0x66, 0xB8, 0xF8, 0x10, 0x60, 0xB8, 0x96, 0x02, 0x64, 0xB8, -0x00, 0x00, 0x70, 0xB8, 0xFF, 0xFF, 0xF0, 0xFF, 0x00, 0x00, 0x00, 0x80, 0x0B, 0x00, 0x70, 0xB8, -0x02, 0x00, 0x70, 0xB8, 0x1C, 0x01, 0x64, 0xB8, 0xFF, 0xFF, 0x03, 0x00, 0x94, 0x02, 0x64, 0xB8, -0x97, 0x02, 0x64, 0xB8, 0x1C, 0x04, 0x64, 0xB8, 0x00, 0x00, 0x00, 0x20, 0x24, 0x04, 0x64, 0xB8, -0x30, 0x01, 0x64, 0xB8, 0xF8, 0x10, 0x60, 0xB8, 0xCC, 0x01, 0x64, 0xB8, 0x00, 0x00, 0x60, 0xB8, -0x00, 0x00, 0x64, 0xB8, 0x31, 0x00, 0x60, 0xB8, 0x32, 0x00, 0x60, 0xB8, 0x33, 0x00, 0x60, 0xB8, -0x30, 0x00, 0x60, 0xB8, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x60, 0xB8, -0x00, 0x00, 0x64, 0xB8, 0x64, 0x01, 0x64, 0xB8, 0x53, 0x05, 0x64, 0xB8, 0x77, 0x05, 0x64, 0xB8, -0x68, 0x05, 0x64, 0xB8, 0x85, 0x1E, 0x00, 0x80, 0xD1, 0x1E, 0x00, 0x80, 0x1D, 0x1F, 0x00, 0x80, -0x69, 0x1F, 0x00, 0x80, 0xB5, 0x1F, 0x00, 0x80, 0x94, 0x01, 0x64, 0xB8, 0x00, 0x00, 0x66, 0xB8, -0x00, 0x1C, 0x66, 0xB8, 0x9A, 0x01, 0x64, 0xB8, 0x98, 0x01, 0x64, 0xB8, 0xFC, 0x10, 0x60, 0xB8, -0xF8, 0x10, 0x60, 0xB8, 0xC7, 0x01, 0x64, 0xB8, 0xC6, 0x01, 0x64, 0xB8, 0x34, 0x01, 0x64, 0xB8, -0x30, 0x01, 0x64, 0xB8, 0x24, 0x01, 0x64, 0xB8, 0x20, 0x01, 0x64, 0xB8, 0x24, 0x11, 0x64, 0xB8, -0x20, 0x11, 0x64, 0xB8, 0x2C, 0x11, 0x64, 0xB8, 0x28, 0x11, 0x64, 0xB8, 0x34, 0x11, 0x64, 0xB8, -0x30, 0x11, 0x64, 0xB8, 0x3C, 0x01, 0x64, 0xB8, 0x38, 0x01, 0x64, 0xB8, 0x3C, 0x11, 0x64, 0xB8, -0x38, 0x11, 0x64, 0xB8, 0x50, 0x00, 0x60, 0xB8, 0x54, 0x00, 0x60, 0xB8, 0x00, 0x40, 0x20, 0x00, -0xE0, 0x12, 0x64, 0xB8, 0x09, 0x02, 0x64, 0xB8, 0xFC, 0x10, 0x60, 0xB8, 0x00, 0x00, 0x78, 0xB8, -0x88, 0x00, 0x60, 0xB8, 0x06, 0x01, 0x64, 0xB8, 0xF0, 0x00, 0x60, 0xB8, 0xF8, 0x10, 0x60, 0xB8, -0x54, 0x00, 0x60, 0xB8, 0x34, 0x01, 0x64, 0xB8, 0x24, 0x01, 0x64, 0xB8, 0x24, 0x11, 0x64, 0xB8, -0x2C, 0x11, 0x64, 0xB8, 0x34, 0x11, 0x64, 0xB8, 0x3C, 0x01, 0x64, 0xB8, 0x3C, 0x11, 0x64, 0xB8, -0x00, 0x00, 0x78, 0xB8, 0x60, 0x05, 0x64, 0xB8, 0x61, 0x05, 0x64, 0xB8, 0x62, 0x05, 0x64, 0xB8, -0x63, 0x05, 0x64, 0xB8, 0x92, 0x06, 0x64, 0xB8, 0x2F, 0x01, 0x64, 0xB8, 0xE0, 0x04, 0x64, 0xB8, -0x57, 0x01, 0x64, 0xB8, 0x38, 0x01, 0x64, 0xB8, 0x00, 0x00, 0x78, 0xB8, 0xFD, 0x70, 0x00, 0x80, -0xFD, 0x70, 0x00, 0x80, 0xFD, 0x70, 0x00, 0x80, 0x5B, 0x71, 0x00, 0x80, 0xD7, 0x71, 0x00, 0x80, -0x43, 0x72, 0x00, 0x80, 0xB3, 0x72, 0x00, 0x80, 0x1D, 0x73, 0x00, 0x80, 0x7B, 0x73, 0x00, 0x80, -0xE5, 0x73, 0x00, 0x80, 0x7B, 0x73, 0x00, 0x80, 0x61, 0x74, 0x00, 0x80, 0x00, 0x00, 0x64, 0xB8, -0x00, 0x28, 0x64, 0xB8, 0x00, 0x2C, 0x64, 0xB8, 0x00, 0x38, 0x64, 0xB8, 0x00, 0x3C, 0x64, 0xB8, -0xFF, 0xFF, 0x0F, 0x00, 0xFF, 0xFF, 0xFF, 0x0F, 0x04, 0x02, 0x64, 0xB8, 0x28, 0x00, 0x78, 0xB8, -0x00, 0x00, 0xFE, 0x1F, 0x00, 0x03, 0x07, 0x00, 0xFF, 0x03, 0x07, 0x00, 0x54, 0x04, 0x64, 0xB8, -0x77, 0x77, 0x77, 0x77, 0x00, 0x00, 0xF0, 0x3F, 0x70, 0x77, 0x33, 0x54, 0x00, 0x00, 0x00, 0x01, -0x00, 0x00, 0x10, 0x00, 0x17, 0x77, 0x33, 0x77, 0x77, 0x77, 0x33, 0x77, 0x17, 0x77, 0x33, 0x54, -0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x30, 0xFC, 0x10, 0x60, 0xB8, -0xF8, 0x05, 0x64, 0xB8, 0xF9, 0x05, 0x64, 0xB8, 0xFA, 0x05, 0x64, 0xB8, 0xFB, 0x05, 0x64, 0xB8, -0xF8, 0x10, 0x60, 0xB8, 0x83, 0x00, 0x60, 0xB8, 0xC6, 0x01, 0x64, 0xB8, 0x08, 0x01, 0x64, 0xB8, -0x90, 0x00, 0x60, 0xB8, 0x92, 0x00, 0x60, 0xB8, 0x08, 0x00, 0x60, 0xB8, 0x22, 0x05, 0x64, 0xB8, -0x04, 0x02, 0x64, 0xB8, 0x7A, 0x04, 0x64, 0xB8, 0x20, 0x00, 0x78, 0xB8, 0x10, 0x00, 0x78, 0xB8, -0x03, 0x00, 0x78, 0xB8, 0xFF, 0xFF, 0x01, 0xFF, 0x00, 0x00, 0x02, 0x00, 0x29, 0x00, 0x78, 0xB8, -0x38, 0x00, 0x78, 0xB8, 0x05, 0x41, 0x10, 0x04, 0x24, 0x04, 0x64, 0xB8, 0x22, 0x05, 0x64, 0xB8, -0x2C, 0x04, 0x64, 0xB8, 0x1C, 0x04, 0x64, 0xB8, 0x28, 0x00, 0x78, 0xB8, 0x14, 0x00, 0x78, 0xB8, -0x1F, 0x04, 0x64, 0xB8, 0x5F, 0x01, 0x64, 0xB8, 0x1F, 0x07, 0x64, 0xB8, 0x1C, 0x07, 0x64, 0xB8, -0x2D, 0x04, 0x64, 0xB8, 0x68, 0x06, 0x64, 0xB8, 0x24, 0x00, 0x60, 0xB8, 0xFF, 0xFF, 0xCF, 0xFF, -0x5C, 0x05, 0x64, 0xB8, 0x38, 0x06, 0x64, 0xB8, 0x83, 0x04, 0x64, 0xB8, 0x54, 0x04, 0x64, 0xB8, -0xFC, 0x10, 0x60, 0xB8, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x04, 0x04, -0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x40, 0x40, -0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, -0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x7E, 0x04, 0x64, 0xB8, -0x21, 0x04, 0x64, 0xB8, 0x20, 0x04, 0x64, 0xB8, 0x02, 0x10, 0x66, 0xB8, 0x00, 0x10, 0x66, 0xB8, -0x04, 0x10, 0x66, 0xB8, 0x03, 0x10, 0x66, 0xB8, 0x01, 0x10, 0x66, 0xB8, 0x05, 0x10, 0x66, 0xB8, -0x06, 0x10, 0x66, 0xB8, 0x07, 0x10, 0x66, 0xB8, 0x7D, 0x04, 0x64, 0xB8, 0x7C, 0x04, 0x64, 0xB8, -0xF4, 0x00, 0x60, 0xB8, 0x08, 0x00, 0x60, 0xB8, 0x94, 0x01, 0x64, 0xB8, 0x00, 0x01, 0x64, 0xB8, -0x9A, 0x01, 0x64, 0xB8, 0x99, 0x01, 0x64, 0xB8, 0x9B, 0x01, 0x64, 0xB8, 0x98, 0x01, 0x64, 0xB8, -0xC0, 0xA3, 0x02, 0x80, 0xC0, 0xA7, 0x02, 0x80, 0x00, 0xC0, 0x00, 0x80, 0x01, 0x01, 0x64, 0xB8, -0x00, 0x01, 0x64, 0xB8, 0xB7, 0x06, 0x64, 0xB8, 0xB4, 0x06, 0x64, 0xB8, 0x02, 0x10, 0x60, 0xB8, -0xF0, 0xFF, 0x03, 0x00, 0x53, 0x05, 0x64, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x18, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x58, 0xB9, 0x00, 0x65, 0x00, 0x65, 0x00, 0x65, 0x79, 0xB9, 0x00, 0x65, 0x00, 0x65, 0x00, 0x65, -0x10, 0xF0, 0x20, 0x68, 0x20, 0xF4, 0x19, 0x48, 0x00, 0x65, 0x00, 0xE8, 0x00, 0x65, 0x1A, 0xB8, -0x3B, 0xB8, 0x00, 0xBA, 0x00, 0xBA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xF0, 0x20, 0x6C, 0x0A, 0xF0, 0x00, 0x4C, 0x02, 0xF0, 0x00, 0x4C, 0xBC, 0x65, 0x00, 0xF0, -0x21, 0x6C, 0x1F, 0xF4, 0x00, 0x4C, 0x8C, 0xB9, 0x00, 0x65, 0x00, 0x65, 0x00, 0x65, 0x94, 0xB8, -0x00, 0x6D, 0xFE, 0xF7, 0x1F, 0x4D, 0xAC, 0xEC, 0x94, 0xB9, 0x00, 0x65, 0x00, 0x65, 0x00, 0xF4, -0x00, 0x6D, 0xAD, 0xEC, 0x94, 0xB9, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6C, 0x00, 0xF0, 0x00, 0x4C, -0x00, 0x6E, 0x30, 0xF0, 0x20, 0x6F, 0x00, 0xF0, 0x00, 0x4F, 0xC0, 0xDC, 0x04, 0x4C, 0xE3, 0xEC, -0xB8, 0x67, 0xFB, 0x2D, 0x30, 0xF0, 0x20, 0x6C, 0xE2, 0xF3, 0x18, 0x4C, 0x00, 0x6E, 0x30, 0xF0, -0x20, 0x6F, 0x48, 0xF4, 0x18, 0x4F, 0xC0, 0xDC, 0x04, 0x4C, 0xE3, 0xEC, 0xB8, 0x67, 0xFB, 0x2D, -0x10, 0xF0, 0x20, 0x6C, 0x60, 0xF2, 0x1D, 0x4C, 0x00, 0xEC, 0x00, 0x00, 0xFD, 0x63, 0x05, 0x62, -0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF6, 0x5C, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x60, 0xF2, 0x1D, 0x4B, -0x60, 0xDA, 0x00, 0x18, 0xAB, 0x06, 0x00, 0x18, 0xC3, 0x06, 0x00, 0x18, 0x53, 0x09, 0x00, 0x18, -0xF5, 0x06, 0x00, 0x18, 0x49, 0x09, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF6, 0x50, 0x9A, 0x30, 0xF0, -0x20, 0x6B, 0x60, 0xF6, 0x70, 0x9B, 0x80, 0xAB, 0xFF, 0xF7, 0x1F, 0x6B, 0x6C, 0xEC, 0x10, 0xF0, -0x00, 0x6B, 0x6B, 0xEB, 0x6D, 0xEC, 0xFF, 0xF7, 0x1F, 0x6B, 0x8C, 0xEB, 0x60, 0xCA, 0x00, 0x18, -0xD4, 0x09, 0x00, 0x18, 0x63, 0x06, 0x01, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x00, 0x18, 0x24, 0x06, -0x00, 0x6C, 0x00, 0x18, 0xF1, 0x13, 0xFF, 0x17, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x4C, 0x01, -0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x56, 0x01, -0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x09, 0x02, -0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x1A, 0x02, -0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0xB8, 0x02, -0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0xC2, 0x02, -0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x08, 0xD4, 0x30, 0xF0, 0x20, 0x6A, -0x80, 0xF6, 0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x80, 0xF6, 0x64, 0x9B, 0x60, 0xDA, 0x48, 0xB8, -0x03, 0xD2, 0x03, 0x92, 0x07, 0xD2, 0x4D, 0xB8, 0x02, 0xD2, 0x02, 0x92, 0x06, 0xD2, 0x4E, 0xB8, -0x01, 0xD2, 0x01, 0x92, 0x05, 0xD2, 0x4C, 0xB8, 0x00, 0xD2, 0x00, 0x92, 0x04, 0xD2, 0x30, 0xF0, -0x20, 0x6A, 0x80, 0xF6, 0x48, 0x9A, 0x08, 0x93, 0x7C, 0x4B, 0x61, 0x9B, 0x60, 0xDA, 0x30, 0xF0, -0x20, 0x6A, 0x80, 0xF6, 0x4C, 0x9A, 0x07, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF6, -0x50, 0x9A, 0x06, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF6, 0x54, 0x9A, 0x04, 0x93, -0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF6, 0x58, 0x9A, 0x08, 0x93, 0x7B, 0x9B, 0x60, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF6, 0x5C, 0x9A, 0x08, 0x93, 0x7D, 0x9B, 0x60, 0xDA, 0x30, 0xF0, -0x20, 0x6A, 0xA0, 0xF6, 0x40, 0x9A, 0x08, 0x93, 0x64, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, -0xA0, 0xF6, 0x44, 0x9A, 0x08, 0x93, 0x65, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF6, -0x48, 0x9A, 0x08, 0x93, 0x66, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF6, 0x4C, 0x9A, -0x08, 0x93, 0x67, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF6, 0x50, 0x9A, 0x08, 0x93, -0x62, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF6, 0x54, 0x9A, 0x08, 0x93, 0x63, 0x9B, -0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF6, 0x58, 0x9A, 0x08, 0x93, 0x70, 0x9B, 0x60, 0xDA, -0xFF, 0x17, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x3D, 0x67, 0x00, 0xF3, 0x22, 0x31, 0x00, 0xF3, -0x20, 0x31, 0x08, 0x49, 0x42, 0xD9, 0x63, 0xD9, 0x84, 0xD9, 0xA5, 0xD9, 0xC6, 0xD9, 0xE7, 0xD9, -0x58, 0x67, 0x58, 0xD9, 0x5D, 0x67, 0x5B, 0xD9, 0x5F, 0x67, 0x5D, 0xD9, 0x12, 0xEC, 0x10, 0xED, -0xCE, 0xB8, 0x9E, 0xD9, 0xBF, 0xD9, 0x80, 0xF0, 0xC0, 0xD9, 0x0D, 0xB8, 0x7F, 0x69, 0x0C, 0xE9, -0x2D, 0x21, 0x00, 0x65, 0x3D, 0x67, 0x00, 0xF3, 0x22, 0x31, 0x00, 0xF3, 0x20, 0x31, 0x08, 0x49, -0x42, 0xD9, 0x63, 0xD9, 0x84, 0xD9, 0xA5, 0xD9, 0xC6, 0xD9, 0xE7, 0xD9, 0x58, 0x67, 0x58, 0xD9, -0x5D, 0x67, 0x5B, 0xD9, 0x5F, 0x67, 0x5D, 0xD9, 0x12, 0xEC, 0x10, 0xED, 0xCE, 0xB8, 0x9E, 0xD9, -0xBF, 0xD9, 0x80, 0xF0, 0xC0, 0xD9, 0x00, 0xF0, 0x20, 0x6D, 0xE0, 0xF6, 0x04, 0x4D, 0x00, 0x65, -0x30, 0xF0, 0x20, 0x68, 0x00, 0xF0, 0x08, 0x48, 0x18, 0x48, 0x20, 0x98, 0x00, 0x65, 0x20, 0xDD, -0x00, 0x65, 0x1D, 0x67, 0x01, 0xDD, 0x00, 0x65, 0x00, 0xE9, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x69, -0x00, 0xF0, 0x08, 0x49, 0x1F, 0xF4, 0x00, 0x6C, 0x8C, 0xE8, 0x80, 0xF2, 0x02, 0x30, 0x0B, 0x20, -0x01, 0x6A, 0x0C, 0xEA, 0x04, 0x22, 0x40, 0x99, 0x00, 0x65, 0x40, 0xEA, 0x00, 0x65, 0x06, 0x30, -0x24, 0x41, 0xF5, 0x17, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x69, 0x0A, 0xF0, 0x08, 0x49, 0x58, 0x99, -0x1A, 0x65, 0x5B, 0x99, 0xBA, 0x65, 0x5D, 0x99, 0xFA, 0x65, 0x9E, 0x99, 0xBF, 0x99, 0x32, 0xEC, -0x30, 0xED, 0x42, 0x99, 0x63, 0x99, 0x84, 0x99, 0xA5, 0x99, 0xC6, 0x99, 0xE7, 0x99, 0x80, 0xF0, -0x20, 0x99, 0xC9, 0xB9, 0x00, 0x65, 0x00, 0x65, 0x00, 0x65, 0x1A, 0xB8, 0x3B, 0xB8, 0x00, 0xBA, -0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x40, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x20, 0xF5, 0x11, 0x4B, -0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x40, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x20, 0xF5, -0x11, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x20, 0xE8, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, -0x41, 0xF7, 0x40, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x40, 0xF5, 0x19, 0x4B, 0x60, 0xDA, 0x00, 0x18, -0x29, 0x18, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x45, 0x9A, 0xA0, 0xF0, 0x1A, 0x22, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, 0x10, 0x6A, 0x6C, 0xEA, 0x02, 0x22, -0x00, 0x18, 0x8E, 0x18, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, 0x20, 0x6A, -0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x92, 0x18, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x65, 0x9A, 0x40, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x93, 0x18, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, 0x80, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xEC, 0x20, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, 0xFF, 0x6A, 0x01, 0x4A, 0x6C, 0xEA, -0x02, 0x22, 0x00, 0x18, 0x94, 0x18, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, -0x00, 0xF2, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x98, 0x18, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x44, 0x9A, 0x6C, 0xEA, -0x03, 0x22, 0x00, 0x6C, 0x00, 0x18, 0x9C, 0x18, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x48, 0x9A, 0x6C, 0xEA, 0x03, 0x22, 0x01, 0x6C, -0x00, 0x18, 0x9C, 0x18, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, 0x30, 0xF0, -0x20, 0x6A, 0x41, 0xF7, 0x4C, 0x9A, 0x6C, 0xEA, 0x03, 0x22, 0x02, 0x6C, 0x00, 0x18, 0x9C, 0x18, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, -0x50, 0x9A, 0x6C, 0xEA, 0x03, 0x22, 0x03, 0x6C, 0x00, 0x18, 0x9C, 0x18, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x54, 0x9A, 0x6C, 0xEA, -0x03, 0x22, 0x04, 0x6C, 0x00, 0x18, 0x9C, 0x18, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x58, 0x9A, 0x6C, 0xEA, 0x03, 0x22, 0x05, 0x6C, -0x00, 0x18, 0x9C, 0x18, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, 0x30, 0xF0, -0x20, 0x6A, 0x41, 0xF7, 0x5C, 0x9A, 0x6C, 0xEA, 0x03, 0x22, 0x06, 0x6C, 0x00, 0x18, 0x9C, 0x18, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF7, -0x40, 0x9A, 0x6C, 0xEA, 0x03, 0x22, 0x07, 0x6C, 0x00, 0x18, 0x9C, 0x18, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x65, 0x9A, 0x08, 0x6A, 0x6C, 0xEA, 0x05, 0x22, 0x00, 0x6C, 0x00, 0x18, -0x4F, 0x1A, 0x01, 0x10, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x46, 0x9A, -0x52, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x66, 0x9A, 0x30, 0xF0, 0x20, 0x6A, -0x61, 0xF7, 0x44, 0x9A, 0x6C, 0xEA, 0x03, 0x22, 0x00, 0x6C, 0x00, 0x18, 0xDB, 0x19, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x66, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF7, 0x48, 0x9A, -0x6C, 0xEA, 0x03, 0x22, 0x00, 0x6C, 0x00, 0x18, 0xE6, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0x66, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF7, 0x4C, 0x9A, 0x6C, 0xEA, 0x03, 0x22, -0x00, 0x6C, 0x00, 0x18, 0xFE, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x66, 0x9A, -0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF7, 0x50, 0x9A, 0x6C, 0xEA, 0x03, 0x22, 0x00, 0x6C, 0x00, 0x18, -0x22, 0x1A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x66, 0x9A, 0x30, 0xF0, 0x20, 0x6A, -0x61, 0xF7, 0x54, 0x9A, 0x6C, 0xEA, 0x03, 0x22, 0x00, 0x6C, 0x00, 0x18, 0x36, 0x1A, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x66, 0x9A, 0x08, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x04, 0x22, -0x00, 0x18, 0xD7, 0x18, 0x01, 0x10, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x47, 0x9A, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x47, 0x9A, 0x62, 0x67, -0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x05, 0x22, 0x00, 0x6C, 0x00, 0x18, 0xDB, 0x18, -0x01, 0x10, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x48, 0x9A, 0x62, 0x67, -0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x03, 0x22, 0x00, 0x6C, 0x00, 0x18, 0x30, 0x19, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x68, 0x9A, 0x10, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, -0x03, 0x22, 0x00, 0x6C, 0x00, 0x18, 0x7A, 0x06, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x40, 0x9A, -0x10, 0xF0, 0x20, 0x6B, 0x40, 0xF5, 0x19, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x05, 0x97, 0x03, 0x63, -0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x40, 0x9A, -0x10, 0xF0, 0x20, 0x6B, 0x21, 0xF0, 0x05, 0x4B, 0x60, 0xDA, 0x00, 0x18, 0x19, 0x18, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x4D, 0x9A, 0x0B, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, -0x40, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x21, 0xF0, 0x05, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x01, 0x10, -0x00, 0x65, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, -0x41, 0xF7, 0x40, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x61, 0xF0, 0x09, 0x4B, 0x60, 0xDA, 0x00, 0x18, -0x70, 0x18, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x51, 0x9A, 0xA0, 0xF0, 0x05, 0x22, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x51, 0x9A, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, -0xFF, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x35, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0x71, 0x9A, 0x02, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x36, 0x19, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x71, 0x9A, 0x04, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, -0x3E, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x71, 0x9A, 0x08, 0x6A, 0x6C, 0xEA, -0x02, 0x22, 0x00, 0x18, 0x53, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x71, 0x9A, -0x10, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x57, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0x71, 0x9A, 0x20, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x58, 0x19, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x71, 0x9A, 0x40, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, -0x59, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x71, 0x9A, 0x80, 0x6A, 0x6C, 0xEA, -0x02, 0x22, 0x00, 0x18, 0x5A, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x71, 0x9A, -0xFF, 0x6A, 0x01, 0x4A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x5B, 0x19, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x71, 0x9A, 0x04, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, -0x5C, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x71, 0x9A, 0x08, 0xF0, 0x00, 0x6A, -0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x5D, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x71, 0x9A, 0x10, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x5E, 0x19, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x72, 0x9A, 0x10, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, -0x00, 0x18, 0xD2, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x72, 0x9A, 0x30, 0xF0, -0x20, 0x6A, 0x61, 0xF7, 0x58, 0x9A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xD3, 0x19, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x72, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF7, 0x48, 0x9A, -0x6C, 0xEA, 0x04, 0x22, 0x00, 0x18, 0xD4, 0x19, 0x01, 0x10, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x52, 0x9A, 0x78, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x52, 0x9A, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, -0x5F, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x72, 0x9A, 0x02, 0x6A, 0x6C, 0xEA, -0x02, 0x22, 0x00, 0x18, 0x89, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x72, 0x9A, -0x04, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x90, 0x19, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x72, 0x9A, 0x08, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, -0xAF, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x72, 0x9A, 0x40, 0x6A, 0x6C, 0xEA, -0x02, 0x22, 0x00, 0x18, 0x8A, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x72, 0x9A, -0x80, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x8B, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0x72, 0x9A, 0xFF, 0x6A, 0x01, 0x4A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x8C, 0x19, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x72, 0x9A, 0x00, 0xF2, 0x00, 0x6A, 0x6C, 0xEA, -0x02, 0x22, 0x00, 0x18, 0x8D, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x72, 0x9A, -0x00, 0xF4, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x8E, 0x19, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x72, 0x9A, 0x01, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, -0x8F, 0x19, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x40, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x61, 0xF0, -0x09, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x01, 0x10, 0x00, 0x65, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, -0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x40, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0xE1, 0xF2, 0x01, 0x4B, -0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x40, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0xE1, 0xF2, -0x01, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x20, 0xE8, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, 0x40, 0x9A, -0x10, 0xF0, 0x20, 0x6B, 0x01, 0xF3, 0x09, 0x4B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF7, -0x40, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x01, 0xF3, 0x09, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x20, 0xE8, -0xFD, 0x63, 0x05, 0x62, 0xFF, 0x6C, 0x2F, 0x6D, 0x00, 0x18, 0x54, 0x1E, 0x00, 0x18, 0xA3, 0x21, -0x01, 0x6C, 0x08, 0x6D, 0x00, 0x18, 0x9A, 0x0B, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, -0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x39, 0x21, 0x00, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x54, 0x1E, -0x01, 0x6C, 0x0C, 0x6D, 0x00, 0x18, 0x9A, 0x0B, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, -0xFF, 0x63, 0x02, 0xD4, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, -0xC0, 0xF5, 0x40, 0x9A, 0x49, 0xE3, 0x02, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0xC0, 0xF5, 0x60, 0x9B, -0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x01, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, -0x60, 0xC2, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, 0x40, 0x9A, 0x49, 0xE3, 0x62, 0x67, -0x02, 0x94, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, 0x40, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, -0x8C, 0xEA, 0xFB, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, -0x44, 0x9A, 0x49, 0xE3, 0x02, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0xC0, 0xF5, 0x64, 0x9B, 0x6D, 0xE4, -0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x06, 0x6B, 0x6B, 0xEB, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, -0x60, 0xC2, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, 0x48, 0x9A, 0x49, 0xE3, 0x02, 0x94, -0x30, 0xF0, 0x20, 0x6B, 0xC0, 0xF5, 0x68, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, -0x1F, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, -0xC0, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x02, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0xC0, 0xF5, 0x6C, 0x9B, -0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x0E, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, -0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, 0x50, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x30, 0xF0, -0x20, 0x6A, 0xC0, 0xF5, 0x54, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, -0x58, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF5, 0x5C, 0x9A, -0x03, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x40, 0x9A, -0x49, 0xE3, 0x02, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0xE0, 0xF5, 0x60, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, -0xFF, 0x6B, 0x8C, 0xEB, 0x00, 0xF6, 0x60, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x40, 0x6B, 0x6B, 0xEB, -0x8C, 0xEB, 0x00, 0xF6, 0x60, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xBD, 0x67, 0x60, 0x85, 0x8D, 0xEB, -0x00, 0xF6, 0x60, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x01, 0x63, -0x20, 0xE8, 0x00, 0x65, 0x44, 0x67, 0x01, 0xD5, 0x7D, 0x67, 0x40, 0xC3, 0x01, 0x93, 0x30, 0xF0, -0x20, 0x6A, 0xE0, 0xF5, 0x44, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0x01, 0x94, 0x30, 0xF0, 0x20, 0x6A, -0xE0, 0xF5, 0x44, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x3F, 0x6C, 0x8C, 0xEA, -0x40, 0xC3, 0x7D, 0x67, 0x40, 0xA3, 0x2A, 0x22, 0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, -0x48, 0x9A, 0x49, 0xE3, 0x01, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0xE0, 0xF5, 0x68, 0x9B, 0x6D, 0xE4, -0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x10, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, -0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x44, 0x9A, 0x49, 0xE3, 0x01, 0x94, 0x30, 0xF0, -0x20, 0x6B, 0xE0, 0xF5, 0x64, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x80, 0x6B, -0x6B, 0xEB, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x27, 0x10, 0x01, 0x93, 0x30, 0xF0, -0x20, 0x6A, 0xE0, 0xF5, 0x48, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0x01, 0x94, 0x30, 0xF0, 0x20, 0x6A, -0xE0, 0xF5, 0x48, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0xEF, 0x6C, 0x8C, 0xEA, -0x40, 0xC3, 0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x44, 0x9A, 0x49, 0xE3, 0x01, 0x94, -0x30, 0xF0, 0x20, 0x6B, 0xE0, 0xF5, 0x64, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, -0x40, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, -0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x4C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x52, 0x32, -0x7D, 0x67, 0x51, 0xC3, 0x7D, 0x67, 0x51, 0xA3, 0x11, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0x80, 0xF4, 0x52, 0xA2, 0x82, 0x67, 0x00, 0x6D, 0x18, 0x6E, 0x00, 0x6F, 0x00, 0x18, -0x5F, 0x1E, 0x05, 0xD2, 0x00, 0x18, 0x8F, 0x15, 0x7D, 0x67, 0x50, 0xC3, 0x07, 0x97, 0x04, 0x63, -0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, -0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x50, 0x9A, 0x60, 0xAA, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, -0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x54, 0x9A, 0x80, 0xAA, 0xFF, 0xF7, -0x1F, 0x6A, 0x4C, 0xEC, 0xFF, 0x6A, 0x8C, 0xEA, 0x4B, 0xE3, 0x9D, 0x67, 0x50, 0xC4, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x80, 0xF4, 0x53, 0xA2, 0x9D, 0x67, 0x70, 0xA4, 0x6E, 0xEA, -0x73, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x0E, 0x6B, -0x6E, 0xEA, 0x26, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x66, 0x2A, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x03, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, -0x66, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x78, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, -0x58, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x7F, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x01, 0x6C, -0x0C, 0x6D, 0x00, 0x18, 0x9A, 0x0B, 0x00, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x54, 0x1E, 0x44, 0x10, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x06, 0x6B, 0x6E, 0xEA, -0x3B, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x37, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x02, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, -0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x58, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xE0, 0xF5, 0x78, 0x9B, -0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x40, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, -0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x58, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xE0, 0xF5, 0x78, 0x9B, -0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x80, 0x6B, 0x6B, 0xEB, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, -0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x04, 0x6B, 0xC0, 0xF4, 0x68, 0xC2, -0x00, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x54, 0x1E, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, -0xFC, 0x63, 0x07, 0x62, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x60, 0xC4, 0x7D, 0x67, -0x20, 0xF0, 0x44, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF0, 0x50, 0xA2, -0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF0, -0x70, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF5, 0x4C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, -0x52, 0x32, 0x9D, 0x67, 0x50, 0xC4, 0x7D, 0x67, 0x50, 0xA3, 0x3A, 0x22, 0x30, 0xF0, 0x20, 0x6A, -0xE0, 0xF5, 0x5C, 0x9A, 0x40, 0xA2, 0x9D, 0x67, 0x51, 0xC4, 0xFF, 0x6C, 0x26, 0x6D, 0x00, 0x18, -0x54, 0x1E, 0x00, 0x18, 0x9B, 0x1D, 0x01, 0x6B, 0x6E, 0xEA, 0x1D, 0x2A, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x80, 0xF4, 0x53, 0xA2, 0x62, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x44, 0xA4, -0x83, 0x67, 0x01, 0x6D, 0xC2, 0x67, 0x00, 0x6F, 0x00, 0x18, 0x5F, 0x1E, 0x05, 0xD2, 0x5D, 0x67, -0x20, 0xF0, 0x60, 0xA2, 0x05, 0x92, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x31, 0x03, 0x05, 0x92, -0x82, 0x67, 0x00, 0x18, 0xDC, 0x02, 0x7D, 0x67, 0x51, 0xA3, 0x82, 0x67, 0x27, 0x6D, 0x00, 0x18, -0x54, 0x1E, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x82, 0x67, 0x00, 0x18, 0x79, 0x03, 0x23, 0x10, -0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x79, 0x03, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x80, 0xF4, 0x53, 0xA2, 0x62, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x44, 0xA4, -0x83, 0x67, 0x01, 0x6D, 0xC2, 0x67, 0x00, 0x6F, 0x00, 0x18, 0x5F, 0x1E, 0x05, 0xD2, 0x5D, 0x67, -0x20, 0xF0, 0x60, 0xA2, 0x05, 0x92, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x31, 0x03, 0x05, 0x92, -0x82, 0x67, 0x00, 0x18, 0xDC, 0x02, 0x00, 0x18, 0x8F, 0x15, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, -0xFF, 0x63, 0x02, 0xD4, 0x03, 0xD5, 0x04, 0xD6, 0x02, 0x92, 0x01, 0xD2, 0x01, 0x93, 0x03, 0x6A, -0x6C, 0xEA, 0x0E, 0x2A, 0x09, 0x10, 0x01, 0x92, 0x03, 0x93, 0x60, 0xDA, 0x01, 0x92, 0x04, 0x4A, -0x01, 0xD2, 0x04, 0x92, 0xFC, 0x4A, 0x04, 0xD2, 0x04, 0x92, 0x04, 0x5A, 0x58, 0x67, 0xF3, 0x22, -0x02, 0x92, 0x00, 0xD2, 0x08, 0x10, 0x03, 0x93, 0xFF, 0x6A, 0x4C, 0xEB, 0x00, 0x92, 0x60, 0xC2, -0x00, 0x92, 0x01, 0x4A, 0x00, 0xD2, 0x00, 0x6A, 0x04, 0x93, 0x01, 0x23, 0x01, 0x6A, 0xFF, 0x6B, -0x6C, 0xEA, 0x04, 0x93, 0xFF, 0x4B, 0x04, 0xD3, 0xEE, 0x2A, 0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, -0xFF, 0x63, 0x02, 0xD4, 0x45, 0x67, 0x04, 0xD6, 0x7D, 0x67, 0x4C, 0xC3, 0x02, 0x92, 0x00, 0xD2, -0x0A, 0x10, 0x00, 0x92, 0x9D, 0x67, 0x6C, 0xA4, 0x60, 0xC2, 0x00, 0x92, 0x01, 0x4A, 0x00, 0xD2, -0x04, 0x92, 0xFF, 0x4A, 0x04, 0xD2, 0x04, 0x92, 0xF4, 0x2A, 0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, -0xFE, 0x63, 0x04, 0xD4, 0x05, 0xD5, 0x06, 0xD6, 0x04, 0x92, 0x03, 0xD2, 0x05, 0x92, 0x02, 0xD2, -0x05, 0x93, 0x03, 0x6A, 0x6C, 0xEA, 0x16, 0x2A, 0x04, 0x93, 0x03, 0x6A, 0x6C, 0xEA, 0x12, 0x2A, -0x0D, 0x10, 0x02, 0x92, 0x60, 0x9A, 0x03, 0x92, 0x60, 0xDA, 0x03, 0x92, 0x04, 0x4A, 0x03, 0xD2, -0x02, 0x92, 0x04, 0x4A, 0x02, 0xD2, 0x06, 0x92, 0xFC, 0x4A, 0x06, 0xD2, 0x06, 0x92, 0x04, 0x5A, -0x58, 0x67, 0xEF, 0x22, 0x03, 0x92, 0x01, 0xD2, 0x02, 0x92, 0x00, 0xD2, 0x0A, 0x10, 0x00, 0x92, -0x60, 0x82, 0x01, 0x92, 0x60, 0xC2, 0x01, 0x92, 0x01, 0x4A, 0x01, 0xD2, 0x00, 0x92, 0x01, 0x4A, -0x00, 0xD2, 0x00, 0x6A, 0x06, 0x93, 0x01, 0x23, 0x01, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x06, 0x93, -0xFF, 0x4B, 0x06, 0xD3, 0xEC, 0x2A, 0x04, 0x92, 0x02, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x02, 0xD4, -0x03, 0xD5, 0x04, 0xD6, 0x02, 0x93, 0x03, 0x92, 0x63, 0xEA, 0x58, 0x67, 0x1A, 0x2A, 0x02, 0x92, -0x01, 0xD2, 0x03, 0x92, 0x00, 0xD2, 0x0A, 0x10, 0x00, 0x92, 0x60, 0x82, 0x01, 0x92, 0x60, 0xC2, -0x01, 0x92, 0x01, 0x4A, 0x01, 0xD2, 0x00, 0x92, 0x01, 0x4A, 0x00, 0xD2, 0x00, 0x6A, 0x04, 0x93, -0x01, 0x23, 0x01, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x04, 0x93, 0xFF, 0x4B, 0x04, 0xD3, 0xEC, 0x2A, -0x1D, 0x10, 0x02, 0x93, 0x04, 0x92, 0x49, 0xE3, 0x01, 0xD2, 0x03, 0x93, 0x04, 0x92, 0x49, 0xE3, -0x00, 0xD2, 0x0A, 0x10, 0x01, 0x92, 0xFF, 0x4A, 0x01, 0xD2, 0x00, 0x92, 0xFF, 0x4A, 0x00, 0xD2, -0x00, 0x92, 0x60, 0x82, 0x01, 0x92, 0x60, 0xC2, 0x00, 0x6A, 0x04, 0x93, 0x01, 0x23, 0x01, 0x6A, -0xFF, 0x6B, 0x6C, 0xEA, 0x04, 0x93, 0xFF, 0x4B, 0x04, 0xD3, 0xEC, 0x2A, 0x02, 0x92, 0x01, 0x63, -0x20, 0xE8, 0x00, 0x65, 0xFE, 0x63, 0x04, 0xD4, 0x05, 0xD5, 0x06, 0xD6, 0x00, 0x6A, 0x7D, 0x67, -0x40, 0xC3, 0x04, 0x92, 0x02, 0xD2, 0x05, 0x92, 0x01, 0xD2, 0x15, 0x10, 0x02, 0x92, 0x60, 0xA2, -0x01, 0x92, 0x40, 0xA2, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, -0x40, 0x83, 0x0C, 0x2A, 0x02, 0x92, 0x01, 0x4A, 0x02, 0xD2, 0x01, 0x92, 0x01, 0x4A, 0x01, 0xD2, -0x06, 0x92, 0xFF, 0x4A, 0x06, 0xD2, 0x06, 0x92, 0xE9, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x06, 0x92, -0x02, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x02, 0xD4, 0x03, 0xD5, 0x04, 0xD6, 0x02, 0x92, 0x01, 0xD2, -0x01, 0x93, 0x04, 0x92, 0x49, 0xE3, 0x00, 0xD2, 0x0B, 0x10, 0x01, 0x92, 0x40, 0xA2, 0x62, 0x67, -0x03, 0x92, 0x6E, 0xEA, 0x02, 0x2A, 0x01, 0x92, 0x08, 0x10, 0x01, 0x92, 0x01, 0x4A, 0x01, 0xD2, -0x01, 0x93, 0x00, 0x92, 0x6E, 0xEA, 0xF1, 0x2A, 0x01, 0x92, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, -0xFF, 0x63, 0x02, 0xD4, 0x03, 0xD5, 0x04, 0xD6, 0x02, 0x92, 0x00, 0xD2, 0x12, 0x10, 0x03, 0x93, -0xFF, 0x6A, 0x4C, 0xEB, 0x00, 0x92, 0x40, 0xA2, 0x6E, 0xEA, 0x01, 0x5A, 0x58, 0x67, 0x62, 0x67, -0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0x93, 0x01, 0x4B, 0x00, 0xD3, 0x03, 0x22, 0x00, 0x92, 0xFF, 0x4A, -0x0B, 0x10, 0x00, 0x6A, 0x04, 0x93, 0x01, 0x23, 0x01, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x04, 0x93, -0xFF, 0x4B, 0x04, 0xD3, 0xE4, 0x2A, 0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x02, 0xD4, -0x03, 0xD5, 0x46, 0x67, 0x7D, 0x67, 0x50, 0xC3, 0x02, 0x92, 0x01, 0xD2, 0x03, 0x92, 0x00, 0xD2, -0x0A, 0x10, 0x00, 0x92, 0x60, 0xA2, 0x01, 0x92, 0x60, 0xC2, 0x01, 0x92, 0x01, 0x4A, 0x01, 0xD2, -0x00, 0x92, 0x01, 0x4A, 0x00, 0xD2, 0x00, 0x6A, 0x9D, 0x67, 0x70, 0xA4, 0x01, 0x23, 0x01, 0x6A, -0xFF, 0x6B, 0x6C, 0xEA, 0x9D, 0x67, 0x70, 0xA4, 0xFF, 0x4B, 0x9D, 0x67, 0x70, 0xC4, 0xE9, 0x2A, -0x02, 0x92, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, -0x04, 0xD2, 0x04, 0x92, 0x42, 0xA2, 0x40, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x04, 0x92, -0x41, 0xA2, 0x49, 0xE3, 0x7D, 0x67, 0x4A, 0xCB, 0x04, 0x92, 0x40, 0xA2, 0x62, 0x67, 0x9D, 0x67, -0x4A, 0xAC, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x54, 0x1B, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, -0xFF, 0x63, 0x44, 0x67, 0x03, 0xD5, 0x7D, 0x67, 0x44, 0xCB, 0x00, 0x6A, 0x9D, 0x67, 0x40, 0xC4, -0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x54, 0x9A, 0x7D, 0x67, 0x84, 0xAB, 0xFF, 0x6B, 0x8C, 0xEB, -0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x78, 0x9A, 0x9D, 0x67, 0x44, 0xAC, 0x42, 0x34, -0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, -0x8C, 0xEA, 0x03, 0x6C, 0x8C, 0xEA, 0x30, 0xF0, 0x20, 0x6C, 0xE1, 0xF4, 0x98, 0x9C, 0xA0, 0xA4, -0xFF, 0x6C, 0xAC, 0xEC, 0x00, 0xF6, 0x80, 0x35, 0x00, 0xF6, 0xA3, 0x35, 0x04, 0x6C, 0x8B, 0xEC, -0xAC, 0xEC, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8D, 0xEA, 0x00, 0xF6, 0x40, 0x34, -0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, -0x7C, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x5C, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, -0x7F, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x05, 0x10, 0x7D, 0x67, 0x40, 0xA3, 0x01, 0x4A, 0x9D, 0x67, -0x40, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x5C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, -0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x00, 0x52, 0x58, 0x67, 0x05, 0x2A, 0x7D, 0x67, -0x40, 0xA3, 0x64, 0x5A, 0x58, 0x67, 0xE8, 0x2A, 0x7D, 0x67, 0x40, 0xA3, 0x64, 0x5A, 0x58, 0x67, -0x0B, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x40, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, -0x03, 0x92, 0x60, 0xC2, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, -0xF9, 0x63, 0x0D, 0x62, 0x0E, 0xD4, 0x0E, 0x92, 0x06, 0xD2, 0x00, 0x6A, 0x05, 0xD2, 0x00, 0x6A, -0x7D, 0x67, 0x50, 0xC3, 0x06, 0x92, 0x40, 0xA2, 0x62, 0x67, 0x06, 0x92, 0x42, 0xA2, 0x83, 0x67, -0x00, 0x6D, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0x84, 0x1B, 0x01, 0x6A, 0x4B, 0xEA, 0x00, 0x6C, -0x18, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0x0D, 0x1B, 0x05, 0xD2, 0x05, 0x92, 0x9D, 0x67, 0x50, 0xC4, -0x06, 0x92, 0x40, 0xA2, 0x9D, 0x67, 0x70, 0xA4, 0x6E, 0xEA, 0x0B, 0x22, 0x06, 0x92, 0x40, 0xA2, -0x62, 0x67, 0x06, 0x92, 0x42, 0xA2, 0x83, 0x67, 0x00, 0x6D, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, -0x84, 0x1B, 0x10, 0x6A, 0x7D, 0x67, 0x5C, 0xC3, 0x1F, 0x6A, 0x9D, 0x67, 0x55, 0xCC, 0x06, 0x92, -0x40, 0xA2, 0x7D, 0x67, 0x5E, 0xC3, 0x07, 0x02, 0x82, 0x67, 0x00, 0x18, 0x54, 0x15, 0x0D, 0x97, -0x07, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, 0x01, 0x6A, 0x9D, 0x67, -0x41, 0xC4, 0x5D, 0x67, 0x68, 0xA2, 0x1F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x48, 0xC3, 0x00, 0x6A, -0x9D, 0x67, 0x40, 0xC4, 0x12, 0x10, 0x5D, 0x67, 0x68, 0xA2, 0x9D, 0x67, 0x40, 0xA4, 0x67, 0xEA, -0x01, 0x6A, 0x6C, 0xEA, 0x05, 0x2A, 0x7D, 0x67, 0x41, 0xA3, 0x02, 0x4A, 0x9D, 0x67, 0x41, 0xC4, -0x7D, 0x67, 0x40, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x40, 0xC4, 0x7D, 0x67, 0x40, 0xA3, 0x04, 0x5A, -0x58, 0x67, 0xE9, 0x2A, 0x7D, 0x67, 0x41, 0xA3, 0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x64, 0x67, -0x45, 0x67, 0x9D, 0x67, 0x68, 0xC4, 0x7D, 0x67, 0x4C, 0xC3, 0x9D, 0x67, 0x4C, 0xA4, 0x06, 0x2A, -0x7D, 0x67, 0x48, 0xA3, 0x52, 0x32, 0x9D, 0x67, 0x40, 0xC4, 0x19, 0x10, 0x7D, 0x67, 0x48, 0xA3, -0x56, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x5D, 0x67, -0x8C, 0xA2, 0xF0, 0x6A, 0x8C, 0xEA, 0x47, 0x32, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, -0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, -0x40, 0xA4, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x30, 0xF0, 0x20, 0x6A, -0xA1, 0xF5, 0x44, 0x9A, 0x40, 0xA2, 0x7D, 0x67, 0x59, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x58, 0xC4, -0x00, 0x6A, 0xBD, 0x67, 0x4D, 0xCD, 0x00, 0x6A, 0x7D, 0x67, 0x5C, 0xC3, 0x9D, 0x67, 0x5C, 0xA4, -0x01, 0x6D, 0xAE, 0xEA, 0x7D, 0x67, 0x5C, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x48, 0x9A, -0xBD, 0x67, 0x9C, 0xA5, 0x10, 0xF0, 0x20, 0x6B, 0x42, 0xF5, 0x09, 0x4B, 0x6D, 0xE4, 0x60, 0xDA, -0x5D, 0x67, 0x6D, 0xAA, 0x00, 0xF0, 0x1D, 0x02, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xC8, 0x04, -0x01, 0x6B, 0x6E, 0xEA, 0x60, 0xF1, 0x0E, 0x2A, 0x9D, 0x67, 0x58, 0xA4, 0x05, 0x2A, 0xBD, 0x67, -0x5D, 0xA5, 0xFF, 0x6B, 0x6E, 0xEA, 0x32, 0x22, 0x9D, 0x67, 0x58, 0xA4, 0x15, 0x2A, 0xBD, 0x67, -0x5D, 0xA5, 0x62, 0x67, 0x1F, 0x6A, 0x6C, 0xEA, 0x0F, 0x6B, 0x6E, 0xEA, 0x06, 0x2A, 0x9D, 0x67, -0x58, 0xA4, 0x01, 0x4A, 0xBD, 0x67, 0x58, 0xC5, 0x07, 0x10, 0x7D, 0x67, 0x5D, 0xA3, 0x82, 0x67, -0x00, 0x18, 0x25, 0x05, 0x9D, 0x67, 0x58, 0xC4, 0xBD, 0x67, 0x8D, 0xAD, 0x5D, 0x67, 0x7D, 0xA2, -0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xC2, 0x7D, 0x67, 0x58, 0xA3, -0xFF, 0x4A, 0x9D, 0x67, 0x58, 0xC4, 0xBD, 0x67, 0x4D, 0xAD, 0x01, 0x4A, 0x7D, 0x67, 0x4D, 0xCB, -0x9D, 0x67, 0x4D, 0xAC, 0x00, 0xF4, 0x00, 0x5A, 0x58, 0x67, 0xA8, 0x2A, 0x7D, 0x67, 0x4D, 0xAB, -0x01, 0x4A, 0x9D, 0x67, 0x4B, 0xCC, 0xBD, 0x67, 0x8B, 0xAD, 0x7D, 0x67, 0x4B, 0xAB, 0x6E, 0x42, -0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, -0xE1, 0xF7, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xC2, 0x9D, 0x67, 0x4B, 0xAC, 0xFF, 0x4A, 0xBD, 0x67, -0x4B, 0xCD, 0x7D, 0x67, 0x4B, 0xAB, 0x02, 0x5A, 0x58, 0x67, 0xE5, 0x22, 0x02, 0x6A, 0x7D, 0x67, -0x4B, 0xCB, 0x02, 0x6A, 0x9D, 0x67, 0x49, 0xCC, 0x00, 0x6A, 0xBD, 0x67, 0x50, 0xC5, 0x00, 0x6A, -0x7D, 0x67, 0x5C, 0xC3, 0x9D, 0x67, 0x5C, 0xA4, 0x01, 0x6D, 0xAE, 0xEA, 0x7D, 0x67, 0x5C, 0xC3, -0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x48, 0x9A, 0xBD, 0x67, 0x9C, 0xA5, 0x10, 0xF0, 0x20, 0x6B, -0x42, 0xF5, 0x09, 0x4B, 0x02, 0x4B, 0x6D, 0xE4, 0x60, 0xDA, 0x5D, 0x67, 0x6B, 0xAA, 0x30, 0xF0, -0x20, 0x6A, 0xE1, 0xF7, 0x18, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x62, 0x67, 0x1F, 0x6A, 0x6C, 0xEA, -0x0F, 0x6B, 0x6E, 0xEA, 0x28, 0x2A, 0x9D, 0x67, 0x4B, 0xAC, 0x61, 0x42, 0x30, 0xF0, 0x20, 0x6A, -0xE1, 0xF7, 0x18, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x82, 0x67, 0x00, 0x18, 0x25, 0x05, 0x01, 0x4A, -0xBD, 0x67, 0x55, 0xC5, 0x5D, 0x67, 0x6B, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x18, 0x4A, -0x49, 0xE3, 0x40, 0xA2, 0x62, 0x67, 0x9D, 0x67, 0x4B, 0xAC, 0x81, 0x42, 0x30, 0xF0, 0x20, 0x6A, -0xE1, 0xF7, 0x18, 0x4A, 0x49, 0xE4, 0x40, 0xA2, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x3B, 0x05, -0xBD, 0x67, 0x54, 0xC5, 0x1B, 0x10, 0x5D, 0x67, 0x6B, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, -0x18, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x82, 0x67, 0x00, 0x18, 0x25, 0x05, 0x7D, 0x67, 0x55, 0xC3, -0x9D, 0x67, 0x6B, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x18, 0x4A, 0x49, 0xE3, 0x40, 0xA2, -0x82, 0x67, 0x00, 0x6D, 0x00, 0x18, 0x3B, 0x05, 0xBD, 0x67, 0x54, 0xC5, 0x7D, 0x67, 0x54, 0xA3, -0x26, 0x5A, 0x58, 0x67, 0x1C, 0x22, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, -0x18, 0x4A, 0x51, 0xE3, 0xBD, 0x67, 0x6B, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x18, 0x4A, -0x4D, 0xE3, 0xBD, 0x67, 0x55, 0xA5, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xA7, 0x04, 0x5D, 0x67, -0x75, 0xA2, 0x9D, 0x67, 0x49, 0xAC, 0x49, 0xE3, 0xBD, 0x67, 0x49, 0xCD, 0x20, 0x10, 0x7D, 0x67, -0x54, 0xA3, 0x38, 0x5A, 0x58, 0x67, 0x1B, 0x2A, 0x5D, 0x67, 0x70, 0xA2, 0x30, 0xF0, 0x20, 0x6A, -0x23, 0xF1, 0x08, 0x4A, 0x51, 0xE3, 0xBD, 0x67, 0x6B, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, -0x18, 0x4A, 0x4D, 0xE3, 0xBD, 0x67, 0x55, 0xA5, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xA7, 0x04, -0x5D, 0x67, 0x70, 0xA2, 0x9D, 0x67, 0x55, 0xA4, 0x49, 0xE3, 0xBD, 0x67, 0x50, 0xC5, 0x5D, 0x67, -0x75, 0xA2, 0x9D, 0x67, 0x4B, 0xAC, 0x49, 0xE3, 0xBD, 0x67, 0x4B, 0xCD, 0x5D, 0x67, 0x6B, 0xAA, -0x9D, 0x67, 0x4D, 0xAC, 0x63, 0xEA, 0x58, 0x67, 0x5F, 0xF7, 0x0C, 0x22, 0x5D, 0x67, 0x69, 0xAA, -0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x78, 0xC2, 0x7D, 0x67, 0x49, 0xAB, -0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, -0xE1, 0xF7, 0x18, 0x4A, 0x61, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x9D, 0x67, -0x70, 0xA4, 0x80, 0xF4, 0x70, 0xC2, 0x00, 0x6A, 0xBD, 0x67, 0x4B, 0xCD, 0x00, 0x6A, 0x7D, 0x67, -0x5C, 0xC3, 0x9D, 0x67, 0x5C, 0xA4, 0x01, 0x6D, 0xAE, 0xEA, 0x7D, 0x67, 0x5C, 0xC3, 0x30, 0xF0, -0x20, 0x6A, 0xA1, 0xF5, 0x48, 0x9A, 0xBD, 0x67, 0x9C, 0xA5, 0x10, 0xF0, 0x20, 0x6B, 0x42, 0xF5, -0x09, 0x4B, 0x04, 0x4B, 0x6D, 0xE4, 0x60, 0xDA, 0x5D, 0x67, 0x6B, 0xAA, 0x30, 0xF0, 0x20, 0x6A, -0xA1, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x7D, 0x67, 0x8B, 0xAB, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF7, -0x18, 0x4B, 0x6D, 0xE4, 0x60, 0xA3, 0x60, 0xC2, 0x9D, 0x67, 0x4B, 0xAC, 0x01, 0x4A, 0xBD, 0x67, -0x4B, 0xCD, 0x5D, 0x67, 0x6B, 0xAA, 0x9D, 0x67, 0x49, 0xAC, 0x43, 0xEB, 0x58, 0x67, 0xD1, 0x2A, -0x01, 0x6A, 0x02, 0x10, 0x00, 0x65, 0x00, 0x6A, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, -0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x72, 0x10, 0x9D, 0x67, 0x50, 0xA4, -0x01, 0x6B, 0x6E, 0xEA, 0x9D, 0x67, 0x50, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x48, 0x9A, -0x7D, 0x67, 0x90, 0xA3, 0x10, 0xF0, 0x20, 0x6B, 0x83, 0xF0, 0x11, 0x4B, 0x6D, 0xE4, 0x60, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x50, 0x9A, 0x40, 0xA2, 0x9D, 0x67, 0x52, 0xC4, 0x7D, 0x67, -0x52, 0xA3, 0x9D, 0x67, 0x51, 0xC4, 0x5D, 0x67, 0x72, 0xA2, 0x0F, 0x6A, 0x6C, 0xEA, 0x50, 0x22, -0x9D, 0x67, 0x72, 0xA4, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x08, 0x22, 0x5D, 0x67, -0x71, 0xA2, 0x12, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x3A, 0x10, 0x9D, 0x67, -0x72, 0xA4, 0x02, 0x6A, 0x6C, 0xEA, 0x1C, 0x22, 0x5D, 0x67, 0x72, 0xA2, 0x20, 0x6A, 0x6C, 0xEA, -0x0F, 0x2A, 0x00, 0x18, 0x52, 0x05, 0x06, 0x2A, 0x9D, 0x67, 0x71, 0xA4, 0x20, 0x6A, 0x6D, 0xEA, -0x7D, 0x67, 0x51, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x54, 0x9A, 0x00, 0x6B, 0x60, 0xC2, -0x9D, 0x67, 0x71, 0xA4, 0x03, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x19, 0x10, -0x9D, 0x67, 0x72, 0xA4, 0x04, 0x6A, 0x6C, 0xEA, 0x08, 0x22, 0x5D, 0x67, 0x71, 0xA2, 0x05, 0x6A, -0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x0C, 0x10, 0x9D, 0x67, 0x72, 0xA4, 0x08, 0x6A, -0x6C, 0xEA, 0x07, 0x22, 0x5D, 0x67, 0x71, 0xA2, 0x09, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, -0x51, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x50, 0x9A, 0x9D, 0x67, 0x71, 0xA4, 0x60, 0xC2, -0x00, 0x18, 0x63, 0x06, 0x8B, 0x2A, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x30, 0xF0, 0x20, 0x6A, -0xA1, 0xF5, 0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, -0x43, 0x32, 0x00, 0x52, 0x58, 0x67, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x5C, 0x9A, -0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF5, 0x7C, 0x9B, 0x80, 0x9B, 0x10, 0xF0, 0x00, 0x6B, 0x8D, 0xEB, -0x60, 0xDA, 0x01, 0x6A, 0x0F, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, 0x5C, 0x9A, 0x30, 0xF0, -0x20, 0x6B, 0xA1, 0xF5, 0x7C, 0x9B, 0x80, 0x9B, 0x10, 0xF0, 0x01, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, -0x60, 0xDA, 0x00, 0x6A, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, -0x58, 0xC3, 0x00, 0x18, 0xA1, 0x0F, 0x02, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x99, 0x07, 0x05, 0x97, -0x03, 0x63, 0x00, 0xEF, 0x00, 0x00, 0x00, 0x00, 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, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0xE0, 0xF2, 0x09, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF0, -0x68, 0xDA, 0x10, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0xE0, 0xF2, 0x19, 0x4B, 0x30, 0xF0, 0x20, 0x6A, -0x00, 0xF0, 0x08, 0x4A, 0x61, 0xDA, 0x10, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x00, 0xF3, 0x09, 0x4B, -0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF0, 0x08, 0x4A, 0x62, 0xDA, 0x10, 0xF0, 0x20, 0x6A, 0x62, 0x67, -0x00, 0xF3, 0x19, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF0, 0x08, 0x4A, 0x63, 0xDA, 0x10, 0xF0, -0x20, 0x6A, 0x62, 0x67, 0x20, 0xF3, 0x09, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF0, 0x08, 0x4A, -0x64, 0xDA, 0x10, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x20, 0xF3, 0x19, 0x4B, 0x30, 0xF0, 0x20, 0x6A, -0x00, 0xF0, 0x08, 0x4A, 0x65, 0xDA, 0x10, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x40, 0xF3, 0x09, 0x4B, -0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF0, 0x08, 0x4A, 0x66, 0xDA, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, -0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF6, 0x50, 0x9A, 0x40, 0x9A, 0x42, 0x33, 0x72, 0x33, 0xFF, 0x6A, -0x4C, 0xEB, 0x03, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x01, 0x6B, -0x4E, 0xEB, 0x08, 0x23, 0x02, 0x6B, 0x4E, 0xEB, 0x09, 0x23, 0x0C, 0x2A, 0x19, 0x6A, 0x7D, 0x67, -0x51, 0xC3, 0x0C, 0x10, 0x32, 0x6A, 0x7D, 0x67, 0x51, 0xC3, 0x08, 0x10, 0x64, 0x6A, 0x7D, 0x67, -0x51, 0xC3, 0x04, 0x10, 0x38, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x7D, 0x67, 0x51, 0xA3, -0x82, 0x67, 0x00, 0x18, 0x92, 0x07, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0x77, 0xDA, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0x60, 0xF3, 0x6C, 0xC2, 0x00, 0x18, 0x88, 0x06, 0x05, 0x97, -0x03, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0x0F, 0x10, 0x5D, 0x67, -0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0xA0, 0xF4, -0x63, 0xC2, 0x7D, 0x67, 0x40, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, 0x40, 0xA3, -0x10, 0x5A, 0x58, 0x67, 0xEC, 0x2A, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0x2B, 0x10, 0x7D, 0x67, -0x40, 0xA3, 0x52, 0xF4, 0x60, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, -0x6E, 0xEA, 0x08, 0x22, 0x7D, 0x67, 0x40, 0xA3, 0x52, 0xF4, 0x60, 0x42, 0x1F, 0xF7, 0x00, 0x6A, -0x6C, 0xEA, 0x0A, 0x2A, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF6, 0x54, 0x9A, -0x49, 0xE3, 0x00, 0x6B, 0x60, 0xDA, 0x09, 0x10, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, -0x60, 0xF6, 0x58, 0x9A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xDA, 0x7D, 0x67, 0x40, 0xA3, 0x04, 0x4A, -0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, 0x40, 0xA3, 0x10, 0x5A, 0x58, 0x67, 0xD0, 0x2A, 0x01, 0x63, -0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0xCD, 0x06, 0x00, 0x18, 0xFE, 0x06, -0x00, 0x18, 0x64, 0x09, 0x00, 0x18, 0x05, 0x23, 0x00, 0x18, 0xB7, 0x1E, 0x00, 0x18, 0xDC, 0x0B, -0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x00, 0x6B, 0x00, 0xF4, 0x6E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, -0x00, 0xF4, 0x6F, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0x60, 0xF3, -0x6C, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0x60, 0xF3, 0x6D, 0xC2, -0x20, 0xE8, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x54, 0x9A, 0x01, 0x6B, 0x60, 0xC2, -0x20, 0xE8, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x58, 0x9A, 0x30, 0xF0, 0x20, 0x6B, -0x01, 0xF5, 0x78, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x20, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, -0x8C, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, -0x01, 0xF5, 0x7C, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x08, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, -0x8C, 0xEB, 0x60, 0xC2, 0x20, 0xE8, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x58, 0x9A, -0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF5, 0x78, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x01, 0x6B, -0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x20, 0xE8, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, -0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x7C, 0x9A, 0x02, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0x00, 0x6D, -0xC2, 0x67, 0x00, 0x18, 0x24, 0x04, 0x00, 0x6A, 0x7D, 0x67, 0x48, 0xCB, 0x0E, 0x10, 0x5D, 0x67, -0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x5C, 0x9A, 0x49, 0xE3, 0x04, 0x6B, 0x60, 0xC2, -0x7D, 0x67, 0x48, 0xAB, 0x20, 0x4A, 0x7D, 0x67, 0x48, 0xCB, 0x7D, 0x67, 0x48, 0xAB, 0x02, 0xF0, -0x00, 0x5A, 0x58, 0x67, 0xEC, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x60, 0x9A, 0x00, 0xF4, -0x00, 0x6A, 0x83, 0x67, 0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0x24, 0x04, 0x07, 0x97, 0x04, 0x63, -0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x44, 0x9A, -0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x40, 0x6A, -0x4B, 0xEA, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x0B, 0x6A, 0x6D, 0xEA, -0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x7D, 0x67, 0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, -0x41, 0xF5, 0x44, 0x9A, 0x9D, 0x67, 0x70, 0xA4, 0x60, 0xC2, 0x0A, 0x6C, 0x00, 0x18, 0x8D, 0x14, -0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x48, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x40, 0x6A, -0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x50, 0xA4, 0x40, 0x6B, 0x6E, 0xEA, -0x02, 0x2A, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, -0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, 0x48, 0xCB, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, -0x4C, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x83, 0xF5, 0x11, 0x4B, 0x60, 0xDA, 0x32, 0x10, 0x7D, 0x67, -0x48, 0xAB, 0x82, 0xF3, 0x08, 0x5A, 0x58, 0x67, 0x14, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, -0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x41, 0xF5, 0x70, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, -0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x54, 0x9A, 0x03, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, -0x1F, 0x10, 0x7D, 0x67, 0x48, 0xAB, 0x01, 0x4A, 0x7D, 0x67, 0x48, 0xCB, 0x14, 0x6C, 0x00, 0x18, -0x8D, 0x14, 0x7D, 0x67, 0x48, 0xAB, 0x33, 0x5A, 0x58, 0x67, 0x0B, 0x2A, 0x30, 0xF0, 0x20, 0x6A, -0x41, 0xF5, 0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x08, 0x6A, 0x6C, 0xEA, -0x06, 0x2A, 0x00, 0x18, 0x45, 0x07, 0x01, 0x6B, 0x6E, 0xEA, 0xC9, 0x2A, 0x01, 0x10, 0x00, 0x65, -0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x54, 0x9A, 0x02, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, 0x30, 0xF0, -0x20, 0x6A, 0x41, 0xF5, 0x4C, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x83, 0xF5, 0x11, 0x4B, 0x01, 0x4B, -0x60, 0xDA, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, -0x82, 0x67, 0x00, 0x18, 0x36, 0x14, 0x00, 0x18, 0x81, 0x14, 0x04, 0xD2, 0x07, 0x97, 0x04, 0x63, -0x00, 0xEF, 0x00, 0x65, 0x00, 0xD4, 0x01, 0xD5, 0x00, 0x92, 0x05, 0x5A, 0x58, 0x67, 0xC0, 0xF0, -0x06, 0x22, 0x00, 0x92, 0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x04, 0x4A, 0x49, 0xE3, -0x40, 0x9A, 0x00, 0xEA, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF5, -0x18, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, -0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF5, 0x5C, 0x9A, -0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x40, 0x9A, 0x00, 0x94, 0x30, 0xF0, -0x20, 0x6B, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x97, 0x10, -0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, -0x60, 0x9A, 0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4A, -0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x44, 0x9A, 0x01, 0x93, 0x60, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x48, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, -0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x71, 0x10, 0x00, 0x94, 0x00, 0x93, -0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, -0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x4C, 0x9A, 0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, -0x61, 0xF5, 0x50, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4B, -0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x4B, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, -0x68, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, -0x20, 0x6A, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, -0x61, 0xF5, 0x54, 0x9A, 0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x58, 0x9A, -0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, -0x60, 0xDA, 0x25, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF5, -0x18, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, -0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x5C, 0x9A, -0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x40, 0x9A, 0x00, 0x94, 0x30, 0xF0, -0x20, 0x6B, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x20, 0xE8, -0x00, 0xD4, 0x01, 0xD5, 0x00, 0x92, 0x01, 0x6B, 0x4E, 0xEB, 0x2B, 0x23, 0x01, 0x5A, 0x78, 0x67, -0x07, 0x2B, 0x02, 0x6B, 0x4E, 0xEB, 0x46, 0x23, 0x03, 0x6B, 0x6E, 0xEA, 0x64, 0x22, 0x83, 0x10, -0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, -0x60, 0x9A, 0x01, 0x92, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, 0x02, 0xF5, -0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x40, 0x9A, 0x00, 0x94, -0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, -0x62, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF5, 0x18, 0x4A, -0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x88, 0x34, -0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x48, 0x9A, -0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, -0x60, 0xDA, 0x41, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, 0x02, 0xF5, -0x18, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, -0x88, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, -0x50, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, -0x60, 0x9B, 0x60, 0xDA, 0x20, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x68, 0x33, -0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, -0x20, 0x6A, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, -0x61, 0xF5, 0x58, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4B, -0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x20, 0xE8, 0x00, 0xD4, 0x01, 0xD5, 0x00, 0x92, 0x04, 0x22, -0x01, 0x6B, 0x6E, 0xEA, 0x2A, 0x22, 0x51, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, -0x0E, 0x4B, 0x68, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4D, 0xEB, -0x30, 0xF0, 0x20, 0x6A, 0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x44, 0x9A, 0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, -0x81, 0xF5, 0x48, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF5, -0x18, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x28, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, -0x20, 0x6A, 0x0E, 0x4B, 0x68, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, -0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, -0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x4C, 0x9A, 0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, -0x20, 0x6A, 0x81, 0xF5, 0x50, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x0E, 0x4C, 0x88, 0x34, -0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x20, 0xE8, 0x00, 0xD4, 0x01, 0xD5, -0x00, 0x92, 0x04, 0x22, 0x01, 0x6B, 0x6E, 0xEA, 0x25, 0x22, 0x47, 0x10, 0x00, 0x94, 0x00, 0x93, -0x30, 0xF0, 0x20, 0x6A, 0x0E, 0x4B, 0x68, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0x9A, -0x01, 0x92, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF5, -0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x48, 0x9A, 0x00, 0x94, -0x30, 0xF0, 0x20, 0x6B, 0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, -0x60, 0xDA, 0x23, 0x10, 0x00, 0x94, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x0E, 0x4B, 0x68, 0x33, -0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0x01, 0x92, 0x4F, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, -0x20, 0x6A, 0x0E, 0x4C, 0x88, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x30, 0xF0, -0x20, 0x6A, 0x81, 0xF5, 0x50, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x0E, 0x4C, 0x88, 0x34, -0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x20, 0xE8, 0x30, 0xF0, 0x20, 0x6A, -0x00, 0x6B, 0x02, 0xF5, 0x78, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, -0x61, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0x62, 0xDA, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0x63, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, -0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x78, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, -0x61, 0xF5, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x61, 0x9B, 0x60, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, -0x62, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x58, 0x9A, 0x30, 0xF0, 0x20, 0x6B, -0x02, 0xF5, 0x18, 0x4B, 0x63, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x00, 0x6B, 0x6E, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0x6F, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, -0x6E, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, -0x02, 0xF5, 0x18, 0x4B, 0x6F, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x00, 0x6B, 0x6C, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, -0x02, 0xF5, 0x18, 0x4B, 0x6C, 0x9B, 0x60, 0xDA, 0x20, 0xE8, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, -0x41, 0xF5, 0x5C, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, -0x44, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x4C, 0x9A, -0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x54, 0x9A, 0x01, 0x6B, -0x6B, 0xEB, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x44, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, -0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x4C, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x58, 0x9A, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xDA, 0x20, 0xE8, -0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF3, 0x10, 0x6B, 0x02, 0xF5, 0x78, 0xDA, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x30, 0xF0, 0x20, 0x6B, 0x81, 0xF5, 0x7C, 0x9B, 0x61, 0xDA, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x01, 0x6B, 0x62, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0x01, 0x6B, 0x63, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, -0x64, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, -0x78, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, -0x02, 0xF5, 0x18, 0x4B, 0x61, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF5, 0x50, 0x9A, -0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x62, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, -0x61, 0xF5, 0x58, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x63, 0x9B, 0x60, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, -0x64, 0x9B, 0x60, 0xDA, 0x20, 0xE8, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x00, 0x6B, 0x6C, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, -0x02, 0xF5, 0x18, 0x4B, 0x6C, 0x9B, 0x60, 0xDA, 0x20, 0xE8, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x0E, 0x6B, 0x6E, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x0C, 0xF0, 0x01, 0x6B, 0x6F, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, 0x48, 0x9A, 0x30, 0xF0, -0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x6E, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF5, -0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x6F, 0x9B, 0x60, 0xDA, 0x20, 0xE8, -0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0x40, 0xF0, -0x70, 0xCA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x40, 0xF0, 0x70, 0xAA, 0xFF, 0x6A, -0x6C, 0xEA, 0x01, 0x6C, 0x02, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0x36, 0x13, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x40, 0xF0, 0x50, 0xAA, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, -0xFF, 0x6A, 0x6C, 0xEA, 0x01, 0x6C, 0x03, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0x36, 0x13, 0x05, 0x97, -0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x9F, 0x08, 0x00, 0x18, 0xD7, 0x08, -0x00, 0x18, 0xF0, 0x08, 0x00, 0x18, 0x23, 0x09, 0x00, 0x18, 0x1A, 0x09, 0x00, 0x18, 0x34, 0x09, -0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, -0x00, 0x18, 0x78, 0x09, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF0, -0x74, 0xC2, 0x00, 0x18, 0x22, 0x07, 0x00, 0x18, 0x52, 0x09, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF5, -0x40, 0x9A, 0x3F, 0x6B, 0x60, 0xC2, 0x00, 0x18, 0x0D, 0x07, 0x00, 0x18, 0x11, 0x07, 0x00, 0x18, -0x87, 0x09, 0x00, 0x18, 0x47, 0x1B, 0x00, 0x18, 0x2B, 0x07, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, -0xFF, 0x63, 0xE0, 0xF1, 0x1B, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, 0x41, 0xCB, 0x30, 0xF0, 0x20, 0x6A, -0x61, 0xF7, 0x5C, 0x9A, 0x9D, 0x67, 0x61, 0xAC, 0x60, 0xCA, 0x0F, 0x6A, 0x7D, 0x67, 0x40, 0xC3, -0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x40, 0x9A, 0x9D, 0x67, 0x60, 0xA4, 0x60, 0xC2, 0x30, 0xF0, -0x20, 0x6A, 0x81, 0xF7, 0x64, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x44, 0x9A, 0x80, 0xA2, -0xFF, 0x6A, 0x8C, 0xEA, 0xFB, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, -0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF7, 0x50, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, -0x4A, 0x33, 0xFF, 0x6A, 0x4C, 0xEB, 0x03, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, -0x40, 0xA3, 0x02, 0x2A, 0x02, 0x6A, 0x08, 0x10, 0x7D, 0x67, 0x40, 0xA3, 0x03, 0x6B, 0x6E, 0xEA, -0x02, 0x2A, 0x03, 0x6A, 0x01, 0x10, 0x01, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, -0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF7, 0x74, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF7, 0x54, 0x9A, -0x80, 0xAA, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0xFF, 0xF6, 0x1F, 0x6C, 0x8C, 0xEA, 0x40, 0xCB, -0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF7, 0x58, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF7, 0x78, 0x9B, -0x80, 0x9B, 0x01, 0x6B, 0x8D, 0xEB, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF7, 0x5C, 0x9A, -0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF7, 0x7C, 0x9B, 0x80, 0x9B, 0x00, 0xF4, 0x00, 0x6B, 0x8D, 0xEB, -0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF7, 0x40, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, -0x40, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF7, -0x40, 0x9A, 0x9D, 0x67, 0x71, 0xA4, 0x60, 0xC2, 0x0A, 0x6C, 0x00, 0x18, 0x8D, 0x14, 0x30, 0xF0, -0x20, 0x6A, 0xC1, 0xF7, 0x44, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x40, 0x6A, 0x4B, 0xEA, -0x6D, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF7, 0x44, 0x9A, 0x9D, 0x67, -0x71, 0xA4, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF7, 0x48, 0x9A, 0x80, 0x6B, 0x6B, 0xEB, -0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF7, 0x54, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, -0x40, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x50, 0xA4, 0x40, 0x6B, -0x6E, 0xEA, 0x0D, 0x2A, 0x0A, 0x6C, 0x00, 0x18, 0x8D, 0x14, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF7, -0x4C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF7, 0x70, 0x9B, 0x60, 0xDA, 0x11, 0x10, 0x9D, 0x67, -0x50, 0xA4, 0x80, 0x6B, 0x6E, 0xEA, 0x0C, 0x2A, 0x0A, 0x6C, 0x00, 0x18, 0x8D, 0x14, 0x30, 0xF0, -0x20, 0x6A, 0xC1, 0xF7, 0x4C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF7, 0x74, 0x9B, 0x60, 0xDA, -0x0A, 0x6C, 0x00, 0x18, 0x8D, 0x14, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF7, 0x4C, 0x9A, 0x30, 0xF0, -0x20, 0x6B, 0xC1, 0xF7, 0x78, 0x9B, 0x60, 0xDA, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, -0x60, 0xBA, 0x20, 0xE8, 0x40, 0xBA, 0x20, 0xE8, 0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, -0x9D, 0x67, 0x48, 0xA4, 0x4E, 0x32, 0xBD, 0x67, 0x43, 0xC5, 0xDD, 0x67, 0x68, 0xA6, 0x07, 0x6A, -0x6C, 0xEA, 0x7D, 0x67, 0x42, 0xC3, 0x9D, 0x67, 0x43, 0xA4, 0x42, 0xF4, 0x10, 0x4A, 0xBD, 0x67, -0x40, 0xCD, 0xDD, 0x67, 0x60, 0xAE, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, -0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x60, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x4C, 0x2A, -0xBD, 0x67, 0x60, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x62, 0x67, -0xDD, 0x67, 0x80, 0xAE, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, -0x06, 0x22, 0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, 0xDD, 0x67, -0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, -0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, 0x5D, 0x67, 0x80, 0xAA, -0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, -0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, 0xC5, 0x67, -0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8F, 0xEC, 0x00, 0xF6, -0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, -0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x4B, 0x10, 0x5D, 0x67, 0x60, 0xAA, 0x30, 0xF0, 0x20, 0x6A, -0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, -0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6E, 0xCE, 0xEA, 0x06, 0x22, 0x5D, 0x67, 0x80, 0xAA, 0x1F, 0xF7, -0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, 0xBD, 0x67, 0x80, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, -0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, -0x43, 0x32, 0x0E, 0x10, 0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, -0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, -0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, 0x80, 0x34, -0x00, 0xF6, 0x83, 0x34, 0x8F, 0xEC, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8C, 0xEA, -0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x01, 0x63, -0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, 0x9D, 0x67, 0x48, 0xA4, -0x4E, 0x32, 0xBD, 0x67, 0x43, 0xC5, 0xDD, 0x67, 0x68, 0xA6, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, -0x42, 0xC3, 0x9D, 0x67, 0x43, 0xA4, 0x42, 0xF4, 0x10, 0x4A, 0xBD, 0x67, 0x40, 0xCD, 0xDD, 0x67, -0x60, 0xAE, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, -0x9D, 0x67, 0x60, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x47, 0x2A, 0xBD, 0x67, 0x60, 0xAD, -0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0xDD, 0x67, 0x80, 0xAE, -0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x06, 0x22, 0xBD, 0x67, -0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, 0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, -0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, -0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, 0x5D, 0x67, 0x80, 0xAA, 0x30, 0xF0, 0x20, 0x6A, -0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, -0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, -0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8D, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, -0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x46, 0x10, 0x5D, 0x67, 0x60, 0xAA, 0x30, 0xF0, -0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, -0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6E, 0xCE, 0xEA, 0x06, 0x22, 0x5D, 0x67, 0x80, 0xAA, -0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, 0xBD, 0x67, 0x80, 0xAD, 0x30, 0xF0, 0x20, 0x6A, -0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, -0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, 0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, -0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, -0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, -0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8D, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, -0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x64, 0x67, -0x45, 0x67, 0x9D, 0x67, 0x68, 0xC4, 0xBD, 0x67, 0x4C, 0xC5, 0xDD, 0x67, 0x48, 0xA6, 0x4E, 0x32, -0x7D, 0x67, 0x43, 0xC3, 0x9D, 0x67, 0x68, 0xA4, 0x07, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x42, 0xC5, -0xDD, 0x67, 0x43, 0xA6, 0x42, 0xF4, 0x10, 0x4A, 0x7D, 0x67, 0x40, 0xCB, 0x9D, 0x67, 0x4C, 0xA4, -0x01, 0x6D, 0xAE, 0xEA, 0xC0, 0xF0, 0x0E, 0x2A, 0xDD, 0x67, 0x83, 0xA6, 0x5D, 0x67, 0x63, 0xA2, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0xA0, 0xF4, 0x43, 0xA2, 0x00, 0xF6, -0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xBD, 0x67, 0x42, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEA, -0x46, 0x67, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, -0x00, 0xF6, 0x63, 0x33, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x49, 0xE4, 0xA0, 0xF4, 0x63, 0xC2, 0x5D, 0x67, 0x60, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, -0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x60, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, -0x6C, 0xEA, 0x4C, 0x2A, 0xBD, 0x67, 0x60, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, -0x49, 0xE3, 0x62, 0x67, 0xDD, 0x67, 0x80, 0xAE, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, -0x00, 0x6C, 0x8E, 0xEA, 0x06, 0x22, 0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, -0x0F, 0x2A, 0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, -0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, -0x5D, 0x67, 0x80, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, -0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, -0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, -0x8F, 0xEC, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x34, -0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x14, 0x11, 0x5D, 0x67, 0x60, 0xAA, -0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0xBD, 0x67, 0x80, 0xAD, -0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6E, 0xCE, 0xEA, 0x06, 0x22, 0x5D, 0x67, -0x80, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, 0xBD, 0x67, 0x80, 0xAD, 0x30, 0xF0, -0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, -0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, 0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, -0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, -0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, -0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8F, 0xEC, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, -0x83, 0x34, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, -0x40, 0xC3, 0xC8, 0x10, 0x5D, 0x67, 0x83, 0xA2, 0xBD, 0x67, 0x63, 0xA5, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0xA0, 0xF4, 0x43, 0xA2, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, -0x63, 0x33, 0xDD, 0x67, 0x42, 0xA6, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEA, 0x46, 0x67, 0x00, 0xF6, -0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x4F, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, -0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0xA0, 0xF4, 0x63, 0xC2, 0x5D, 0x67, 0x60, 0xAA, -0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, -0x60, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x47, 0x2A, 0xBD, 0x67, 0x60, 0xAD, 0x30, 0xF0, -0x20, 0x6A, 0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0xDD, 0x67, 0x80, 0xAE, 0x1F, 0xF7, -0x00, 0x6A, 0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x06, 0x22, 0xBD, 0x67, 0x80, 0xAD, -0x1F, 0xF7, 0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, 0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, -0x20, 0xF5, 0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, -0x00, 0xF6, 0x43, 0x32, 0x0E, 0x10, 0x5D, 0x67, 0x80, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, -0x50, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, -0x43, 0x32, 0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, -0x80, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x8D, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, -0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0xC3, 0x46, 0x10, 0x5D, 0x67, 0x60, 0xAA, 0x30, 0xF0, 0x20, 0x6A, -0x20, 0xF5, 0x50, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0xBD, 0x67, 0x80, 0xAD, 0x1F, 0xF7, 0x00, 0x6A, -0x8C, 0xEA, 0x02, 0xF0, 0x00, 0x6E, 0xCE, 0xEA, 0x06, 0x22, 0x5D, 0x67, 0x80, 0xAA, 0x1F, 0xF7, -0x00, 0x6A, 0x8C, 0xEA, 0x0F, 0x2A, 0xBD, 0x67, 0x80, 0xAD, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, -0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, -0x43, 0x32, 0x0E, 0x10, 0xDD, 0x67, 0x80, 0xAE, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x50, 0x9A, -0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, -0xBD, 0x67, 0x82, 0xA5, 0x01, 0x6D, 0xC5, 0x67, 0xC4, 0xEC, 0x86, 0x67, 0x00, 0xF6, 0x80, 0x34, -0x00, 0xF6, 0x83, 0x34, 0x8D, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, -0x8C, 0xEA, 0x40, 0xC3, 0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, -0x9D, 0x67, 0x48, 0xA4, 0x4E, 0x32, 0x7D, 0x67, 0x41, 0xC3, 0x9D, 0x67, 0x68, 0xA4, 0x07, 0x6A, -0x6C, 0xEA, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, 0x61, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0x49, 0xE3, 0xA0, 0xF4, 0x43, 0xA2, 0x62, 0x67, 0x9D, 0x67, 0x40, 0xA4, 0x67, 0xEA, -0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, -0x01, 0x63, 0x20, 0xE8, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xC0, 0xF4, 0x45, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x06, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, -0x48, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x4C, 0x9A, 0x02, 0x6B, -0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x50, 0x9A, 0x04, 0x6B, 0x60, 0xDA, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, 0x4A, 0xA2, 0x46, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, -0xFF, 0x6B, 0x59, 0x4B, 0x83, 0x67, 0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0xD2, 0x17, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, 0x04, 0x6B, 0x8D, 0xEB, 0xC0, 0xF4, -0x65, 0xC2, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x60, 0xC4, -0x7D, 0x67, 0x44, 0xC3, 0x9D, 0x67, 0x40, 0xA4, 0x01, 0x6B, 0x4E, 0xEB, 0x1A, 0x23, 0x02, 0x6B, -0x4E, 0xEB, 0x20, 0x23, 0x27, 0x2A, 0x5D, 0x67, 0x64, 0xA2, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, -0x83, 0x67, 0x4C, 0xEC, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x01, 0x6B, 0x8C, 0xEB, -0xC0, 0xF4, 0xA5, 0xA2, 0x02, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, -0x11, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x9D, 0x67, 0x64, 0xA4, 0xC0, 0xF4, -0x68, 0xC2, 0x08, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x9D, 0x67, 0x64, 0xA4, -0xC0, 0xF4, 0x64, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x54, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, -0x6C, 0xEA, 0x62, 0x67, 0x10, 0x6A, 0x6C, 0xEA, 0x41, 0x22, 0x7D, 0x67, 0x40, 0xA3, 0x00, 0x52, -0x78, 0x67, 0x3C, 0x2B, 0x02, 0x52, 0x78, 0x67, 0x04, 0x2B, 0x02, 0x6B, 0x6E, 0xEA, 0x2B, 0x22, -0x35, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x78, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, -0x8C, 0xEA, 0x7F, 0x6C, 0x8C, 0xEA, 0x30, 0xF0, 0x20, 0x6C, 0x02, 0xF5, 0x18, 0x4C, 0xC0, 0xF4, -0xA5, 0xA4, 0x01, 0x6C, 0x8C, 0xED, 0xFF, 0x6C, 0xAC, 0xEC, 0x9C, 0x34, 0x00, 0xF6, 0x80, 0x34, -0x00, 0xF6, 0x83, 0x34, 0x8D, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, -0x8C, 0xEA, 0x40, 0xC3, 0x0B, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x5C, 0x9A, 0x30, 0xF0, -0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x64, 0xA3, 0x60, 0xC2, 0x20, 0xE8, 0x00, 0x65, -0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0xC3, 0xF1, 0x18, 0x4A, 0x82, 0x67, 0x00, 0x6D, -0x68, 0x6E, 0x00, 0x18, 0x24, 0x04, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x02, 0x6B, -0xC0, 0xF4, 0x62, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x01, 0x6B, 0xC0, 0xF4, -0x6B, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x01, 0x6B, 0xC0, 0xF4, 0x6C, 0xC2, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x0A, 0x6B, 0xC0, 0xF4, 0x6D, 0xC2, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x05, 0x6B, 0xC0, 0xF4, 0x72, 0xCA, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xE0, 0xF4, 0x43, 0xA2, 0x64, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0x0A, 0x6B, 0xC0, 0xF4, 0x7F, 0xC2, 0x00, 0x18, 0xEB, 0x10, 0x00, 0x6C, 0x00, 0x6D, -0x00, 0x18, 0x9A, 0x0B, 0x02, 0x6C, 0x0C, 0x6D, 0x00, 0x18, 0x9A, 0x0B, 0x01, 0x6C, 0x0C, 0x6D, -0x00, 0x18, 0x9A, 0x0B, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF0, 0x54, 0xA2, -0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xE3, 0xF1, 0x08, 0x4A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, -0x00, 0x18, 0x1D, 0x21, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x02, 0x6B, 0x20, 0xF5, -0x68, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x0F, 0x6B, 0x20, 0xF5, 0x69, 0xC2, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, 0x8A, 0xA2, 0x01, 0x6B, 0x8C, 0xEB, -0x83, 0x67, 0x28, 0x6B, 0x8D, 0xEB, 0x20, 0xF5, 0x6A, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0x07, 0x6B, 0x20, 0xF5, 0x6B, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xE0, 0xF4, 0x43, 0xA2, 0x64, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0xC0, 0xF4, 0x7E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x0A, 0x6B, -0xC0, 0xF4, 0x7F, 0xC2, 0x01, 0x6C, 0x00, 0x18, 0x36, 0x12, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, -0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x40, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, -0x7F, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x64, 0x9A, 0x30, 0xF0, -0x20, 0x6A, 0x80, 0xF5, 0x44, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0xF8, 0x6C, 0x8C, 0xEA, -0x40, 0xC3, 0x00, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x54, 0x1E, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, -0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, -0x03, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0x00, 0x6B, 0xC0, 0xF4, 0x6E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x00, 0x6B, 0xC0, 0xF4, 0x69, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, -0x85, 0xA2, 0x41, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x11, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, -0x66, 0xC2, 0x03, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x99, 0x07, 0x02, 0x6C, 0x01, 0x6D, 0x00, 0x18, -0x99, 0x07, 0x10, 0xF0, 0x00, 0x6A, 0x03, 0x6C, 0xA2, 0x67, 0x00, 0x18, 0x00, 0x08, 0x05, 0x97, -0x03, 0x63, 0x00, 0xEF, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x48, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, -0x6C, 0xEA, 0xFF, 0x6B, 0x6E, 0xEA, 0x02, 0x22, 0x00, 0x6A, 0x10, 0x10, 0x30, 0xF0, 0x20, 0x6A, -0x80, 0xF5, 0x4C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x07, 0x6A, 0x6C, 0xEA, -0x07, 0x6B, 0x6E, 0xEA, 0x02, 0x22, 0x00, 0x6A, 0x01, 0x10, 0x01, 0x6A, 0x20, 0xE8, 0x00, 0x65, -0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x50, 0x9A, 0x01, 0x6C, 0xA2, 0x67, -0x00, 0x18, 0x99, 0x07, 0x00, 0x6C, 0x08, 0x6D, 0x00, 0x18, 0x99, 0x07, 0x30, 0xF0, 0x20, 0x6A, -0x80, 0xF5, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x80, 0xF5, 0x64, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, -0x6C, 0xEC, 0x07, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, -0x80, 0xF5, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x92, 0xAB, -0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x01, 0x6B, 0x6E, 0xEA, -0x1A, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, 0x21, 0x6B, -0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xC0, 0xF4, 0x48, 0xA2, 0x62, 0x67, 0x04, 0x6A, 0x6C, 0xEA, 0x0F, 0x2A, 0x04, 0x6C, 0x01, 0x6D, -0x00, 0x18, 0x09, 0x0E, 0x0A, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, -0x85, 0xA2, 0x20, 0x6B, 0x8D, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, -0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x60, 0x2A, -0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x50, 0x9A, 0x01, 0x6C, 0xA2, 0x67, 0x00, 0x18, 0x00, 0x08, -0x00, 0x6C, 0x08, 0x6D, 0x00, 0x18, 0x00, 0x08, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x58, 0x9A, -0x00, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x50, 0x9A, 0x02, 0x6B, 0x60, 0xDA, -0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x26, 0x2A, 0x00, 0x18, 0x39, 0x21, 0x00, 0x18, 0x83, 0x0D, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, 0x05, 0x6B, 0x6B, 0xEB, -0x8C, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, -0x86, 0xA2, 0x02, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x03, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, -0x66, 0xC2, 0x04, 0x10, 0x0C, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x09, 0x0E, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, 0x05, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, -0x65, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x64, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, -0x44, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0xF8, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x02, 0x10, -0x00, 0x18, 0x6C, 0x0C, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x64, 0x67, 0x45, 0x67, -0x9D, 0x67, 0x60, 0xC4, 0x7D, 0x67, 0x44, 0xC3, 0x9D, 0x67, 0x40, 0xA4, 0x01, 0x6B, 0x4E, 0xEB, -0x04, 0x23, 0x02, 0x6B, 0x6E, 0xEA, 0x1F, 0x22, 0x4F, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0x02, 0x6B, 0xC0, 0xF4, 0x6B, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xC0, 0xF4, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6C, 0xC2, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, 0x40, 0x6B, 0x8D, 0xEB, -0xC0, 0xF4, 0x65, 0xC2, 0x31, 0x10, 0x9D, 0x67, 0x44, 0xA4, 0x0D, 0x2A, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xC0, 0xF4, 0x6B, 0xC2, 0x0B, 0x10, 0x7D, 0x67, 0x44, 0xA3, 0x6F, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6B, 0xC2, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xC0, 0xF4, 0x6C, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, -0x40, 0x6B, 0x8D, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, -0x06, 0xD4, 0x00, 0x18, 0x3C, 0x0C, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, -0x60, 0xA2, 0x7F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x82, 0x67, 0x00, 0x18, 0x98, 0x0C, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, -0x0D, 0x22, 0x06, 0x92, 0x61, 0xA2, 0x0F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, -0x06, 0x92, 0x42, 0xA2, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xCF, 0x0C, 0x05, 0x97, 0x03, 0x63, -0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x5D, 0x0C, 0x01, 0x6B, 0x6E, 0xEA, -0x14, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x45, 0xA2, 0x04, 0x6B, -0x6C, 0xEA, 0x0D, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x44, 0xA2, -0x05, 0x5A, 0x58, 0x67, 0x06, 0x22, 0x01, 0x6A, 0x06, 0x10, 0x00, 0x65, 0x03, 0x10, 0x00, 0x65, -0x01, 0x10, 0x00, 0x65, 0x00, 0x6A, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, -0x00, 0x18, 0x5D, 0x0C, 0x01, 0x6B, 0x6E, 0xEA, 0x37, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, 0x62, 0x67, 0x03, 0x6A, 0x6C, 0xEA, 0x2F, 0x2A, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x44, 0xA2, 0x2A, 0x2A, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, 0x62, 0x67, 0x04, 0x6A, 0x6C, 0xEA, 0x22, 0x2A, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, 0x62, 0x67, 0x10, 0x6A, -0x6C, 0xEA, 0x1A, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x45, 0xA2, -0x20, 0x6B, 0x6C, 0xEA, 0x13, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, -0x4D, 0xA2, 0x0E, 0x2A, 0x01, 0x6A, 0x0E, 0x10, 0x00, 0x65, 0x0B, 0x10, 0x00, 0x65, 0x09, 0x10, -0x00, 0x65, 0x07, 0x10, 0x00, 0x65, 0x05, 0x10, 0x00, 0x65, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, -0x00, 0x65, 0x00, 0x6A, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, -0x80, 0xF5, 0x5C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, -0xA0, 0xF5, 0x40, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x0F, 0x2A, 0x30, 0xF0, 0x20, 0x6A, -0xA0, 0xF5, 0x44, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x02, 0x6A, 0x6C, 0xEA, -0x06, 0x22, 0x01, 0x6A, 0x06, 0x10, 0x00, 0x65, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, -0x00, 0x6A, 0x20, 0xE8, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, -0x58, 0xA3, 0x38, 0x22, 0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x01, 0x6B, 0x6E, 0xEA, 0x32, 0x2A, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x05, 0x6B, 0x6B, 0xEB, -0x8C, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x0F, 0x6C, 0x2B, 0x6D, 0x00, 0x18, 0x54, 0x1E, 0x30, 0xF0, -0x20, 0x6A, 0x80, 0xF5, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x40, 0x9A, 0x80, 0xA2, -0xFF, 0x6A, 0x8C, 0xEA, 0xBF, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x00, 0x6C, 0x08, 0x6D, 0x00, 0x18, -0xC8, 0x03, 0x01, 0x6B, 0x6E, 0xEA, 0x0E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xC0, 0xF4, 0x86, 0xA2, 0x01, 0x6B, 0x8D, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x01, 0x6C, 0x06, 0x6D, -0x00, 0x18, 0x9A, 0x0B, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, -0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x40, 0x9A, -0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x7F, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x00, 0x6C, 0x00, 0x6D, -0x00, 0x18, 0x54, 0x1E, 0x01, 0x6C, 0x0C, 0x6D, 0x00, 0x18, 0x9A, 0x0B, 0x05, 0x97, 0x03, 0x63, -0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xC0, 0xF4, 0x46, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, -0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x80, 0xF5, 0x60, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, -0x40, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x01, 0x6C, 0x04, 0x6D, 0x00, 0x18, -0x9A, 0x0B, 0x12, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, -0x80, 0xF5, 0x40, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x7F, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, -0x01, 0x6C, 0x0C, 0x6D, 0x00, 0x18, 0x9A, 0x0B, 0x00, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x54, 0x1E, -0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x6C, 0x00, 0x18, -0x6A, 0x0B, 0x01, 0x6B, 0x6E, 0xEA, 0x24, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xC0, 0xF4, 0x86, 0xA2, 0x09, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x6F, 0x6C, -0x2C, 0x6D, 0x00, 0x18, 0x54, 0x1E, 0x01, 0x6C, 0x08, 0x6D, 0x00, 0x18, 0xC8, 0x03, 0x01, 0x6B, -0x6E, 0xEA, 0x0E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, -0x02, 0x6B, 0x8D, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x01, 0x6C, 0x0E, 0x6D, 0x00, 0x18, 0x9A, 0x0B, -0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x46, 0xA2, 0x08, 0x6B, 0x6C, 0xEA, 0x05, 0x2A, 0x01, 0x6C, -0x0C, 0x6D, 0x00, 0x18, 0x9A, 0x0B, 0x25, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x40, 0x9A, -0x30, 0xF0, 0x20, 0x6B, 0x80, 0xF5, 0x60, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x40, 0x6B, -0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x40, 0x9A, -0x30, 0xF0, 0x20, 0x6B, 0x80, 0xF5, 0x60, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x80, 0x6B, -0x6B, 0xEB, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x01, 0x6C, 0x04, 0x6D, 0x00, 0x18, -0x9A, 0x0B, 0x00, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x54, 0x1E, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, -0xFD, 0x63, 0x05, 0x62, 0xFF, 0x6C, 0x2D, 0x6D, 0x00, 0x18, 0x54, 0x1E, 0x00, 0x18, 0x9B, 0x1D, -0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF5, 0x48, 0x9A, 0x08, 0x6B, 0x60, 0xC2, 0x00, 0x6C, 0x08, 0x6D, -0x00, 0x18, 0x99, 0x07, 0x00, 0x18, 0xA3, 0x21, 0x01, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x9A, 0x0B, -0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x6F, 0x6C, 0x2E, 0x6D, -0x00, 0x18, 0x54, 0x1E, 0x01, 0x6C, 0x02, 0x6D, 0x00, 0x18, 0x9A, 0x0B, 0x05, 0x97, 0x03, 0x63, -0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x00, 0x18, -0x39, 0x21, 0x7D, 0x67, 0x58, 0xA3, 0x04, 0x22, 0x00, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x54, 0x1E, -0x01, 0x6C, 0x04, 0x6D, 0x00, 0x18, 0x9A, 0x0B, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, -0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x22, 0x1E, 0x00, 0x18, 0x43, 0x1E, 0x05, 0x97, 0x03, 0x63, -0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x78, 0xC4, -0x7D, 0x67, 0x5C, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x46, 0xA2, -0x01, 0x6B, 0x6C, 0xEA, 0x20, 0xF1, 0x19, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xC0, 0xF4, 0x46, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, 0x20, 0xF1, 0x0F, 0x2A, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x9D, 0x67, 0x78, 0xA4, 0x6E, 0xEA, 0x20, 0xF1, -0x04, 0x22, 0x7D, 0x67, 0x58, 0xA3, 0x0D, 0x5A, 0x78, 0x67, 0x00, 0xF1, 0x1E, 0x23, 0x48, 0x33, -0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF5, 0x14, 0x4A, 0x49, 0xE3, 0x40, 0x9A, 0x00, 0xEA, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x0E, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, -0x00, 0x18, 0xC6, 0x0D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, -0x03, 0x2A, 0x01, 0x6C, 0x00, 0x18, 0xF9, 0x0D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xC0, 0xF4, 0x48, 0xA2, 0x06, 0x6C, 0x8E, 0xEA, 0x02, 0x2A, 0x00, 0x18, 0x91, 0x0D, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x04, 0x6B, 0x6E, 0xEA, 0x0B, 0x2A, -0x9D, 0x67, 0x5C, 0xA4, 0x06, 0x22, 0x7D, 0x67, 0x5C, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x61, 0x0D, -0x02, 0x10, 0x00, 0x18, 0x83, 0x0D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, -0x48, 0xA2, 0x08, 0x6C, 0x8E, 0xEA, 0xC0, 0xF0, 0x0D, 0x2A, 0x00, 0x18, 0xD4, 0x02, 0xD5, 0x10, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x03, 0x2A, 0x01, 0x6C, -0x00, 0x18, 0xF9, 0x0D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, -0x06, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x00, 0x18, 0x91, 0x0D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x0E, 0x6C, 0x8E, 0xEA, 0x07, 0x2A, 0x00, 0x18, 0x15, 0x0D, -0x01, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x00, 0x18, 0xC6, 0x0D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x0C, 0x6C, 0x8E, 0xEA, 0x80, 0xF0, 0x1D, 0x2A, 0x00, 0x18, -0x15, 0x0D, 0x01, 0x6B, 0x6E, 0xEA, 0x80, 0xF0, 0x19, 0x2A, 0x00, 0x18, 0xAE, 0x0D, 0x9D, 0x10, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x0E, 0x6C, 0x8E, 0xEA, -0x07, 0x2A, 0x00, 0x18, 0x15, 0x0D, 0x01, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x00, 0x18, 0xC6, 0x0D, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x06, 0x6C, 0x8E, 0xEA, -0x02, 0x2A, 0x00, 0x18, 0x91, 0x0D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, -0x48, 0xA2, 0x0C, 0x6B, 0x6E, 0xEA, 0x07, 0x2A, 0x00, 0x18, 0x15, 0x0D, 0x01, 0x6C, 0x8E, 0xEA, -0x02, 0x2A, 0x00, 0x18, 0xAE, 0x0D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, -0x48, 0xA2, 0x04, 0x6B, 0x6E, 0xEA, 0x64, 0x2A, 0x00, 0x18, 0x27, 0x0D, 0x01, 0x6C, 0x8E, 0xEA, -0x61, 0x2A, 0x00, 0x18, 0xE4, 0x0D, 0x61, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xC0, 0xF4, 0x48, 0xA2, 0x0E, 0x6B, 0x6E, 0xEA, 0x07, 0x2A, 0x00, 0x18, 0x15, 0x0D, 0x01, 0x6C, -0x8E, 0xEA, 0x02, 0x2A, 0x00, 0x18, 0xC6, 0x0D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xC0, 0xF4, 0x48, 0xA2, 0x06, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x00, 0x18, 0x91, 0x0D, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x0C, 0x6C, 0x8E, 0xEA, 0x07, 0x2A, -0x00, 0x18, 0x15, 0x0D, 0x01, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x00, 0x18, 0xAE, 0x0D, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x03, 0x2A, 0x01, 0x6C, 0x00, 0x18, -0xF9, 0x0D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x04, 0x6C, -0x8E, 0xEA, 0x22, 0x2A, 0x00, 0x18, 0xF2, 0x0D, 0x20, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x0C, 0x6B, 0x6E, 0xEA, 0x17, 0x2A, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x45, 0xA2, 0x20, 0x6B, 0x6C, 0xEA, 0x0E, 0x22, 0x00, 0x18, -0xCC, 0x02, 0x0B, 0x10, 0x00, 0x65, 0x09, 0x10, 0x00, 0x65, 0x07, 0x10, 0x00, 0x65, 0x05, 0x10, -0x00, 0x65, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, -0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, -0x09, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x08, 0x6B, -0x6E, 0xEA, 0x07, 0x2A, 0x00, 0x18, 0x4F, 0x0D, 0x01, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x00, 0x18, -0x04, 0x0E, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x45, 0xA2, 0x01, 0x6B, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, -0xB0, 0x0E, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x44, 0xA2, 0x82, 0x67, 0x01, 0x6D, 0x00, 0x18, 0x09, 0x0E, -0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0x7D, 0x0B, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x0C, 0x6B, 0x6E, 0xEA, -0x16, 0x22, 0x0C, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x09, 0x0E, 0x00, 0x6C, 0x00, 0x6D, 0x00, 0x18, -0x54, 0x1E, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x01, 0x6B, -0x8D, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x00, 0x6C, 0x08, 0x6D, 0x00, 0x18, 0xC8, 0x03, 0x05, 0x97, -0x03, 0x63, 0x00, 0xEF, 0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, 0x48, 0xCB, 0x30, 0xF0, -0x20, 0x6A, 0xA0, 0xF5, 0x4C, 0x9A, 0x40, 0xAA, 0x7D, 0x67, 0x48, 0xCB, 0x5D, 0x67, 0x68, 0xAA, -0x18, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x1F, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xC0, 0xF4, 0x49, 0xA2, 0xFE, 0x6B, 0x6C, 0xEA, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, -0xC0, 0xF4, 0x49, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, -0xFD, 0x6B, 0x6C, 0xEA, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x49, 0xC3, -0x00, 0x18, 0xC6, 0x0E, 0x7B, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x08, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, -0x2C, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, -0x6C, 0xEA, 0x01, 0x6B, 0x6E, 0xEA, 0x2F, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xC0, 0xF4, 0x69, 0xA2, 0x01, 0x6A, 0x4D, 0xEB, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x69, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xC0, 0xF4, 0x41, 0xA2, 0xF0, 0x6B, 0x6C, 0xEA, 0x20, 0x6B, 0x6E, 0xEA, 0x03, 0x22, 0x00, 0x18, -0x67, 0x03, 0x11, 0x10, 0x00, 0x18, 0xCE, 0x0E, 0x0E, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, 0xFE, 0x6B, 0x6C, 0xEA, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, -0x18, 0x4B, 0xC0, 0xF4, 0x49, 0xC3, 0x7D, 0x67, 0x48, 0x8B, 0x00, 0x52, 0x58, 0x67, 0x28, 0x22, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x69, 0xA2, 0x02, 0x6A, 0x4D, 0xEB, -0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x69, 0xC2, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, 0x49, 0xA2, 0xFF, 0x6B, 0x55, 0x4B, -0x83, 0x67, 0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0xD2, 0x17, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, 0x02, 0x6B, 0x8D, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, 0x0E, 0x10, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, 0xFD, 0x6B, 0x6C, 0xEA, -0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x49, 0xC3, 0x07, 0x97, 0x04, 0x63, -0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, 0xA0, 0xF0, -0x1D, 0x22, 0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x01, 0x6B, 0x6E, 0xEA, 0xA0, 0xF0, 0x16, 0x2A, -0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF5, 0x50, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0x00, 0xF5, 0x7C, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, -0x61, 0xA2, 0x0F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x3A, 0x22, 0x00, 0x52, 0x78, 0x67, -0x3C, 0x2B, 0x03, 0x52, 0x58, 0x67, 0x39, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xC0, 0xF4, 0x4C, 0xA2, 0x6F, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0xC0, 0xF4, 0x6C, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, -0x4C, 0xA2, 0x07, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4E, 0xA2, -0x1B, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4C, 0xA2, 0x0C, 0x2A, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6C, 0xC2, 0x01, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x05, 0x10, -0x01, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x01, 0x10, 0x00, 0x65, 0x7D, 0x67, 0x50, 0xA3, 0x5E, 0x22, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x69, 0xA2, 0x10, 0x6A, 0x4D, 0xEB, -0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x69, 0xC2, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4E, 0xA2, 0x09, 0x22, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4E, 0xA2, 0x01, 0x6B, 0x6E, 0xEA, 0x16, 0x2A, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4D, 0xA2, 0x62, 0x67, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4E, 0xA2, 0x49, 0xE3, 0xFF, 0x6B, 0x55, 0x4B, -0x83, 0x67, 0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0xD2, 0x17, 0x1A, 0x10, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4D, 0xA2, 0x82, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0xC0, 0xF4, 0x4E, 0xA2, 0x62, 0x67, 0x43, 0x67, 0x44, 0x32, 0x69, 0xE2, 0xFE, 0x4A, -0x49, 0xE4, 0xFF, 0x6B, 0x55, 0x4B, 0x83, 0x67, 0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0xD2, 0x17, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x62, 0x67, 0x04, 0x6A, -0x6C, 0xEA, 0x04, 0x2A, 0x04, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x09, 0x0E, 0x07, 0x97, 0x04, 0x63, -0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, 0x54, 0x22, -0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x01, 0x6B, 0x6E, 0xEA, 0x4E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, -0xA0, 0xF5, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x6B, 0xA3, -0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF5, 0x50, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF5, 0x7C, 0xDA, 0x01, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xC0, 0xF4, 0x6C, 0xC2, 0x7D, 0x67, 0x50, 0xA3, -0x2B, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x69, 0xA2, 0x10, 0x6A, -0x4D, 0xEB, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, -0x69, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4D, 0xA2, 0xFF, 0x6B, -0x55, 0x4B, 0x83, 0x67, 0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0xD2, 0x17, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x62, 0x67, 0x04, 0x6A, 0x6C, 0xEA, 0x04, 0x2A, -0x04, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x09, 0x0E, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, -0xFD, 0x63, 0x05, 0x62, 0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x01, 0x6B, 0x6E, 0xEA, 0xE0, 0xF0, -0x13, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, -0x6C, 0xEA, 0xE0, 0xF0, 0x09, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, -0x41, 0xA2, 0x0F, 0x6B, 0x6C, 0xEA, 0x01, 0x6B, 0x6E, 0xEA, 0x34, 0x2A, 0x30, 0xF0, 0x20, 0x6A, -0xA0, 0xF5, 0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0xC0, 0xF4, 0x6C, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF5, 0x5C, 0x9A, 0x60, 0xA2, -0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6B, 0xC2, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4C, 0xA2, 0x07, 0x2A, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4B, 0xA2, 0x06, 0x10, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4C, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, -0xC0, 0xF4, 0x4C, 0xC3, 0x00, 0x18, 0xFD, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xC0, 0xF4, 0x85, 0xA2, 0x20, 0x6B, 0x8D, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xC0, 0xF4, 0x6E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, -0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x92, 0xAB, 0xFF, 0x6B, -0x8C, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x58, 0x9A, 0x00, 0x6B, 0x60, 0xC2, -0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF5, 0x50, 0x9A, 0x01, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, 0xFD, 0x6B, 0x6C, 0xEA, 0x30, 0xF0, 0x20, 0x6B, -0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x49, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xC0, 0xF4, 0x49, 0xA2, 0xEF, 0x6B, 0x6C, 0xEA, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, -0xC0, 0xF4, 0x49, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x61, 0xA2, -0x0F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0x4A, 0x03, 0x5A, 0x58, 0x67, 0x02, 0x22, -0x00, 0x18, 0xE1, 0x0E, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x45, 0xA2, -0x40, 0x6B, 0x6C, 0xEA, 0x49, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, -0x46, 0xA2, 0x10, 0x6B, 0x6C, 0xEA, 0x40, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xC0, 0xF4, 0x6C, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4B, 0xA2, -0x6E, 0xEA, 0x32, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, -0x10, 0x6B, 0x8D, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF5, 0x54, 0x9A, -0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x6B, 0xA3, 0x60, 0xC2, 0x10, 0xF0, -0x00, 0x6A, 0x03, 0x6C, 0xA2, 0x67, 0x00, 0x18, 0x99, 0x07, 0x03, 0x6C, 0x01, 0x6D, 0x00, 0x18, -0x00, 0x08, 0x02, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x00, 0x08, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0xC0, 0xF4, 0x4C, 0xA2, 0x6F, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6C, 0xC2, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, -0x1C, 0x65, 0x85, 0x67, 0x66, 0x67, 0x47, 0x67, 0xD8, 0x67, 0xBD, 0x67, 0xC0, 0xC5, 0xBD, 0x67, -0x84, 0xC5, 0xDD, 0x67, 0x68, 0xC6, 0x7D, 0x67, 0x4C, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0xC0, 0xF4, 0x46, 0xA2, 0x20, 0x6B, 0x6C, 0xEA, 0x00, 0xF1, 0x0C, 0x2A, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x45, 0xA2, 0x01, 0x6B, 0x6C, 0xEA, 0x1F, 0x22, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xE0, 0xF4, 0x43, 0xA2, 0x64, 0x42, 0xFF, 0x6A, -0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7B, 0xC2, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xE0, 0xF4, 0x43, 0xA2, 0x63, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7A, 0xC2, 0x13, 0x10, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x05, 0x6B, 0xC0, 0xF4, 0x7B, 0xC2, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x04, 0x6B, 0xC0, 0xF4, 0x7A, 0xC2, 0x9D, 0x67, 0x48, 0xA4, 0x05, 0x4A, -0xBD, 0x67, 0x48, 0xC5, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x79, 0xA2, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x5A, 0xA2, 0x63, 0xEA, 0x58, 0x67, -0x1F, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x9D, 0x67, 0x68, 0xA4, 0xC0, 0xF4, -0x6D, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7B, 0xA2, 0xBD, 0x67, -0x44, 0xA5, 0x4F, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0xDD, 0x67, 0x40, 0xA6, 0x4D, 0xE3, 0xFF, 0x6A, -0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7E, 0xC2, 0x2B, 0x10, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x5A, 0xA2, 0x9D, 0x67, 0x64, 0xA4, -0x4F, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0xBD, 0x67, 0x48, 0xA5, 0x4D, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6D, 0xC2, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xC0, 0xF4, 0x5A, 0xA2, 0x4F, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0xC0, 0xF4, 0x7E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, -0x5E, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x5B, 0xA2, -0x0A, 0x4A, 0x62, 0xEA, 0x58, 0x67, 0x10, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xC0, 0xF4, 0x5B, 0xA2, 0x67, 0x42, 0x03, 0x4B, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xC0, 0xF4, 0x4D, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, -0x5E, 0xA2, 0x23, 0x4A, 0x62, 0xEA, 0x58, 0x67, 0x10, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0xC0, 0xF4, 0x5E, 0xA2, 0x67, 0x42, 0x1C, 0x4B, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6D, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0xC0, 0xF4, 0x5E, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xC0, 0xF4, 0x72, 0xCA, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x54, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, -0x6C, 0xEA, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x52, 0xAA, -0x6E, 0xEA, 0x0D, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF5, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, -0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x92, 0xAB, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x41, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, -0xC0, 0xF4, 0x66, 0xC2, 0x0A, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, -0x86, 0xA2, 0x40, 0x6B, 0x8D, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x20, 0xE8, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x04, 0x6B, 0x20, 0xF5, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0x03, 0x6B, 0x20, 0xF5, 0x61, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x64, 0x6B, 0x20, 0xF5, 0x62, 0xCA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x05, 0x6B, -0x20, 0xF5, 0x64, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x05, 0x6B, 0x20, 0xF5, -0x65, 0xC2, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x00, 0x6A, -0x9D, 0x67, 0x53, 0xC4, 0x00, 0x6A, 0x7D, 0x67, 0x52, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF5, -0x50, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF5, 0x78, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF5, 0x78, 0x9A, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF5, 0x5C, 0x9A, 0x43, 0xEB, 0x58, 0x67, 0x80, 0xF0, 0x08, 0x2A, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x45, 0xA2, 0x01, 0x6B, 0x6C, 0xEA, -0x30, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF5, 0x78, 0x9A, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF5, 0x5C, 0x9A, 0x4B, 0xE3, 0x42, 0x33, 0x6A, 0x33, -0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x5E, 0xA2, -0x4F, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xE0, 0xF4, -0x43, 0xA2, 0x4D, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x20, 0xF5, 0x40, 0xA2, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x0E, 0x4A, 0x7D, 0x67, 0x53, 0xC3, -0x26, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF5, 0x78, 0x9A, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF5, 0x5C, 0x9A, 0x4B, 0xE3, 0x42, 0x33, 0x6A, 0x33, -0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x5E, 0xA2, -0x4F, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, -0x41, 0xA2, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x0A, 0x4A, 0x9D, 0x67, 0x53, 0xC4, 0x7D, 0x67, -0x53, 0xA3, 0x2D, 0x5A, 0x58, 0x67, 0x24, 0x22, 0x5D, 0x67, 0x93, 0xA2, 0x5D, 0x67, 0x73, 0xA2, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0xE0, 0xF4, 0x44, 0xA2, 0x61, 0x42, -0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0xE0, 0xF4, -0x64, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x5C, 0xA2, 0x61, 0x42, -0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7C, 0xC2, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x5C, 0xA2, 0x62, 0x67, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, 0x42, 0xAA, 0x43, 0xEB, 0x58, 0x67, 0x20, 0xF1, -0x18, 0x2A, 0x00, 0x6A, 0x7D, 0x67, 0x52, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x54, 0xC4, 0x23, 0x10, -0x5D, 0x67, 0x74, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0xE0, 0xF4, -0x64, 0xA2, 0x9D, 0x67, 0x52, 0xA4, 0x49, 0xE3, 0x7D, 0x67, 0x52, 0xC3, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, 0x44, 0xA2, 0x9D, 0x67, 0x72, 0xA4, 0x63, 0xEA, 0x58, 0x67, -0x05, 0x22, 0x7D, 0x67, 0x54, 0xA3, 0x9D, 0x67, 0x51, 0xC4, 0x0A, 0x10, 0x7D, 0x67, 0x54, 0xA3, -0x01, 0x4A, 0x9D, 0x67, 0x54, 0xC4, 0x7D, 0x67, 0x54, 0xA3, 0x2D, 0x5A, 0x58, 0x67, 0xD8, 0x2A, -0x00, 0x6A, 0x7D, 0x67, 0x52, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x54, 0xC4, 0x2B, 0x10, 0x5D, 0x67, -0x74, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0xE0, 0xF4, 0x64, 0xA2, -0x9D, 0x67, 0x52, 0xA4, 0x49, 0xE3, 0x7D, 0x67, 0x52, 0xC3, 0x9D, 0x67, 0x72, 0xA4, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, 0x42, 0xAA, 0x82, 0x67, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, 0x44, 0xA2, 0x4B, 0xE4, 0x62, 0xEA, 0x58, 0x67, 0x05, 0x22, -0x7D, 0x67, 0x54, 0xA3, 0x9D, 0x67, 0x50, 0xC4, 0x0A, 0x10, 0x7D, 0x67, 0x54, 0xA3, 0x01, 0x4A, -0x9D, 0x67, 0x54, 0xC4, 0x7D, 0x67, 0x54, 0xA3, 0x2D, 0x5A, 0x58, 0x67, 0xD0, 0x2A, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x9D, 0x67, 0x71, 0xA4, 0xE0, 0xF4, 0x61, 0xC2, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x9D, 0x67, 0x70, 0xA4, 0xE0, 0xF4, 0x62, 0xC2, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xE0, 0xF4, 0x41, 0xA2, 0x0A, 0x5A, 0x58, 0x67, 0x18, 0x2A, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xE0, 0xF4, 0x41, 0xA2, 0x68, 0x42, 0xFE, 0x4B, -0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x79, 0xC2, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xC0, 0xF4, 0x78, 0xC2, 0x17, 0x10, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xC0, 0xF4, 0x79, 0xC2, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xE0, 0xF4, 0x41, 0xA2, 0x0A, 0x6B, 0x4F, 0xE3, 0xFF, 0x6A, -0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x78, 0xC2, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xE0, 0xF4, 0x62, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0xE0, 0xF4, 0x41, 0xA2, 0x4F, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7F, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xC0, 0xF4, 0x45, 0xA2, 0x01, 0x6B, 0x6C, 0xEA, 0x19, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0xC0, 0xF4, 0x7F, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, -0x40, 0xA2, 0x4D, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7F, 0xC2, 0x18, 0x10, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7F, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x20, 0xF5, 0x41, 0xA2, 0x4D, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7F, 0xC2, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x5F, 0xA2, 0x0A, 0x5A, 0x58, 0x67, 0x07, 0x22, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x0A, 0x6B, 0xC0, 0xF4, 0x7F, 0xC2, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x5F, 0xA2, 0x62, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7F, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0xC0, 0xF4, 0x58, 0xA2, 0x82, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xC0, 0xF4, 0x59, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, -0x5F, 0xA2, 0xA3, 0x67, 0xC2, 0x67, 0x03, 0x6F, 0x00, 0x18, 0x54, 0x10, 0x00, 0x6C, 0x00, 0x18, -0x36, 0x12, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6E, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x20, 0xF5, 0x48, 0xA2, 0x63, 0xEA, 0x58, 0x67, 0x64, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0xE0, 0xF4, 0x40, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xE0, 0xF4, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xE0, 0xF4, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, 0x45, 0xA2, -0x63, 0xEA, 0x58, 0x67, 0x46, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, -0x58, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xC0, 0xF4, 0x78, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x8D, 0xA2, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x4E, 0xA2, 0x62, 0x67, 0x43, 0x67, -0x44, 0x32, 0x6D, 0xE2, 0xFF, 0x6A, 0x6C, 0xEA, 0x4D, 0xE4, 0xFF, 0x6A, 0x6C, 0xEA, 0x6E, 0x42, -0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7F, 0xC2, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x58, 0xA2, 0x82, 0x67, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x59, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x5F, 0xA2, 0xA3, 0x67, 0xC2, 0x67, 0x04, 0x6F, 0x00, 0x18, -0x54, 0x10, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, -0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0x0F, 0x10, 0x5D, 0x67, -0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0xE0, 0xF4, -0x64, 0xC2, 0x7D, 0x67, 0x40, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, 0x40, 0xA3, -0x2D, 0x5A, 0x58, 0x67, 0xEC, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, -0xC0, 0xF4, 0x7C, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xE0, 0xF4, -0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xC0, 0xF4, 0x78, 0xC2, -0x7D, 0x67, 0x48, 0xA3, 0x01, 0x6B, 0x6E, 0xEA, 0x0E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0x2D, 0x6B, 0xE0, 0xF4, 0x61, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x00, 0x6B, 0xE0, 0xF4, 0x62, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, -0x01, 0x6B, 0x6E, 0xEA, 0x1F, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, -0x41, 0xA2, 0xF0, 0x6B, 0x6C, 0xEA, 0x0B, 0x22, 0x0C, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x09, 0x0E, -0x00, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x54, 0x1E, 0x00, 0x18, 0x7D, 0x0B, 0x0B, 0x10, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x04, 0x2A, 0x04, 0x6C, 0x01, 0x6D, -0x00, 0x18, 0x09, 0x0E, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x45, 0xA2, 0x40, 0x6B, 0x6C, 0xEA, -0x0D, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x46, 0xA2, 0x10, 0x6B, -0x6C, 0xEA, 0x04, 0x22, 0x02, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x00, 0x08, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x45, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, 0x26, 0x22, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, 0x03, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, -0xC0, 0xF4, 0x65, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, -0xFD, 0x6B, 0x6C, 0xEA, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x49, 0xC3, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, 0x62, 0x67, 0x07, 0x6A, -0x6C, 0xEA, 0x43, 0x2A, 0x00, 0x18, 0xC6, 0x0E, 0x40, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0xC0, 0xF4, 0x4E, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xC0, 0xF4, 0x49, 0xA2, 0xEF, 0x6B, 0x6C, 0xEA, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, -0xC0, 0xF4, 0x49, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x6E, 0xA2, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x20, 0xF5, 0x48, 0xA2, 0x63, 0xEA, 0x58, 0x67, -0x12, 0x22, 0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x01, 0x6B, 0x6E, 0xEA, 0x0E, 0x2A, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, 0x21, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, -0xC0, 0xF4, 0x65, 0xC2, 0x02, 0x10, 0x00, 0x18, 0xC6, 0x0E, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, -0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x02, 0xD4, 0x00, 0x6A, 0x00, 0xD2, 0x0E, 0x10, 0x00, 0x92, -0x02, 0x93, 0x83, 0x67, 0x86, 0xEA, 0x44, 0x67, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, -0x6C, 0xEA, 0x08, 0x2A, 0x00, 0x92, 0x01, 0x4A, 0x00, 0xD2, 0x00, 0x92, 0x20, 0x5A, 0x58, 0x67, -0xEE, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x00, 0x92, 0x01, 0x63, 0x20, 0xE8, 0xFB, 0x63, 0x09, 0x62, -0x0A, 0xD4, 0x0B, 0xD5, 0x0A, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x40, 0x9A, 0x49, 0xE3, -0x40, 0x9A, 0x06, 0xD2, 0x0B, 0x92, 0x82, 0x67, 0x00, 0x18, 0xB9, 0x12, 0x04, 0xD2, 0x06, 0x93, -0x0B, 0x92, 0x4C, 0xEB, 0x04, 0x92, 0x83, 0x67, 0x86, 0xEA, 0x44, 0x67, 0x05, 0xD2, 0x05, 0x92, -0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x0A, 0xD4, 0x0B, 0xD5, -0x0C, 0xD6, 0x0B, 0x92, 0x01, 0x4A, 0x21, 0x22, 0x0A, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, -0x40, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x06, 0xD2, 0x0B, 0x92, 0x82, 0x67, 0x00, 0x18, 0xB9, 0x12, -0x05, 0xD2, 0x0B, 0x92, 0x4F, 0xEB, 0x06, 0x92, 0x4C, 0xEB, 0x05, 0x92, 0x0C, 0x94, 0xA4, 0x67, -0xA4, 0xEA, 0x45, 0x67, 0x6D, 0xEA, 0x04, 0xD2, 0x0A, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, -0x40, 0x9A, 0x49, 0xE3, 0x04, 0x93, 0x60, 0xDA, 0x08, 0x10, 0x0A, 0x93, 0x30, 0xF0, 0x20, 0x6A, -0x00, 0xF6, 0x40, 0x9A, 0x49, 0xE3, 0x0C, 0x93, 0x60, 0xDA, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, -0xFF, 0x63, 0x02, 0xD4, 0x03, 0xD5, 0x04, 0xD6, 0x03, 0x92, 0x01, 0x4A, 0x1A, 0x22, 0x02, 0x93, -0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x40, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x01, 0xD2, 0x03, 0x92, -0x4F, 0xEB, 0x01, 0x92, 0x4C, 0xEB, 0x04, 0x94, 0x03, 0x92, 0x8C, 0xEA, 0x6D, 0xEA, 0x00, 0xD2, -0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x40, 0x9A, 0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, -0x08, 0x10, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x40, 0x9A, 0x49, 0xE3, 0x04, 0x93, -0x60, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x1C, 0x65, 0x85, 0x67, -0x66, 0x67, 0x47, 0x67, 0xD8, 0x67, 0xBD, 0x67, 0xCC, 0xCD, 0xBD, 0x67, 0x9C, 0xC5, 0xDD, 0x67, -0x20, 0xF0, 0x60, 0xC6, 0x7D, 0x67, 0x52, 0xCB, 0x0A, 0x92, 0x00, 0x6B, 0x60, 0xCA, 0x0B, 0x10, -0x01, 0x6C, 0x00, 0x18, 0x8D, 0x14, 0x0A, 0x92, 0x40, 0xAA, 0x61, 0x42, 0xFF, 0xF7, 0x1F, 0x6A, -0x4C, 0xEB, 0x0A, 0x92, 0x60, 0xCA, 0x9D, 0x67, 0x6C, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, -0x02, 0xF0, 0x00, 0x6D, 0xAE, 0xEA, 0x06, 0x22, 0xDD, 0x67, 0x6C, 0xAE, 0x1F, 0xF7, 0x00, 0x6A, -0x6C, 0xEA, 0x0B, 0x2A, 0x5D, 0x67, 0x6C, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x44, 0x9A, -0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x0A, 0x10, 0x9D, 0x67, 0x6C, 0xAC, 0x30, 0xF0, -0x20, 0x6A, 0x00, 0xF6, 0x40, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, -0x7C, 0xA5, 0x4C, 0xEB, 0xDD, 0x67, 0x20, 0xF0, 0x40, 0xA6, 0x6E, 0xEA, 0x07, 0x22, 0x0A, 0x92, -0x40, 0xAA, 0x9D, 0x67, 0x72, 0xAC, 0x63, 0xEA, 0x58, 0x67, 0xC2, 0x2A, 0x0A, 0x92, 0x40, 0xAA, -0x9D, 0x67, 0x72, 0xAC, 0x63, 0xEA, 0x58, 0x67, 0x02, 0x2A, 0x00, 0x6A, 0x01, 0x10, 0x01, 0x6A, -0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x65, 0x67, 0x46, 0x67, 0xBD, 0x67, -0x88, 0xC5, 0x9D, 0x67, 0x6C, 0xC4, 0xBD, 0x67, 0x50, 0xC5, 0x5D, 0x67, 0x70, 0xA2, 0x9D, 0x67, -0x4C, 0xA4, 0x40, 0x32, 0x40, 0x32, 0x6D, 0xEA, 0x00, 0xD2, 0xBD, 0x67, 0x48, 0xA5, 0x08, 0x2A, -0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x48, 0x9A, 0x6D, 0xEA, 0x00, 0xD2, 0x07, 0x10, -0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x4C, 0x9A, 0x6D, 0xEA, 0x00, 0xD2, 0x30, 0xF0, -0x20, 0x6A, 0x00, 0xF6, 0x50, 0x9A, 0x00, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, -0x50, 0x9A, 0x00, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x00, 0xF6, 0x74, 0x9B, 0x8C, 0xEB, 0x60, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x58, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x01, 0x63, 0x20, 0xE8, -0xFB, 0x63, 0x09, 0x62, 0x0B, 0xD5, 0x0C, 0xD6, 0x0D, 0xD7, 0x0E, 0x93, 0x0F, 0x92, 0xBD, 0x67, -0x20, 0xF0, 0x88, 0xC5, 0x9D, 0x67, 0x78, 0xC4, 0xBD, 0x67, 0x5C, 0xC5, 0x00, 0x6A, 0x05, 0xD2, -0x00, 0x6A, 0x04, 0xD2, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xCA, 0x13, -0x02, 0x2A, 0x00, 0x6A, 0xCD, 0x10, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x06, 0x5A, 0x78, 0x67, -0x20, 0x23, 0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF6, 0x1C, 0x4A, 0x49, 0xE3, 0x40, 0x9A, -0x00, 0xEA, 0x02, 0xF2, 0x00, 0x6A, 0x05, 0xD2, 0x16, 0x10, 0x02, 0xF2, 0x10, 0x6A, 0x05, 0xD2, -0x12, 0x10, 0x22, 0xF2, 0x00, 0x6A, 0x05, 0xD2, 0x0E, 0x10, 0x22, 0xF2, 0x10, 0x6A, 0x05, 0xD2, -0x0A, 0x10, 0x42, 0xF2, 0x00, 0x6A, 0x05, 0xD2, 0x06, 0x10, 0x42, 0xF2, 0x10, 0x6A, 0x05, 0xD2, -0x02, 0x10, 0x00, 0x6A, 0xA5, 0x10, 0x0D, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, 0x54, 0x9A, -0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, 0x58, 0x9A, 0x6D, 0xEA, 0x04, 0xD2, 0x7D, 0x67, -0x5C, 0xA3, 0x08, 0x22, 0x04, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF6, 0x5C, 0x9A, 0x6D, 0xEA, -0x04, 0xD2, 0x07, 0x10, 0x04, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF6, 0x40, 0x9A, 0x6C, 0xEA, -0x04, 0xD2, 0x9D, 0x67, 0x58, 0xA4, 0x08, 0x22, 0x04, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF6, -0x44, 0x9A, 0x6D, 0xEA, 0x04, 0xD2, 0x07, 0x10, 0x04, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF6, -0x48, 0x9A, 0x6C, 0xEA, 0x04, 0xD2, 0x05, 0x93, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, -0x00, 0x6D, 0xAE, 0xEA, 0x05, 0x22, 0x05, 0x93, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0E, 0x2A, -0x05, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF6, 0x4C, 0x9A, 0x49, 0xE3, 0x0B, 0x94, 0x30, 0xF0, -0x20, 0x6B, 0x40, 0xF6, 0x70, 0x9B, 0x8C, 0xEB, 0x60, 0xDA, 0x0D, 0x10, 0x05, 0x93, 0x30, 0xF0, -0x20, 0x6A, 0x40, 0xF6, 0x54, 0x9A, 0x49, 0xE3, 0x0B, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x40, 0xF6, -0x70, 0x9B, 0x8C, 0xEB, 0x60, 0xDA, 0x05, 0x92, 0x64, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, -0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x05, 0x92, 0x64, 0x42, 0x1F, 0xF7, 0x00, 0x6A, -0x6C, 0xEA, 0x0E, 0x2A, 0x05, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF6, 0x58, 0x9A, 0x49, 0xE3, -0x0C, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0x40, 0xF6, 0x70, 0x9B, 0x8C, 0xEB, 0x60, 0xDA, 0x0D, 0x10, -0x05, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF6, 0x5C, 0x9A, 0x49, 0xE3, 0x0C, 0x94, 0x30, 0xF0, -0x20, 0x6B, 0x40, 0xF6, 0x70, 0x9B, 0x8C, 0xEB, 0x60, 0xDA, 0x05, 0x92, 0x67, 0x42, 0x01, 0x4B, -0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x05, 0x92, -0x67, 0x42, 0x01, 0x4B, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x09, 0x2A, 0x05, 0x93, 0x30, 0xF0, -0x20, 0x6A, 0x60, 0xF6, 0x40, 0x9A, 0x49, 0xE3, 0x04, 0x93, 0x60, 0xDA, 0x08, 0x10, 0x05, 0x93, -0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF6, 0x44, 0x9A, 0x49, 0xE3, 0x04, 0x93, 0x60, 0xDA, 0x01, 0x6A, -0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x44, 0x67, 0x7D, 0x67, -0x20, 0xF0, 0x40, 0xC3, 0xE0, 0xF3, 0x08, 0x6A, 0x04, 0xD2, 0x17, 0x10, 0x01, 0x6C, 0x00, 0x18, -0x8D, 0x14, 0x04, 0x92, 0xFF, 0x4A, 0x04, 0xD2, 0x04, 0x92, 0x0F, 0x2A, 0x30, 0xF0, 0x20, 0x6A, -0x60, 0xF6, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x60, 0xF6, 0x68, 0x9B, 0x80, 0x9B, 0x08, 0xF0, -0x00, 0x6B, 0x8D, 0xEB, 0x60, 0xDA, 0x00, 0x6A, 0x15, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF6, -0x4C, 0x9A, 0x60, 0xAA, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x9D, 0x67, 0x20, 0xF0, -0x40, 0xA4, 0x01, 0x6C, 0xA4, 0x67, 0xA4, 0xEA, 0x45, 0x67, 0x6C, 0xEA, 0x01, 0x52, 0x58, 0x67, -0xD5, 0x22, 0x01, 0x6A, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x30, 0xF0, -0x20, 0x6A, 0x60, 0xF6, 0x4C, 0x9A, 0x40, 0xAA, 0x7D, 0x67, 0x40, 0xCB, 0x01, 0x63, 0x20, 0xE8, -0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0x60, 0xF6, 0x4C, 0x9A, 0x40, 0xAA, 0x7D, 0x67, 0x40, 0xCB, -0x01, 0x63, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, -0x7D, 0x67, 0x50, 0xA3, 0x01, 0x6B, 0x6E, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, -0x60, 0xF6, 0x5C, 0x9A, 0x7D, 0x67, 0x90, 0xA3, 0x10, 0xF0, 0x20, 0x6B, 0xC9, 0xF7, 0x05, 0x4B, -0x6D, 0xE4, 0x60, 0xDA, 0x00, 0x18, 0xD5, 0x09, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x77, 0x9A, 0x02, 0x6A, 0x6C, 0xEA, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x77, 0x9A, 0x03, 0x6A, 0x4B, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x77, 0xDA, 0x00, 0x18, 0x79, 0x17, 0x00, 0x18, 0xD4, 0x09, 0x00, 0x18, 0xD5, 0x09, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0x9A, 0x04, 0x6A, 0x6C, 0xEA, 0x0F, 0x22, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0x9A, 0x05, 0x6A, 0x4B, 0xEA, 0x4C, 0xEB, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0xDA, 0x00, 0x18, 0x22, 0x15, 0x00, 0x18, 0xD4, 0x09, -0x00, 0x18, 0xD5, 0x09, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, -0x7F, 0x6B, 0x6C, 0xEA, 0x10, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, -0x64, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x48, 0xA2, 0x6E, 0xEA, -0x02, 0x22, 0x00, 0x18, 0xC6, 0x0E, 0x00, 0x18, 0xBE, 0x0E, 0x00, 0x18, 0xD4, 0x09, 0x00, 0x18, -0xD5, 0x09, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0x9A, 0x10, 0x6A, 0x6C, 0xEA, -0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0x9A, 0x11, 0x6A, 0x4B, 0xEA, -0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0xDA, 0x00, 0x18, 0xE4, 0x3A, -0x00, 0x18, 0xD4, 0x09, 0x7D, 0x17, 0x00, 0x65, 0x00, 0xD4, 0x00, 0x92, 0x06, 0x2A, 0x30, 0xF0, -0x20, 0x6A, 0x64, 0x6B, 0xE2, 0xF3, 0x7C, 0xDA, 0x05, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0x93, -0xE2, 0xF3, 0x7C, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x5C, 0x9A, 0x28, 0x6B, 0x4E, 0xEB, -0x42, 0x23, 0x29, 0x5A, 0x78, 0x67, 0x0A, 0x23, 0x14, 0x6B, 0x4E, 0xEB, 0x24, 0x23, 0x19, 0x6B, -0x4E, 0xEB, 0x2D, 0x23, 0x0A, 0x6B, 0x6E, 0xEA, 0x12, 0x22, 0x72, 0x10, 0x50, 0x6B, 0x4E, 0xEB, -0x4A, 0x23, 0x51, 0x5A, 0x78, 0x67, 0x04, 0x23, 0x32, 0x6B, 0x6E, 0xEA, 0x38, 0x22, 0x68, 0x10, -0x64, 0x6B, 0x4E, 0xEB, 0x4C, 0x23, 0xC8, 0x6B, 0x6E, 0xEA, 0x55, 0x22, 0x61, 0x10, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0x6B, 0x02, 0xF4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF0, 0x00, 0x6B, -0x02, 0xF4, 0x64, 0xDA, 0x55, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x03, 0x6B, 0x02, 0xF4, 0x60, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x00, 0x6B, 0x02, 0xF4, 0x64, 0xDA, 0x49, 0x10, 0x30, 0xF0, -0x20, 0x6A, 0x09, 0x6B, 0x02, 0xF4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x04, 0xF4, 0x00, 0x6B, -0x02, 0xF4, 0x64, 0xDA, 0x3D, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x05, 0x6B, 0x02, 0xF4, 0x60, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x00, 0x6B, 0x02, 0xF4, 0x64, 0xDA, 0x31, 0x10, 0x30, 0xF0, -0x20, 0x6A, 0x11, 0x6B, 0x02, 0xF4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x08, 0xF4, 0x00, 0x6B, -0x02, 0xF4, 0x64, 0xDA, 0x25, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x0A, 0x6B, 0x02, 0xF4, 0x60, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0x05, 0xF0, 0x00, 0x6B, 0x02, 0xF4, 0x64, 0xDA, 0x19, 0x10, 0x30, 0xF0, -0x20, 0x6A, 0x22, 0x6B, 0x02, 0xF4, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x11, 0xF0, 0x00, 0x6B, -0x02, 0xF4, 0x64, 0xDA, 0x0D, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x43, 0x6B, 0x02, 0xF4, 0x60, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0x30, 0xF0, 0x20, 0x6B, 0xA0, 0xF6, 0x7C, 0x9B, 0x02, 0xF4, 0x64, 0xDA, -0x20, 0xE8, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0xE2, 0xF3, 0x5C, 0x9A, 0x20, 0xE8, 0x00, 0x65, -0xFF, 0x63, 0x02, 0xD4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x44, 0x9A, 0x02, 0x93, 0x58, 0xEB, -0x12, 0xEA, 0x00, 0xD2, 0x00, 0x92, 0xFF, 0x4A, 0x00, 0xD2, 0x00, 0x92, 0xFB, 0x2A, 0x01, 0x63, -0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x02, 0xD4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, 0x40, 0x9A, -0x02, 0x93, 0x58, 0xEB, 0x12, 0xEA, 0x00, 0xD2, 0x00, 0x92, 0xFF, 0x4A, 0x00, 0xD2, 0x00, 0x92, -0xFB, 0x2A, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, -0x48, 0xCB, 0x1C, 0x10, 0x7D, 0x67, 0x48, 0xAB, 0xE0, 0xF3, 0x08, 0x5A, 0x58, 0x67, 0x0E, 0x2A, -0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF4, 0x68, 0x9B, -0x80, 0x9B, 0x80, 0x6B, 0x8D, 0xEB, 0x60, 0xDA, 0x00, 0x6A, 0x16, 0x10, 0x7D, 0x67, 0x48, 0xAB, -0x01, 0x4A, 0x7D, 0x67, 0x48, 0xCB, 0x0A, 0x6C, 0x00, 0x18, 0x8D, 0x14, 0x30, 0xF0, 0x20, 0x6A, -0xA1, 0xF4, 0x4C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, -0xFF, 0x6A, 0x6C, 0xEA, 0xD7, 0x2A, 0x01, 0x6A, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, -0xFF, 0x63, 0x44, 0x67, 0x03, 0xD5, 0x7D, 0x67, 0x44, 0xCB, 0x00, 0x6A, 0x7D, 0x67, 0x44, 0xC3, -0x10, 0x10, 0x5D, 0x67, 0x64, 0xA2, 0x03, 0x92, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, -0x50, 0x9A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xDA, 0x7D, 0x67, 0x44, 0xA3, 0x04, 0x4A, 0x7D, 0x67, -0x44, 0xC3, 0x7D, 0x67, 0x44, 0xA3, 0x18, 0x5A, 0x58, 0x67, 0xEB, 0x2A, 0x5D, 0x67, 0x64, 0xAA, -0xE7, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x00, 0xD2, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, -0x54, 0x9A, 0x6C, 0xEA, 0x00, 0xD2, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x58, 0x9A, -0x6D, 0xEA, 0x00, 0xD2, 0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x50, 0x9A, 0x49, 0xE3, -0x00, 0x93, 0x60, 0xDA, 0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x5C, 0x9A, 0x49, 0xE3, -0x03, 0x94, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF4, 0x7C, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, -0x6C, 0xEC, 0x10, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x01, 0x63, 0x20, 0xE8, -0xFD, 0x63, 0x05, 0x62, 0x06, 0xD4, 0x07, 0xD5, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x4A, 0xA2, -0x07, 0x93, 0x41, 0xC3, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x6A, 0xC2, 0x06, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x50, 0x9A, 0x49, 0xE3, 0x62, 0x67, -0x07, 0x92, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0x30, 0x04, 0x06, 0x93, 0x30, 0xF0, -0x20, 0x6A, 0xC1, 0xF4, 0x40, 0x9A, 0x49, 0xE3, 0x82, 0x67, 0x07, 0x92, 0x62, 0x42, 0x07, 0x92, -0x47, 0xAA, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0x30, 0x04, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, -0xFB, 0x63, 0x09, 0x62, 0x0A, 0xD4, 0x00, 0x18, 0x96, 0x14, 0x02, 0x2A, 0x00, 0x6A, 0x58, 0x10, -0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF4, 0x44, 0x9A, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF4, -0x48, 0x9A, 0x6C, 0xEA, 0x07, 0xD2, 0x07, 0x92, 0x01, 0x4A, 0x06, 0xD2, 0x30, 0xF0, 0x20, 0x6A, -0xC1, 0xF4, 0x4C, 0x9A, 0x06, 0x94, 0xFF, 0xF7, 0x1F, 0x6B, 0x8C, 0xEB, 0x60, 0xCA, 0x30, 0xF0, -0x20, 0x6A, 0xC1, 0xF4, 0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF4, 0x70, 0x9B, 0x80, 0xA3, -0xFF, 0x6B, 0x8C, 0xEB, 0x00, 0xF6, 0x60, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x10, 0x6B, 0x6B, 0xEB, -0x8C, 0xEB, 0x00, 0xF6, 0x60, 0x34, 0x00, 0xF6, 0x83, 0x34, 0x06, 0x93, 0x62, 0x33, 0x62, 0x33, -0x00, 0xF6, 0x60, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x8D, 0xEB, 0x00, 0xF6, 0x60, 0x34, 0x00, 0xF6, -0x83, 0x34, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x0A, 0x92, 0x47, 0xAA, 0x02, 0x4A, 0x7D, 0x67, -0x48, 0xCB, 0x5D, 0x67, 0x68, 0xAA, 0x06, 0x92, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB0, 0x14, -0x06, 0x92, 0x18, 0x4A, 0x05, 0xD2, 0x05, 0x93, 0x0A, 0x92, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, -0xD8, 0x14, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, 0x4C, 0x9A, 0x01, 0x6B, 0x60, 0xC2, 0x01, 0x6A, -0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x00, 0x6A, 0x7D, 0x67, -0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, 0x6E, 0xA2, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, 0x4F, 0xA2, 0x6E, 0xEA, 0x4D, 0x22, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, 0x4E, 0xA2, 0x50, 0x33, 0x30, 0xF0, 0x20, 0x6A, -0x83, 0xF0, 0x06, 0x4A, 0x49, 0xE3, 0x82, 0x67, 0x00, 0x18, 0xF0, 0x14, 0x7D, 0x67, 0x50, 0xC3, -0x7D, 0x67, 0x50, 0xA3, 0x39, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, -0x4E, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x00, 0xF4, 0x6E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, 0x6E, 0xA2, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, 0x4F, 0xA2, 0x6E, 0xEA, 0x0C, 0x22, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0x9A, 0x04, 0x6A, 0x4D, 0xEB, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x00, 0xF4, 0x4E, 0xA2, 0x0A, 0x6B, 0x6E, 0xEA, 0x07, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0x00, 0x6B, 0x00, 0xF4, 0x6E, 0xC2, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, -0xFD, 0x63, 0x05, 0x62, 0x06, 0xD4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0x9A, -0x04, 0x6A, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0xDA, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, 0x4E, 0xA2, 0x09, 0x2A, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, 0x4F, 0xA2, 0x09, 0x6B, 0x6E, 0xEA, 0x10, 0x22, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, 0x4F, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, 0x4E, 0xA2, 0xFF, 0x4A, 0x6E, 0xEA, 0x0E, 0x2A, 0x30, 0xF0, -0x20, 0x6A, 0xA1, 0xF4, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF4, 0x68, 0x9B, 0x80, 0x9B, -0x00, 0xF2, 0x00, 0x6B, 0x8D, 0xEB, 0x60, 0xDA, 0x35, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0x00, 0xF4, 0x4F, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x70, 0x33, 0x02, 0xF5, -0x18, 0x4A, 0x4D, 0xE3, 0x06, 0x92, 0x60, 0xF3, 0x8E, 0x43, 0x62, 0x67, 0x10, 0x6A, 0xA3, 0x67, -0xC2, 0x67, 0x00, 0x18, 0x30, 0x04, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, -0x4F, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x00, 0xF4, 0x6F, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF4, 0x4F, 0xA2, -0x0A, 0x6B, 0x6E, 0xEA, 0x07, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, -0x00, 0xF4, 0x6F, 0xC2, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, -0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF4, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF4, 0x74, 0x9B, -0x80, 0x9B, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF4, 0x78, 0x9B, 0x8D, 0xEB, 0x60, 0xDA, 0x00, 0xF4, -0x1F, 0x6B, 0x04, 0xF7, 0x10, 0x6A, 0x00, 0xF0, 0x1A, 0x04, 0x04, 0xD4, 0x83, 0x67, 0x20, 0x6D, -0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0x06, 0x13, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, -0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x02, 0xD4, 0x02, 0x92, 0x00, 0xD2, -0x00, 0x92, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x80, 0xF4, 0x71, 0xC2, -0x00, 0x92, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x80, 0xF4, 0x72, 0xC2, -0x00, 0x92, 0x62, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x80, 0xF4, 0x73, 0xC2, -0x00, 0x92, 0x63, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x80, 0xF4, 0x74, 0xC2, -0x00, 0x92, 0x64, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x80, 0xF4, 0x75, 0xC2, -0x00, 0x92, 0x65, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x80, 0xF4, 0x76, 0xC2, -0x00, 0x92, 0x66, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x80, 0xF4, 0x77, 0xC2, -0x01, 0x63, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x05, 0xD2, 0x05, 0x92, -0x41, 0xA2, 0x7D, 0x67, 0x51, 0xC3, 0x05, 0x92, 0x40, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, 0x05, 0x22, -0x05, 0x92, 0x42, 0xA2, 0x9D, 0x67, 0x50, 0xC4, 0x04, 0x10, 0x05, 0x92, 0x41, 0xA2, 0x7D, 0x67, -0x50, 0xC3, 0x9D, 0x67, 0x51, 0xA4, 0x7D, 0x67, 0x52, 0xC3, 0x22, 0x10, 0x9D, 0x67, 0x72, 0xA4, -0x05, 0x92, 0x80, 0xA2, 0x01, 0x6A, 0x4C, 0xEC, 0xFF, 0x6A, 0x8C, 0xEA, 0x83, 0x67, 0xA2, 0x67, -0x00, 0x18, 0x8F, 0x0A, 0x7D, 0x67, 0x52, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x6A, 0x0B, 0x06, 0x2A, -0x9D, 0x67, 0x52, 0xA4, 0x82, 0x67, 0x00, 0x18, 0x35, 0x0A, 0x05, 0x10, 0x7D, 0x67, 0x52, 0xA3, -0x82, 0x67, 0x00, 0x18, 0xD6, 0x09, 0x9D, 0x67, 0x52, 0xA4, 0x01, 0x4A, 0x7D, 0x67, 0x52, 0xC3, -0x9D, 0x67, 0x72, 0xA4, 0x9D, 0x67, 0x50, 0xA4, 0x63, 0xEA, 0x58, 0x67, 0xD7, 0x22, 0x7D, 0x67, -0x51, 0xA3, 0x29, 0x2A, 0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x25, 0x2A, 0x00, 0x18, 0x39, 0x21, -0x00, 0x18, 0x83, 0x0D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, -0x05, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x02, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x03, 0x6B, 0x6B, 0xEB, -0x8C, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFC, 0x63, 0x07, 0x62, -0x08, 0xD4, 0x08, 0x92, 0x04, 0xD2, 0x04, 0x92, 0x30, 0xF0, 0x20, 0x6B, 0xC3, 0xF1, 0x18, 0x4B, -0x83, 0x67, 0xA2, 0x67, 0x05, 0x6E, 0x00, 0x18, 0x30, 0x04, 0x04, 0x92, 0x82, 0x67, 0x00, 0x18, -0xFF, 0x0C, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFB, 0x63, 0x09, 0x62, 0x0A, 0xD4, 0x0A, 0x92, -0x07, 0xD2, 0x00, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x07, 0x92, 0x40, 0xA2, 0x46, 0x32, 0x62, 0x67, -0x07, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x07, 0x92, 0x80, 0xA2, 0x01, 0x6A, -0x4C, 0xEC, 0xFF, 0x6A, 0x4C, 0xEC, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF2, 0x14, 0x4B, 0x64, 0x33, -0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x01, 0x6B, 0x8C, 0xEB, 0xA6, 0xA2, 0x02, 0x6C, 0x8B, 0xEC, -0xAC, 0xEC, 0x8D, 0xEB, 0x66, 0xC2, 0x07, 0x92, 0x40, 0xA2, 0x46, 0x32, 0x62, 0x67, 0x07, 0x6A, -0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x07, 0x92, 0x40, 0xA2, 0x5A, 0x32, 0x82, 0x67, -0x01, 0x6A, 0x4C, 0xEC, 0xFF, 0x6A, 0x4C, 0xEC, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF2, 0x14, 0x4B, -0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x01, 0x6B, 0x8C, 0xEB, 0x78, 0x33, 0xA6, 0xA2, -0x41, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x66, 0xC2, 0x07, 0x92, 0x40, 0xA2, 0x46, 0x32, -0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x82, 0x67, 0x07, 0x92, 0x40, 0xA2, -0x5E, 0x33, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF2, 0x14, 0x4C, 0x84, 0x34, -0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x7C, 0x33, 0xA6, 0xA2, 0x7F, 0x6C, 0xAC, 0xEC, 0x8D, 0xEB, -0x66, 0xC2, 0x07, 0x92, 0x40, 0xA2, 0x46, 0x32, 0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, -0x6C, 0xEA, 0x82, 0x67, 0x07, 0x92, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF2, 0x14, 0x4C, -0x84, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x67, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF4, -0x5C, 0x9A, 0x60, 0x9A, 0xE0, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0x40, 0xF5, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x40, 0x9A, 0x40, 0x9A, -0x05, 0xD2, 0x00, 0x6A, 0x9D, 0x67, 0x50, 0xC4, 0x2A, 0x10, 0x5D, 0x67, 0x70, 0xA2, 0x30, 0xF0, -0x20, 0x6A, 0x80, 0xF2, 0x14, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x66, 0xA2, -0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x01, 0x6B, 0x6E, 0xEA, 0x13, 0x2A, 0x9D, 0x67, -0x50, 0xA4, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, -0x63, 0x33, 0x9D, 0x67, 0x58, 0x84, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, -0x7D, 0x67, 0x58, 0xC3, 0x9D, 0x67, 0x50, 0xA4, 0x01, 0x4A, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, -0x50, 0xA4, 0x08, 0x5A, 0x58, 0x67, 0xD1, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x00, 0xF6, 0x40, 0x33, -0x9D, 0x67, 0x58, 0xA4, 0x40, 0x32, 0x40, 0x32, 0x6D, 0xEA, 0x05, 0x93, 0x6D, 0xEA, 0x05, 0xD2, -0x05, 0x92, 0x00, 0x6C, 0xA2, 0x67, 0x00, 0x18, 0x99, 0x07, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, -0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x07, 0xD5, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, -0x40, 0x5A, 0x58, 0x67, 0x0D, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x60, 0x5A, 0x58, 0x67, 0x08, 0x22, -0x5D, 0x67, 0x78, 0xA2, 0x07, 0x92, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xD6, 0x27, 0x5D, 0x10, -0x7D, 0x67, 0x58, 0xA3, 0x20, 0x6B, 0x4E, 0xEB, 0x35, 0x23, 0x21, 0x52, 0x78, 0x67, 0x0F, 0x23, -0x01, 0x6B, 0x4E, 0xEB, 0x25, 0x23, 0x02, 0x52, 0x78, 0x67, 0x02, 0x23, 0x1C, 0x22, 0x39, 0x10, -0x0B, 0x6B, 0x4E, 0xEB, 0x22, 0x23, 0x14, 0x6B, 0x6E, 0xEA, 0x40, 0x22, 0x32, 0x10, 0x25, 0x6B, -0x4E, 0xEB, 0x3E, 0x23, 0x26, 0x52, 0x78, 0x67, 0x07, 0x23, 0x21, 0x6B, 0x4E, 0xEB, 0x3A, 0x23, -0x23, 0x6B, 0x6E, 0xEA, 0x39, 0x22, 0x25, 0x10, 0x87, 0x6B, 0x4E, 0xEB, 0x18, 0x23, 0xC5, 0x6B, -0x6E, 0xEA, 0x1A, 0x22, 0x1E, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0xA2, 0x15, 0x2D, 0x10, -0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0xC1, 0x15, 0x28, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, -0xBA, 0x04, 0x23, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0xFB, 0x15, 0x1E, 0x10, 0x07, 0x92, -0x82, 0x67, 0x00, 0x18, 0x04, 0x05, 0x19, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0x06, 0x16, -0x14, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF4, -0x64, 0x9B, 0x80, 0x9B, 0x01, 0x6B, 0x8D, 0xEB, 0x60, 0xDA, 0x07, 0x10, 0x00, 0x65, 0x05, 0x10, -0x00, 0x65, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, -0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x48, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, -0x0F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x41, 0xC3, 0x9D, 0x67, 0x41, 0xA4, 0x80, 0xF1, 0x03, 0x22, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0x9A, 0x02, 0x6A, 0x4D, 0xEB, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0xDA, 0x76, 0x11, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0x60, 0xF3, 0x4C, 0xA2, 0x09, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x60, 0xF3, 0x4D, 0xA2, 0x07, 0x6E, 0xCE, 0xEA, 0x10, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x60, 0xF3, 0x4C, 0xA2, 0xFF, 0x4A, 0x6E, 0xEA, 0x0E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, -0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF4, 0x64, 0x9B, 0x80, 0x9B, 0xFF, 0x6B, 0x01, 0x4B, -0x8D, 0xEB, 0x60, 0xDA, 0x4C, 0x11, 0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x8B, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x67, 0xEA, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, -0x20, 0xF1, 0x0C, 0x22, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0xBE, 0x10, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, 0xA2, 0x67, 0xDD, 0x67, 0x80, 0xA6, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x6B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x74, 0x4A, 0x48, 0x33, 0xDD, 0x67, -0x40, 0xA6, 0x4D, 0xE3, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, -0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x6B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x74, 0x4A, -0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, 0x4D, 0xE3, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x15, 0x2A, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x6B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x74, 0x4A, 0x48, 0x33, -0xDD, 0x67, 0x40, 0xA6, 0x49, 0xE3, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x4C, 0x9A, -0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x14, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x6B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x74, 0x4A, 0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, 0x49, 0xE3, -0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x50, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, -0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xB4, 0x35, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE5, 0x89, 0xE2, -0x60, 0xF2, 0x6C, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, -0xA2, 0x67, 0x7D, 0x67, 0x40, 0xA3, 0x84, 0x42, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x6B, 0xA2, -0xFF, 0x6A, 0x6C, 0xEA, 0x7C, 0x4A, 0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, 0x4D, 0xE3, 0x1F, 0xF7, -0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x6B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7C, 0x4A, 0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, -0x4D, 0xE3, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x6B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7C, 0x4A, 0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, 0x49, 0xE3, -0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF4, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, -0x4C, 0xEB, 0x14, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x6B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, -0x7C, 0x4A, 0x48, 0x33, 0xDD, 0x67, 0x40, 0xA6, 0x49, 0xE3, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, -0xE1, 0xF4, 0x50, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, -0xB4, 0x35, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE5, 0x89, 0xE2, 0x60, 0xF2, 0x6C, 0xC2, 0x7D, 0x67, -0x40, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x40, 0xC4, 0xDD, 0x67, 0x40, 0xA6, 0x04, 0x5A, 0x58, 0x67, -0x3F, 0xF7, 0x1C, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x6B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, -0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, -0x4F, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xDD, 0x67, 0x41, 0x86, 0x6C, 0xEA, -0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x7D, 0x67, 0x41, 0xC3, 0x30, 0xF0, 0x20, 0x6A, -0xE1, 0xF4, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x8B, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, -0x01, 0x6C, 0x84, 0xEB, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x6B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x6B, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x6B, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, -0x03, 0x6B, 0x6C, 0xEA, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x4B, 0xC3, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF3, 0x6D, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, 0x08, 0x6C, 0x8E, 0xEA, 0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0x60, 0xF3, 0x6D, 0xC2, 0x0D, 0x10, 0x30, 0xF0, 0x20, 0x6A, -0xE1, 0xF4, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF4, 0x64, 0x9B, 0x80, 0x9B, 0x02, 0x6B, -0x8D, 0xEB, 0x60, 0xDA, 0x04, 0x10, 0xDD, 0x67, 0x41, 0xA6, 0x9F, 0xF6, 0x06, 0x2A, 0x01, 0x63, -0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x60, 0xF3, 0x6C, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, -0x6E, 0xEA, 0x5F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF3, 0x4C, 0xA2, -0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x74, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0xF2, -0x4C, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF3, 0x4C, 0xA2, -0x54, 0x32, 0x60, 0xF2, 0x89, 0x42, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, -0x04, 0x4A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x70, 0x16, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0x60, 0xF3, 0x4C, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF3, 0x6C, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x60, 0xF3, 0x6C, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF3, 0x4D, 0xA2, -0x6E, 0xEA, 0x0C, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0x9A, 0x02, 0x6A, -0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0xDA, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x60, 0xF3, 0x4C, 0xA2, 0x08, 0x6B, 0x6E, 0xEA, 0x07, 0x2A, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0x60, 0xF3, 0x6C, 0xC2, 0x00, 0x18, 0xAC, 0x16, -0x01, 0x10, 0x00, 0x65, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x64, 0x67, -0x45, 0x67, 0x04, 0xD6, 0x9D, 0x67, 0x64, 0xCC, 0x7D, 0x67, 0x4C, 0xC3, 0x04, 0x93, 0x30, 0xF0, -0x20, 0x6A, 0x01, 0xF5, 0x44, 0x9A, 0x4C, 0xEB, 0x9D, 0x67, 0x4C, 0xA4, 0x40, 0xF6, 0x40, 0x32, -0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x48, 0x9A, 0x6D, 0xEA, 0x00, 0xD2, 0x5D, 0x67, -0x64, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, -0x9D, 0x67, 0x64, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0A, 0x2A, 0x5D, 0x67, 0x64, 0xAA, -0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, 0x09, 0x10, -0x9D, 0x67, 0x64, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x50, 0x9A, 0x49, 0xE3, 0x00, 0x93, -0x60, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x04, 0xD6, -0x9D, 0x67, 0x64, 0xCC, 0x7D, 0x67, 0x4C, 0xC3, 0x04, 0x92, 0x54, 0x33, 0x30, 0xF0, 0x20, 0x6A, -0x01, 0xF5, 0x44, 0x9A, 0x4C, 0xEB, 0x9D, 0x67, 0x4C, 0xA4, 0x40, 0xF6, 0x40, 0x32, 0x4D, 0xEB, -0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x48, 0x9A, 0x6D, 0xEA, 0x00, 0xD2, 0x5D, 0x67, 0x64, 0xAA, -0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, -0x64, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0A, 0x2A, 0x5D, 0x67, 0x64, 0xAA, 0x30, 0xF0, -0x20, 0x6A, 0x01, 0xF5, 0x4C, 0x9A, 0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, 0x09, 0x10, 0x9D, 0x67, -0x64, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x50, 0x9A, 0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, -0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x04, 0xD6, 0x9D, 0x67, 0x64, 0xCC, -0x7D, 0x67, 0x4C, 0xC3, 0x04, 0x94, 0x64, 0x67, 0x68, 0x32, 0x62, 0x67, 0x74, 0x32, 0x6B, 0xE2, -0x89, 0xE2, 0x40, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x44, 0x9A, 0x4C, 0xEB, -0x9D, 0x67, 0x4C, 0xA4, 0x40, 0xF6, 0x40, 0x32, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, -0x48, 0x9A, 0x6D, 0xEA, 0x00, 0xD2, 0x5D, 0x67, 0x64, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, -0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x64, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, -0x6C, 0xEA, 0x0A, 0x2A, 0x5D, 0x67, 0x64, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF5, 0x4C, 0x9A, -0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, 0x09, 0x10, 0x9D, 0x67, 0x64, 0xAC, 0x30, 0xF0, 0x20, 0x6A, -0x01, 0xF5, 0x50, 0x9A, 0x49, 0xE3, 0x00, 0x93, 0x60, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, -0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF5, 0x40, 0x9A, 0x40, 0x9A, 0x00, 0xD2, 0x00, 0x92, -0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x40, 0x9A, 0x40, 0x9A, -0x00, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x6C, 0x9A, 0x00, 0x92, 0x4C, 0xEB, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x6D, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, -0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0x9B, 0x60, 0xDA, 0x01, 0x63, -0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x44, 0x9A, 0x40, 0x9A, -0x04, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x48, 0x9A, 0x40, 0x9A, 0x03, 0xD2, 0x30, 0xF0, -0x20, 0x6A, 0xC1, 0xF5, 0x4C, 0x9A, 0x40, 0x9A, 0x02, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, -0x50, 0x9A, 0x40, 0x9A, 0x01, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x54, 0x9A, 0x40, 0x9A, -0x00, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x78, 0x9A, 0x04, 0x92, 0x4C, 0xEB, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x65, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x61, 0x9A, 0x03, 0x92, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x66, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x62, 0x9A, 0x02, 0x92, 0x4C, 0xEB, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x67, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x63, 0x9A, 0x01, 0x92, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x68, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x64, 0x9A, 0x00, 0x92, 0x4C, 0xEB, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x69, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x44, 0x9A, -0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x65, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, -0xC1, 0xF5, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x66, 0x9B, 0x60, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x4C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, -0x67, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, -0x02, 0xF5, 0x18, 0x4B, 0x68, 0x9B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x54, 0x9A, -0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x69, 0x9B, 0x60, 0xDA, 0x03, 0x63, 0x20, 0xE8, -0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x58, 0x9A, 0x40, 0x9A, 0x01, 0xD2, 0x30, 0xF0, -0x20, 0x6A, 0xC1, 0xF5, 0x5C, 0x9A, 0x40, 0x9A, 0x00, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0x6E, 0x9A, 0x01, 0x92, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x71, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x6F, 0x9A, 0x00, 0x92, 0x4C, 0xEB, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x72, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, -0x58, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x71, 0x9B, 0x60, 0xDA, 0x30, 0xF0, -0x20, 0x6A, 0xC1, 0xF5, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x72, 0x9B, -0x60, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0xAC, 0x16, -0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, -0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0xE7, 0x13, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, -0xFD, 0x63, 0x05, 0x62, 0x00, 0x18, 0xEC, 0x13, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, -0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, 0x9D, 0x67, 0x68, 0xA4, 0x30, 0xF0, 0x20, 0x6A, -0x80, 0xF2, 0x14, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x66, 0xA2, 0x01, 0x6A, -0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x01, 0x6B, 0x6E, 0xEA, 0x5E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x40, 0xF5, 0x60, 0x9A, 0x5D, 0x67, 0x88, 0xA2, 0x30, 0xF0, 0x20, 0x6A, -0x80, 0xF2, 0x14, 0x4C, 0x84, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x47, 0xA2, 0x49, 0xE3, -0x5C, 0x32, 0x21, 0x4A, 0x00, 0xD2, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x40, 0x9A, -0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x44, 0xC3, 0x9D, 0x67, 0x68, 0xA4, 0x30, 0xF0, 0x20, 0x6A, -0x80, 0xF2, 0x14, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x46, 0xA2, 0x5A, 0x32, -0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x5C, 0x32, 0x00, 0xF6, 0x40, 0x33, -0x00, 0xF6, 0x63, 0x33, 0x5D, 0x67, 0x88, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x80, 0xF2, 0x14, 0x4C, -0x84, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x46, 0xA2, 0x5E, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, -0x58, 0x32, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, -0x00, 0xF6, 0x63, 0x33, 0x9D, 0x67, 0x44, 0x84, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, -0x43, 0x32, 0x7D, 0x67, 0x44, 0xC3, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x40, 0x9A, -0x49, 0xE3, 0x9D, 0x67, 0x64, 0xA4, 0x60, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0xFD, 0x63, 0x05, 0x62, -0x00, 0x18, 0x6C, 0x1F, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, -0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, -0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, 0x80, 0xF0, 0x0C, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0xC0, 0xF4, 0x5D, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x7D, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x44, 0x9A, -0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x48, 0x9A, -0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0x32, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, -0x4C, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x40, 0x32, 0x40, 0x32, 0x4D, 0xEB, 0x30, 0xF0, -0x20, 0x6A, 0xE1, 0xF5, 0x50, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x00, 0xF6, 0x40, 0x32, -0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0xF5, 0x74, 0xDA, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x21, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, -0xC0, 0xF4, 0x66, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x46, 0xA2, -0x40, 0x6B, 0x6C, 0xEA, 0x24, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, -0x58, 0xA2, 0x82, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x59, 0xA2, -0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x5F, 0xA2, 0xA3, 0x67, -0xC2, 0x67, 0x05, 0x6F, 0x00, 0x18, 0x54, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xC0, 0xF4, 0x86, 0xA2, 0x41, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x45, 0xA2, 0x40, 0x6B, 0x6C, 0xEA, 0x11, 0x22, -0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF5, 0x50, 0x9A, 0x60, 0x9A, 0x10, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, -0x08, 0x22, 0x02, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x00, 0x08, 0x03, 0x6C, 0x01, 0x6D, 0x00, 0x18, -0x00, 0x08, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0x9A, 0x10, 0x6A, 0x4D, 0xEB, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x77, 0xDA, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, -0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x00, 0x18, 0x39, 0x0F, 0x05, 0x97, -0x03, 0x63, 0x00, 0xEF, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, -0x73, 0x12, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, 0x1B, 0x22, 0x30, 0xF0, -0x20, 0x6A, 0xE1, 0xF5, 0x54, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x02, 0x6A, -0x6C, 0xEA, 0x03, 0x22, 0x00, 0x18, 0x7D, 0x0B, 0x0D, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, 0x05, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, -0x00, 0x18, 0xC6, 0x0E, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, -0x00, 0x18, 0x5B, 0x1F, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, -0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, -0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, -0x00, 0x18, 0xC3, 0x1D, 0x7D, 0x67, 0x50, 0xC3, 0x5D, 0x67, 0x70, 0xA2, 0x01, 0x6A, 0x4C, 0xEB, -0xFF, 0x6A, 0x6C, 0xEA, 0x05, 0x22, 0x00, 0x6C, 0x01, 0x6D, 0x00, 0x18, 0x9A, 0x0B, 0x04, 0x10, -0x00, 0x6C, 0x00, 0x6D, 0x00, 0x18, 0x9A, 0x0B, 0x5D, 0x67, 0x70, 0xA2, 0x40, 0x6A, 0x6C, 0xEA, -0x1C, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, -0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x00, 0x52, 0x58, 0x67, 0x07, 0x22, 0x30, 0xF0, -0x20, 0x6A, 0xE1, 0xF5, 0x58, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x07, 0x10, 0x30, 0xF0, 0x20, 0x6A, -0xE1, 0xF5, 0x58, 0x9A, 0x80, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0xC0, 0xF4, 0x58, 0xA2, 0x82, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xC0, 0xF4, 0x59, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, -0x5F, 0xA2, 0xA3, 0x67, 0xC2, 0x67, 0x02, 0x6F, 0x00, 0x18, 0x54, 0x10, 0x07, 0x97, 0x04, 0x63, -0x00, 0xEF, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, -0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, -0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x46, 0xA2, -0x01, 0x6B, 0x6C, 0xEA, 0x30, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, -0x86, 0xA2, 0x02, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x30, 0xF0, 0x20, 0x6A, -0xE1, 0xF5, 0x5C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, -0xFF, 0x6A, 0x6C, 0xEA, 0x0B, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, -0x86, 0xA2, 0x04, 0x6B, 0x8D, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x0B, 0x10, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x05, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, -0x66, 0xC2, 0x00, 0x18, 0xC6, 0x0E, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x46, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, -0x37, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x03, 0x6B, -0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF5, 0x5C, 0x9A, -0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x02, 0x6A, 0x6C, 0xEA, 0x0B, 0x22, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, 0x08, 0x6B, 0x8D, 0xEB, 0xC0, 0xF4, -0x66, 0xC2, 0x0B, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x86, 0xA2, -0x09, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x66, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0xC6, 0x0E, -0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, -0x20, 0xE8, 0x00, 0x65, 0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x20, 0xE8, 0x20, 0xE8, 0x00, 0x65, -0x20, 0xE8, 0x00, 0x65, 0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x20, 0xE8, 0xFD, 0x63, 0x05, 0x62, -0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, -0x48, 0xA2, 0x02, 0x6B, 0x6E, 0xEA, 0x03, 0x22, 0x00, 0x18, 0xD4, 0x0F, 0x01, 0x10, 0x00, 0x65, -0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, -0x58, 0xC3, 0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x01, 0x6B, 0x6E, 0xEA, 0x22, 0x2A, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, 0x19, 0x22, -0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x40, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, -0x01, 0xF6, 0x44, 0x9A, 0x02, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x20, 0xF5, 0x49, 0xA2, 0xFF, 0x6B, 0x55, 0x4B, 0x83, 0x67, 0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, -0xD2, 0x17, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, -0x58, 0xC3, 0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x01, 0x6B, 0x6E, 0xEA, 0x3A, 0x2A, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, 0x31, 0x22, -0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x40, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, -0x01, 0xF6, 0x44, 0x9A, 0x02, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xC0, 0xF4, 0x85, 0xA2, 0x03, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, 0xFD, 0x6B, 0x6C, 0xEA, 0x30, 0xF0, -0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x49, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, 0x62, 0x67, 0x07, 0x6A, 0x6C, 0xEA, 0x02, 0x2A, 0x00, 0x18, -0xC6, 0x0E, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, -0x58, 0xC3, 0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x01, 0x6B, 0x6E, 0xEA, 0x19, 0x2A, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, 0x10, 0x22, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x41, 0xA2, 0xF0, 0x6B, 0x6C, 0xEA, -0x20, 0x6B, 0x6E, 0xEA, 0x03, 0x22, 0x00, 0x18, 0x67, 0x03, 0x02, 0x10, 0x00, 0x18, 0xCE, 0x0E, -0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, -0x58, 0xC3, 0x00, 0x6C, 0x00, 0x18, 0x6A, 0x0B, 0x01, 0x6B, 0x6E, 0xEA, 0x23, 0x2A, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, 0x1A, 0x22, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, 0xFE, 0x6B, 0x6C, 0xEA, -0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0xC0, 0xF4, 0x49, 0xC3, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x49, 0xA2, 0x62, 0x67, 0x07, 0x6A, 0x6C, 0xEA, 0x02, 0x2A, -0x00, 0x18, 0xC6, 0x0E, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, -0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, -0x40, 0xA2, 0x7F, 0x6B, 0x6C, 0xEA, 0x02, 0x22, 0x00, 0x18, 0x5B, 0x12, 0x05, 0x97, 0x03, 0x63, -0x00, 0xEF, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, -0x20, 0xE8, 0x00, 0x65, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x02, 0xD4, 0x85, 0x67, 0x66, 0x67, -0x47, 0x67, 0xBD, 0x67, 0x8C, 0xC5, 0x9D, 0x67, 0x70, 0xC4, 0xBD, 0x67, 0x54, 0xC5, 0x02, 0x93, -0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x48, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x42, 0xC3, -0x9D, 0x67, 0x50, 0xA4, 0x08, 0x6B, 0x4B, 0xE3, 0xFF, 0x6B, 0x67, 0xEA, 0xBD, 0x67, 0x4C, 0xA5, -0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x4F, 0xEA, -0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xBD, 0x67, 0x42, 0x85, 0x6C, 0xEA, 0x00, 0xF6, -0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x7D, 0x67, 0x41, 0xC3, 0x9D, 0x67, 0x74, 0xA4, 0xBD, 0x67, -0x50, 0xA5, 0x08, 0x6C, 0x4B, 0xE4, 0xFF, 0x6C, 0xA4, 0x67, 0xA7, 0xEA, 0x45, 0x67, 0x4C, 0xEB, -0x9D, 0x67, 0x4C, 0xA4, 0xA3, 0x67, 0xA4, 0xEA, 0x45, 0x67, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, -0x63, 0x33, 0x9D, 0x67, 0x41, 0x84, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, -0xBD, 0x67, 0x40, 0xC5, 0x02, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x48, 0x9A, 0x49, 0xE3, -0x9D, 0x67, 0x60, 0xA4, 0x60, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x65, 0x67, -0x46, 0x67, 0xBD, 0x67, 0x84, 0xCD, 0x9D, 0x67, 0x6C, 0xC4, 0xBD, 0x67, 0x50, 0xC5, 0x5D, 0x67, -0x64, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF6, 0x48, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, -0x41, 0xC3, 0x9D, 0x67, 0x61, 0xA4, 0xBD, 0x67, 0x4C, 0xA5, 0x83, 0x67, 0x87, 0xEA, 0x44, 0x67, -0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xBD, 0x67, 0x50, 0xA5, 0x08, 0x6C, 0x4B, 0xE4, -0xFF, 0x6C, 0xA4, 0x67, 0xA7, 0xEA, 0x45, 0x67, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, -0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, -0x40, 0xA4, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x44, 0x67, 0x0B, 0xD5, -0x7D, 0x67, 0x54, 0xCB, 0x00, 0x6A, 0x06, 0xD2, 0x9D, 0x67, 0x74, 0xAC, 0x30, 0xF0, 0x20, 0x6A, -0x21, 0xF6, 0x5C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x05, 0xD2, 0x0B, 0x92, 0x01, 0x4A, 0x02, 0x2A, -0x05, 0x92, 0x0E, 0x10, 0x0B, 0x92, 0x82, 0x67, 0x00, 0x18, 0xB9, 0x12, 0x04, 0xD2, 0x05, 0x93, -0x0B, 0x92, 0x4C, 0xEB, 0x04, 0x92, 0x83, 0x67, 0x86, 0xEA, 0x44, 0x67, 0x06, 0xD2, 0x06, 0x92, -0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x44, 0x67, 0x0B, 0xD5, -0x0C, 0xD6, 0x7D, 0x67, 0x54, 0xCB, 0x5D, 0x67, 0x74, 0xAA, 0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, -0xA2, 0x67, 0x00, 0x18, 0xA6, 0x1A, 0x06, 0xD2, 0x0B, 0x92, 0x01, 0x4A, 0x0A, 0x2A, 0x5D, 0x67, -0x74, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x5C, 0x9A, 0x49, 0xE3, 0x0C, 0x93, 0x60, 0xDA, -0x19, 0x10, 0x0B, 0x92, 0x82, 0x67, 0x00, 0x18, 0xB9, 0x12, 0x04, 0xD2, 0x0B, 0x92, 0x4F, 0xEB, -0x06, 0x92, 0x4C, 0xEB, 0x04, 0x92, 0x0C, 0x94, 0x84, 0xEA, 0x0B, 0x92, 0x8C, 0xEA, 0x6D, 0xEA, -0x05, 0xD2, 0x5D, 0x67, 0x74, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x5C, 0x9A, 0x49, 0xE3, -0x05, 0x93, 0x60, 0xDA, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x00, 0xD4, 0x01, 0xD5, -0x00, 0x92, 0x01, 0x6B, 0x4E, 0xEB, 0x13, 0x23, 0x01, 0x5A, 0x78, 0x67, 0x07, 0x2B, 0x02, 0x6B, -0x4E, 0xEB, 0x16, 0x23, 0x03, 0x6B, 0x6E, 0xEA, 0x1C, 0x22, 0x24, 0x10, 0x01, 0x92, 0x48, 0x33, -0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x40, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x1C, 0x10, 0x01, 0x92, -0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x44, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x13, 0x10, -0x01, 0x92, 0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x48, 0x9A, 0x49, 0xE3, 0x40, 0x9A, -0x0A, 0x10, 0x01, 0x92, 0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x4C, 0x9A, 0x49, 0xE3, -0x40, 0x9A, 0x01, 0x10, 0x00, 0x6A, 0x20, 0xE8, 0xFB, 0x63, 0x09, 0x62, 0x0A, 0xD4, 0x0B, 0xD5, -0x0C, 0xD6, 0x00, 0x6A, 0x06, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x82, 0xF5, 0x0C, 0x4A, 0x05, 0xD2, -0x05, 0x92, 0x67, 0x42, 0x0D, 0x4B, 0x0A, 0x92, 0x4C, 0x32, 0x4C, 0x34, 0x89, 0xE2, 0x49, 0xE3, -0x04, 0xD2, 0x0B, 0x92, 0x00, 0xF5, 0x40, 0x33, 0x0C, 0x94, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, -0x50, 0x9A, 0x8C, 0xEA, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x54, 0x9A, 0x6C, 0xEA, -0x06, 0xD2, 0x04, 0x92, 0x64, 0x9A, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x82, 0x67, 0x01, 0x6B, -0x6B, 0xEB, 0x06, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x09, 0x97, 0x05, 0x63, -0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x64, 0x67, 0x45, 0x67, 0x0C, 0xD6, 0x9D, 0x67, -0x20, 0xF0, 0x68, 0xC4, 0x7D, 0x67, 0x56, 0xCB, 0x00, 0x6A, 0x06, 0xD2, 0x0C, 0x92, 0x01, 0x4A, -0x0A, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xA4, 0x9D, 0x67, 0x56, 0xAC, 0x83, 0x67, 0xA2, 0x67, -0x00, 0x18, 0xD7, 0x1A, 0x18, 0x10, 0x5D, 0x67, 0x20, 0xF0, 0x68, 0xA2, 0x9D, 0x67, 0x56, 0xAC, -0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xD7, 0x1A, 0x05, 0xD2, 0x0C, 0x92, 0x82, 0x67, 0x00, 0x18, -0xB9, 0x12, 0x04, 0xD2, 0x05, 0x93, 0x0C, 0x92, 0x4C, 0xEB, 0x04, 0x92, 0x83, 0x67, 0x86, 0xEA, -0x44, 0x67, 0x06, 0xD2, 0x06, 0x92, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0xFB, 0x63, 0x09, 0x62, -0x64, 0x67, 0x45, 0x67, 0x0C, 0xD6, 0x0D, 0xD7, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xC4, 0x7D, 0x67, -0x56, 0xCB, 0x0C, 0x92, 0x01, 0x4A, 0x0B, 0x2A, 0x5D, 0x67, 0x20, 0xF0, 0x88, 0xA2, 0x5D, 0x67, -0x76, 0xAA, 0x0D, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xF2, 0x1A, 0x24, 0x10, 0x9D, 0x67, -0x20, 0xF0, 0x68, 0xA4, 0x9D, 0x67, 0x56, 0xAC, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xD7, 0x1A, -0x06, 0xD2, 0x0C, 0x92, 0x82, 0x67, 0x00, 0x18, 0xB9, 0x12, 0x04, 0xD2, 0x0C, 0x92, 0x4F, 0xEB, -0x06, 0x92, 0x4C, 0xEB, 0x04, 0x92, 0x0D, 0x94, 0x84, 0xEA, 0x0C, 0x92, 0x8C, 0xEA, 0x6D, 0xEA, -0x05, 0xD2, 0x5D, 0x67, 0x20, 0xF0, 0x88, 0xA2, 0x5D, 0x67, 0x76, 0xAA, 0x05, 0x92, 0xA3, 0x67, -0xC2, 0x67, 0x00, 0x18, 0xF2, 0x1A, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x30, 0xF0, -0x20, 0x6A, 0x82, 0xF5, 0x0C, 0x4A, 0x00, 0xD2, 0x00, 0x92, 0x81, 0xF4, 0x10, 0x6B, 0x69, 0xDA, -0x00, 0x92, 0x81, 0xF6, 0x10, 0x6B, 0x7B, 0xDA, 0x00, 0x92, 0x83, 0xF0, 0x10, 0x6B, 0xA0, 0xF0, -0x74, 0xDA, 0x00, 0x92, 0x83, 0xF2, 0x10, 0x6B, 0xE0, 0xF0, 0x7C, 0xDA, 0x01, 0x63, 0x20, 0xE8, -0xFB, 0x63, 0x09, 0x62, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xC4, 0x7D, 0x67, -0x56, 0xCB, 0x00, 0x6A, 0x06, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x58, 0x9A, 0x60, 0xAA, -0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xE1, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x48, 0xCC, -0x5D, 0x67, 0x68, 0xAA, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x49, 0xE3, 0x5C, 0x32, 0x06, 0xD2, -0x00, 0x6A, 0x7D, 0x67, 0x4E, 0xCB, 0x31, 0x10, 0x9D, 0x67, 0x4E, 0xAC, 0x48, 0x32, 0x62, 0x67, -0x06, 0x92, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF6, 0x5C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, -0x05, 0xD2, 0x7D, 0x67, 0x4E, 0xAB, 0x13, 0x2A, 0x83, 0xF1, 0x18, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, -0x05, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x83, 0xF1, 0x18, 0x6C, 0x01, 0x6B, -0x6B, 0xEB, 0x05, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x09, 0x10, 0x83, 0xF1, -0x18, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x05, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, -0x9D, 0x67, 0x4E, 0xAC, 0x01, 0x4A, 0x7D, 0x67, 0x4E, 0xCB, 0x9D, 0x67, 0x6E, 0xAC, 0x9D, 0x67, -0x56, 0xAC, 0x43, 0xEB, 0x58, 0x67, 0xC8, 0x2A, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, -0xFA, 0x63, 0x0B, 0x62, 0x1C, 0x65, 0x85, 0x67, 0x66, 0x67, 0x47, 0x67, 0xD8, 0x67, 0xBD, 0x67, -0x20, 0xF0, 0xD0, 0xC5, 0xBD, 0x67, 0x20, 0xF0, 0x94, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x78, 0xC6, -0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xC4, 0xBD, 0x67, -0x20, 0xF0, 0x50, 0xA5, 0x24, 0x5A, 0x58, 0x67, 0x13, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, -0x31, 0x5A, 0x58, 0x67, 0x0D, 0x22, 0x61, 0xF0, 0x00, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, -0x60, 0x9A, 0x80, 0xF4, 0x14, 0x6A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x51, 0x10, -0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, 0x32, 0x5A, 0x58, 0x67, 0x13, 0x2A, 0x7D, 0x67, 0x20, 0xF0, -0x50, 0xA3, 0x41, 0x5A, 0x58, 0x67, 0x0D, 0x22, 0x61, 0xF0, 0x00, 0x6C, 0x30, 0xF0, 0x20, 0x6A, -0x61, 0xF6, 0x60, 0x9A, 0x40, 0xF4, 0x13, 0x6A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, -0x38, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, 0x64, 0x5A, 0x58, 0x67, 0x13, 0x2A, 0x7D, 0x67, -0x20, 0xF0, 0x50, 0xA3, 0x75, 0x5A, 0x58, 0x67, 0x0D, 0x22, 0x61, 0xF0, 0x00, 0x6C, 0x30, 0xF0, -0x20, 0x6A, 0x61, 0xF6, 0x60, 0x9A, 0x40, 0xF4, 0x12, 0x6A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, -0xBA, 0x1A, 0x1F, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, 0x76, 0x5A, 0x58, 0x67, 0x0D, 0x2A, -0x61, 0xF0, 0x00, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x60, 0x9A, 0x00, 0xF4, 0x12, 0x6A, -0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x0C, 0x10, 0x61, 0xF0, 0x00, 0x6C, 0x30, 0xF0, -0x20, 0x6A, 0x61, 0xF6, 0x60, 0x9A, 0x61, 0xF1, 0x0A, 0x6A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, -0xBA, 0x1A, 0x00, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x56, 0x10, 0x9D, 0x67, 0x20, 0xF0, -0x50, 0xA4, 0x24, 0x5A, 0x58, 0x67, 0x0A, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, 0x41, 0x5A, -0x58, 0x67, 0x04, 0x22, 0xFF, 0x6A, 0x02, 0x4A, 0x07, 0xD2, 0x1C, 0x10, 0x7D, 0x67, 0x20, 0xF0, -0x50, 0xA3, 0x64, 0x5A, 0x58, 0x67, 0x0A, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, 0x8D, 0x5A, -0x58, 0x67, 0x04, 0x22, 0x00, 0xF3, 0x01, 0x6A, 0x07, 0xD2, 0x0C, 0x10, 0x7D, 0x67, 0x20, 0xF0, -0x50, 0xA3, 0x8D, 0x5A, 0x58, 0x67, 0x04, 0x2A, 0x00, 0xF5, 0x01, 0x6A, 0x07, 0xD2, 0x02, 0x10, -0x00, 0x6A, 0x07, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x44, 0x9A, 0x04, 0xD2, 0x04, 0x92, -0x82, 0x67, 0x00, 0x18, 0xB9, 0x12, 0x05, 0xD2, 0x5D, 0x67, 0x20, 0xF0, 0x70, 0xA2, 0x05, 0x92, -0x07, 0x94, 0xA4, 0x67, 0xA4, 0xEA, 0x45, 0x67, 0x6D, 0xEA, 0x06, 0xD2, 0x30, 0xF0, 0x20, 0x6A, -0x61, 0xF6, 0x48, 0x9A, 0x04, 0xD2, 0xDD, 0x67, 0x20, 0xF0, 0x80, 0xA6, 0x04, 0x93, 0x06, 0x92, -0x18, 0x6D, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0x27, 0x1B, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, -0x01, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x40, 0xA5, 0x04, 0x5A, -0x58, 0x67, 0xA4, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, 0x24, 0x5A, 0x58, 0x67, 0x0E, 0x2A, -0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, 0x41, 0x5A, 0x58, 0x67, 0x08, 0x22, 0x41, 0xF1, 0x18, 0x6A, -0x82, 0x67, 0x1F, 0x6D, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0x10, 0x7D, 0x67, 0x20, 0xF0, -0x50, 0xA3, 0x64, 0x5A, 0x58, 0x67, 0x0E, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, 0x91, 0x5A, -0x58, 0x67, 0x08, 0x22, 0x41, 0xF1, 0x18, 0x6A, 0x82, 0x67, 0x1F, 0x6D, 0x02, 0x6E, 0x00, 0x18, -0xBA, 0x1A, 0x0D, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, 0x95, 0x5A, 0x58, 0x67, 0x07, 0x2A, -0x41, 0xF1, 0x18, 0x6A, 0x82, 0x67, 0x1F, 0x6D, 0x03, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x0B, 0x97, -0x06, 0x63, 0x00, 0xEF, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x4C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, -0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x00, 0x52, 0x58, 0x67, 0x02, 0x22, -0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0x20, 0xE8, 0xFD, 0x63, 0x05, 0x62, 0x64, 0x67, 0x45, 0x67, -0x9D, 0x67, 0x78, 0xC4, 0x7D, 0x67, 0x5C, 0xC3, 0x9D, 0x67, 0x58, 0xA4, 0x0F, 0x5A, 0x58, 0x67, -0x0F, 0x22, 0x00, 0x18, 0x11, 0x1C, 0x1D, 0x22, 0x00, 0x18, 0x11, 0x1C, 0x01, 0x6B, 0x6E, 0xEA, -0x18, 0x2A, 0x9D, 0x67, 0x5C, 0xA4, 0x00, 0x6C, 0xA2, 0x67, 0x00, 0x18, 0x36, 0x1D, 0x11, 0x10, -0x7D, 0x67, 0x58, 0xA3, 0x0F, 0x5A, 0x58, 0x67, 0x0C, 0x2A, 0x00, 0x18, 0x11, 0x1C, 0x07, 0x2A, -0x7D, 0x67, 0x5C, 0xA3, 0x01, 0x6C, 0xA2, 0x67, 0x00, 0x18, 0x36, 0x1D, 0x02, 0x10, 0x00, 0x18, -0x11, 0x1C, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x64, 0x67, 0x45, 0x67, -0x9D, 0x67, 0x78, 0xC4, 0x7D, 0x67, 0x5C, 0xC3, 0x9D, 0x67, 0x58, 0xA4, 0xC0, 0xF0, 0x1B, 0x2A, -0x7D, 0x67, 0x5C, 0xA3, 0x06, 0x5A, 0x78, 0x67, 0xE0, 0xF1, 0x11, 0x23, 0x48, 0x33, 0x30, 0xF0, -0x20, 0x6A, 0x01, 0xF6, 0x0C, 0x4A, 0x49, 0xE3, 0x40, 0x9A, 0x00, 0xEA, 0xA1, 0xF4, 0x10, 0x6C, -0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x50, 0x9A, 0xA3, 0x67, 0xC2, 0x67, -0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF6, 0x10, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, -0x61, 0xF6, 0x50, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF4, 0x14, 0x6B, -0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, -0xBA, 0x1A, 0xA1, 0xF6, 0x14, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x54, 0x9A, 0x83, 0x67, -0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0xBB, 0x11, 0xA1, 0xF4, 0x10, 0x6C, 0x01, 0x6B, -0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x58, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, -0xBA, 0x1A, 0xA1, 0xF6, 0x10, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, -0x58, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF4, 0x14, 0x6C, 0x30, 0xF0, -0x20, 0x6A, 0x61, 0xF6, 0x74, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x5C, 0x9A, 0xA3, 0x67, -0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF6, 0x14, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, -0x74, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x5C, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, -0xBA, 0x1A, 0x01, 0xF1, 0x00, 0x6B, 0x00, 0xF3, 0x03, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, -0x00, 0x18, 0xBA, 0x1A, 0x7D, 0x11, 0xA1, 0xF4, 0x10, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, -0x20, 0x6A, 0x61, 0xF6, 0x50, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF6, -0x10, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x50, 0x9A, 0xA3, 0x67, -0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF4, 0x14, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, -0x74, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x40, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, -0xBA, 0x1A, 0xA1, 0xF6, 0x14, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x74, 0x9A, 0x30, 0xF0, -0x20, 0x6A, 0x81, 0xF6, 0x40, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x00, 0x65, -0x47, 0x11, 0xA1, 0xF4, 0x10, 0x6A, 0x82, 0x67, 0xFF, 0x6D, 0x77, 0x6E, 0x00, 0x18, 0xBA, 0x1A, -0xA1, 0xF6, 0x10, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x50, 0x9A, -0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF4, 0x14, 0x6B, 0x30, 0xF0, 0x20, 0x6A, -0x61, 0xF6, 0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF6, -0x14, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, -0x00, 0x18, 0xBA, 0x1A, 0x1D, 0x11, 0x7D, 0x67, 0x5C, 0xA3, 0x06, 0x5A, 0x78, 0x67, 0x00, 0xF1, -0x17, 0x23, 0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF6, 0x04, 0x4A, 0x49, 0xE3, 0x40, 0x9A, -0x00, 0xEA, 0xA1, 0xF4, 0x10, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, -0x44, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF6, 0x10, 0x6C, 0x01, 0x6B, -0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x44, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, -0xBA, 0x1A, 0xA1, 0xF4, 0x14, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x74, 0x9A, 0x30, 0xF0, -0x20, 0x6A, 0x61, 0xF6, 0x5C, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF6, -0x14, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x74, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, -0x5C, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xDA, 0x10, 0xA1, 0xF4, 0x10, 0x6C, -0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x44, 0x9A, 0xA3, 0x67, 0xC2, 0x67, -0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF6, 0x10, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, -0x81, 0xF6, 0x44, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF4, 0x14, 0x6B, -0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, -0xBA, 0x1A, 0xA1, 0xF6, 0x14, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x54, 0x9A, 0x83, 0x67, -0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0xAB, 0x10, 0xA1, 0xF4, 0x10, 0x6C, 0x01, 0x6B, -0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x48, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, -0xBA, 0x1A, 0xA1, 0xF6, 0x10, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, -0x48, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF4, 0x14, 0x6C, 0x30, 0xF0, -0x20, 0x6A, 0x61, 0xF6, 0x74, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x5C, 0x9A, 0xA3, 0x67, -0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF6, 0x14, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, -0x74, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x5C, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, -0xBA, 0x1A, 0x76, 0x10, 0xA1, 0xF4, 0x10, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, -0x81, 0xF6, 0x4C, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF6, 0x10, 0x6C, -0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x4C, 0x9A, 0xA3, 0x67, 0xC2, 0x67, -0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF4, 0x14, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x74, 0x9A, -0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x5C, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, -0xA1, 0xF6, 0x14, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x74, 0x9A, 0x30, 0xF0, 0x20, 0x6A, -0x61, 0xF6, 0x5C, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x01, 0xF1, 0x00, 0x6B, -0x00, 0xF3, 0x03, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x38, 0x10, -0xA1, 0xF4, 0x10, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x70, 0x9A, 0x30, 0xF0, 0x20, 0x6A, -0x81, 0xF6, 0x54, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF6, 0x10, 0x6C, -0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x48, 0x9A, 0xA3, 0x67, 0xC2, 0x67, -0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF4, 0x14, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x7C, 0x9A, -0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x5C, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, -0xA1, 0xF6, 0x14, 0x6C, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x74, 0x9A, 0x30, 0xF0, 0x20, 0x6A, -0x61, 0xF6, 0x5C, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x01, 0x10, 0x00, 0x65, -0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x64, 0x67, 0x45, 0x67, -0x9D, 0x67, 0x20, 0xF0, 0x60, 0xC4, 0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, 0x9D, 0x67, 0x20, 0xF0, -0x40, 0xA4, 0x43, 0x2A, 0x01, 0xF0, 0x08, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x58, 0x9A, -0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF0, 0x10, 0x6A, 0x82, 0x67, -0x0E, 0x6D, 0x08, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF0, 0x14, 0x6A, 0x82, 0x67, 0x03, 0x6D, -0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x5D, 0x67, 0x20, 0xF0, 0x60, 0xA2, 0x9D, 0x67, 0x20, 0xF0, -0x44, 0xA4, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x32, 0x1C, 0x01, 0xF0, 0x08, 0x6C, 0x30, 0xF0, -0x20, 0x6A, 0x81, 0xF6, 0x78, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x58, 0x9A, 0xA3, 0x67, -0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF6, 0x4C, 0x9A, 0x60, 0xA2, -0xFF, 0x6A, 0x4C, 0xEB, 0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, -0x61, 0xF6, 0x4C, 0x9A, 0x9D, 0x67, 0x70, 0xA4, 0x60, 0xC2, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, -0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x42, 0xC3, 0x7D, 0x67, -0x48, 0xA3, 0x56, 0x32, 0x7D, 0x67, 0x41, 0xC3, 0x5D, 0x67, 0x68, 0xA2, 0x1F, 0x6A, 0x6C, 0xEA, -0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, 0x41, 0xA3, 0x01, 0x6B, 0x4E, 0xEB, 0x25, 0x23, 0x02, 0x52, -0x78, 0x67, 0x02, 0x23, 0x2D, 0x22, 0x37, 0x10, 0x04, 0x6B, 0x4E, 0xEB, 0x10, 0x23, 0x06, 0x6B, -0x6E, 0xEA, 0x31, 0x2A, 0x7D, 0x67, 0x40, 0xA3, 0x11, 0x6B, 0x6B, 0xEB, 0x4F, 0xE3, 0xFF, 0x6A, -0x6C, 0xEA, 0x44, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x42, 0xC3, 0x24, 0x10, 0x7D, 0x67, -0x40, 0xA3, 0x07, 0x6B, 0x6B, 0xEB, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x44, 0x33, 0xFF, 0x6A, -0x6C, 0xEA, 0x7D, 0x67, 0x42, 0xC3, 0x17, 0x10, 0x7D, 0x67, 0x40, 0xA3, 0x03, 0x6B, 0x4F, 0xE3, -0xFF, 0x6A, 0x6C, 0xEA, 0x44, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x42, 0xC3, 0x0B, 0x10, -0x7D, 0x67, 0x40, 0xA3, 0x08, 0x6B, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x44, 0x33, 0xFF, 0x6A, -0x6C, 0xEA, 0x7D, 0x67, 0x42, 0xC3, 0x7D, 0x67, 0x42, 0x83, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, -0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x7D, 0x67, 0x40, 0x83, 0x9F, 0xF7, 0x1D, 0x52, 0x58, 0x67, -0x05, 0x2A, 0x7D, 0x67, 0x40, 0x83, 0x14, 0x52, 0x58, 0x67, 0x02, 0x2A, 0x00, 0x6A, 0x0D, 0x10, -0x7D, 0x67, 0x40, 0x83, 0x00, 0x52, 0x58, 0x67, 0x02, 0x2A, 0x64, 0x6A, 0x06, 0x10, 0x7D, 0x67, -0x40, 0xA3, 0x67, 0x42, 0x5D, 0x4B, 0xFF, 0x6A, 0x6C, 0xEA, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, -0x00, 0x6A, 0x7D, 0x67, 0x48, 0xCB, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x5C, 0x9A, 0x10, 0xF0, -0x20, 0x6B, 0x6E, 0xF6, 0x0D, 0x4B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x40, 0x9A, -0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x1A, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x44, 0x9A, -0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x12, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x48, 0x9A, -0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x0A, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x4C, 0x9A, -0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x02, 0x2A, 0x01, 0x6A, 0x1D, 0x10, 0x7D, 0x67, 0x48, 0xAB, -0xE0, 0xF3, 0x09, 0x5A, 0x58, 0x67, 0x0E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, 0x50, 0x9A, -0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF6, 0x70, 0x9B, 0x80, 0x9B, 0x20, 0x6B, 0x8D, 0xEB, 0x60, 0xDA, -0x00, 0x6A, 0x09, 0x10, 0x32, 0x6C, 0x00, 0x18, 0x8D, 0x14, 0x7D, 0x67, 0x48, 0xAB, 0x01, 0x4A, -0x7D, 0x67, 0x48, 0xCB, 0xC1, 0x17, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x00, 0x6A, -0x7D, 0x67, 0x42, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xCB, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, -0x5C, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x0E, 0xF7, 0x0D, 0x4B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, -0xA1, 0xF6, 0x54, 0x9A, 0x40, 0xA2, 0x7D, 0x67, 0x42, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, -0x54, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x03, 0x22, 0x7D, 0x67, 0x42, 0xA3, 0x1A, 0x10, -0x7D, 0x67, 0x40, 0xAB, 0x64, 0x5A, 0x58, 0x67, 0x0F, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, -0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF6, 0x70, 0x9B, 0x80, 0x9B, 0x40, 0x6B, 0x8D, 0xEB, -0x60, 0xDA, 0x7D, 0x67, 0x42, 0xA3, 0x06, 0x10, 0x7D, 0x67, 0x40, 0xAB, 0x01, 0x4A, 0x7D, 0x67, -0x40, 0xCB, 0xD4, 0x17, 0x01, 0x63, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, 0x44, 0x67, 0x7D, 0x67, -0x20, 0xF0, 0x40, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x48, 0xCB, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, -0x5C, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x8E, 0xF7, 0x09, 0x4B, 0x60, 0xDA, 0x2D, 0x10, 0x7D, 0x67, -0x48, 0xAB, 0x82, 0xF3, 0x08, 0x5A, 0x58, 0x67, 0x0D, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF6, -0x50, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF6, 0x70, 0x9B, 0x80, 0x9B, 0x10, 0x6B, 0x8D, 0xEB, -0x60, 0xDA, 0x2B, 0x10, 0x7D, 0x67, 0x48, 0xAB, 0x01, 0x4A, 0x7D, 0x67, 0x48, 0xCB, 0x14, 0x6C, -0x00, 0x18, 0x8D, 0x14, 0x7D, 0x67, 0x48, 0xAB, 0x33, 0x5A, 0x58, 0x67, 0x0D, 0x2A, 0x30, 0xF0, -0x20, 0x6A, 0xA1, 0xF6, 0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, -0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x10, 0x2A, 0x5D, 0x67, 0x20, 0xF0, 0x60, 0xA2, 0x30, 0xF0, -0x20, 0x6A, 0xA1, 0xF6, 0x5C, 0x9A, 0x80, 0x9A, 0x10, 0xF0, 0x00, 0x6A, 0x8C, 0xEA, 0x01, 0x22, -0x01, 0x6A, 0x6E, 0xEA, 0xC4, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, -0x5C, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x8E, 0xF7, 0x09, 0x4B, 0x01, 0x4B, 0x60, 0xDA, 0x07, 0x97, -0x04, 0x63, 0x00, 0xEF, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x5C, 0x9A, 0x10, 0xF0, 0x20, 0x6B, -0x4F, 0xF0, 0x05, 0x4B, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x40, 0x9A, 0x60, 0xA2, -0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0xF3, 0x2A, -0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF6, 0x5C, 0x9A, 0x10, 0xF0, 0x20, 0x6B, 0x4F, 0xF0, 0x05, 0x4B, -0x01, 0x4B, 0x60, 0xDA, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, 0x85, 0xA2, 0x80, 0x6B, 0x6B, 0xEB, 0x8D, 0xEB, 0xC0, 0xF4, -0x65, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x44, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, -0x18, 0x4B, 0xC0, 0xF4, 0x70, 0xAB, 0x60, 0xCA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x48, 0x9A, -0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF6, 0x68, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x10, 0x6B, -0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x01, 0x6C, 0x00, 0x18, 0xE2, 0x1D, 0x30, 0xF0, -0x20, 0x6A, 0xC1, 0xF6, 0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF6, 0x60, 0x9B, 0x80, 0xA3, -0xFF, 0x6B, 0x6C, 0xEC, 0x01, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x14, 0x6C, -0x00, 0x18, 0x8D, 0x14, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, -0x00, 0x18, 0x11, 0x1E, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x68, 0x9A, 0x30, 0xF0, 0x20, 0x6A, -0xC1, 0xF6, 0x48, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0xEF, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, -0x00, 0x6C, 0x00, 0x18, 0xE2, 0x1D, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC0, 0xF4, -0x85, 0xA2, 0x7F, 0x6B, 0x8C, 0xEB, 0xC0, 0xF4, 0x65, 0xC2, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, -0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x60, 0xC4, 0x7D, 0x67, 0x44, 0xC3, 0x30, 0xF0, 0x20, 0x6A, -0xC1, 0xF6, 0x4C, 0x9A, 0x9D, 0x67, 0x60, 0xA4, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0x9D, 0x67, 0x64, 0xA4, 0x60, 0xF0, 0x72, 0xC2, 0x20, 0xE8, 0xFE, 0x63, 0x1C, 0x65, -0x85, 0x67, 0x66, 0x67, 0x47, 0x67, 0xD8, 0x67, 0xBD, 0x67, 0xC8, 0xCD, 0xBD, 0x67, 0x94, 0xC5, -0xDD, 0x67, 0x78, 0xC6, 0x7D, 0x67, 0x5C, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x50, 0x9A, -0x60, 0xAA, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xE1, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, -0x45, 0xCC, 0xBD, 0x67, 0x68, 0xAD, 0xDD, 0x67, 0x45, 0xAE, 0x49, 0xE3, 0x7D, 0x67, 0x48, 0xCB, -0x9D, 0x67, 0x48, 0xAC, 0x03, 0xD2, 0x03, 0x92, 0x5C, 0x32, 0x03, 0xD2, 0x30, 0xF0, 0x20, 0x6A, -0xC1, 0xF6, 0x54, 0x9A, 0xBD, 0x67, 0x68, 0xAD, 0x60, 0xCA, 0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, -0xC1, 0xF6, 0x58, 0x9A, 0x49, 0xE3, 0x40, 0xAA, 0xDD, 0x67, 0x44, 0xCE, 0x03, 0x93, 0x30, 0xF0, -0x20, 0x6A, 0xC1, 0xF6, 0x5C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x01, 0xD2, 0x7D, 0x67, 0x54, 0xA3, -0x08, 0x22, 0x9D, 0x67, 0x64, 0xAC, 0x10, 0xF0, 0x00, 0x6A, 0x4B, 0xEA, 0x6D, 0xEA, 0xBD, 0x67, -0x44, 0xCD, 0xDD, 0x67, 0x64, 0xAE, 0x47, 0xF7, 0x00, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, -0x44, 0xCB, 0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x58, 0x9A, 0x49, 0xE3, 0x9D, 0x67, -0x64, 0xAC, 0x60, 0xCA, 0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x40, 0x9A, 0x49, 0xE3, -0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x01, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x40, 0xC5, 0xDD, 0x67, -0x40, 0xA6, 0x07, 0x22, 0x01, 0x93, 0x03, 0xF7, 0x01, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x01, 0xD2, -0x0C, 0x10, 0x01, 0x93, 0x1F, 0xF7, 0x01, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x01, 0xD2, 0x7D, 0x67, -0x5C, 0xA3, 0x40, 0x32, 0x01, 0x93, 0x6D, 0xEA, 0x01, 0xD2, 0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, -0xE1, 0xF6, 0x44, 0x9A, 0x6C, 0xEA, 0x01, 0xD2, 0x9D, 0x67, 0x58, 0xA4, 0x80, 0xF4, 0x40, 0x33, -0x01, 0x92, 0x4D, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x48, 0x9A, 0x6D, 0xEA, 0x01, 0xD2, -0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF6, 0x5C, 0x9A, 0x49, 0xE3, 0x01, 0x93, 0x60, 0xDA, -0x03, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x4C, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0x03, 0x94, -0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x4C, 0x9A, 0x49, 0xE4, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, -0xF7, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x03, 0x92, 0x02, 0x63, 0x20, 0xE8, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xE1, 0xF7, 0x1F, 0x6B, 0xA0, 0xF4, 0x74, 0xCA, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xA0, 0xF4, 0x76, 0xCA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0x00, 0x6B, 0xA0, 0xF4, 0x78, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xA0, 0xF4, 0x99, 0xA2, 0x04, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x02, 0x6B, 0x8D, 0xEB, -0xA0, 0xF4, 0x79, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xA0, 0xF4, -0x7A, 0xCA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xA0, 0xF4, 0x7C, 0xC2, -0x20, 0xE8, 0x00, 0x65, 0x00, 0xD4, 0x00, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x50, 0x9A, -0x49, 0xE3, 0xA2, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA0, 0xF4, 0x78, 0xA2, -0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x54, 0x9A, 0x59, 0xEB, 0x10, 0xEC, 0x8B, 0xE3, 0x46, 0x32, -0x49, 0xE4, 0x56, 0x34, 0x44, 0x67, 0x58, 0x32, 0x8B, 0xE2, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, -0x48, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x40, 0xC5, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xA0, 0xF4, 0x58, 0xA2, 0x61, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0xA0, 0xF4, 0x78, 0xC2, 0x20, 0xE8, 0xFB, 0x63, 0x09, 0x62, 0x00, 0x6A, 0x06, 0xD2, -0x00, 0x6A, 0x7D, 0x67, 0x4B, 0xCB, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x58, 0x9A, 0x60, 0xAA, -0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xE1, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x49, 0xCC, -0x00, 0x6A, 0x7D, 0x67, 0x48, 0xCB, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF6, 0x5C, 0x9A, 0x40, 0xA2, -0x9D, 0x67, 0x54, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF7, 0x60, 0x9A, 0x30, 0xF0, 0x20, 0x6A, -0x01, 0xF7, 0x40, 0x9A, 0x80, 0xAA, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x40, 0x34, 0x80, 0x34, -0x83, 0x34, 0x83, 0x34, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0xEE, 0xF1, 0x1F, 0x6C, 0x8C, 0xEA, -0x10, 0xF0, 0x00, 0x6C, 0x8B, 0xEC, 0x8D, 0xEA, 0x40, 0x34, 0x80, 0x34, 0x83, 0x34, 0x83, 0x34, -0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x40, 0xCB, 0x1A, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0xA0, 0xF4, 0x54, 0xAA, 0xE1, 0xF7, 0x1F, 0x6B, 0x6E, 0xEA, 0x08, 0x2A, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xA0, 0xF4, 0x7C, 0xC2, 0x8B, 0x10, 0x01, 0x6C, -0x00, 0x18, 0x8D, 0x14, 0x9D, 0x67, 0x4B, 0xAC, 0x01, 0x4A, 0x7D, 0x67, 0x4B, 0xCB, 0x30, 0xF0, -0x20, 0x6A, 0x01, 0xF7, 0x44, 0x9A, 0x60, 0xAA, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x62, 0x67, -0x02, 0xF0, 0x00, 0x6A, 0x6C, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x4B, 0xAC, 0xC0, 0xF7, 0x10, 0x5A, -0x58, 0x67, 0xD3, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA0, 0xF4, 0x74, 0xAA, -0x9D, 0x67, 0x49, 0xAC, 0x4B, 0xE3, 0x7D, 0x67, 0x48, 0xCB, 0x9D, 0x67, 0x48, 0xAC, 0x82, 0x67, -0x01, 0x6D, 0x18, 0x6E, 0x07, 0x6F, 0x00, 0x18, 0x5F, 0x1E, 0x06, 0xD2, 0x06, 0x93, 0x30, 0xF0, -0x20, 0x6A, 0x01, 0xF7, 0x48, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x54, 0x6B, -0x6E, 0xEA, 0x04, 0x2A, 0x06, 0x92, 0x82, 0x67, 0x00, 0x18, 0xD1, 0x1E, 0x06, 0x93, 0x30, 0xF0, -0x20, 0x6A, 0x01, 0xF7, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x56, 0x33, -0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x4C, 0xEB, 0x03, 0x6A, -0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x03, 0x6B, 0x8C, 0xEB, 0xA0, 0xF4, 0xB9, 0xA2, 0x04, 0x6C, -0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0xA0, 0xF4, 0x79, 0xC2, 0x9D, 0x67, 0x74, 0xA4, 0x6F, 0x6A, -0x6C, 0xEA, 0x82, 0x67, 0x19, 0x6D, 0x00, 0x18, 0x54, 0x1E, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF7, -0x50, 0x9A, 0x20, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA0, 0xF4, -0x5A, 0xAA, 0x61, 0x42, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0xA0, 0xF4, 0x7A, 0xCA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x01, 0x6B, -0xA0, 0xF4, 0x7C, 0xC2, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, -0x00, 0x18, 0xEA, 0x1E, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA0, 0xF4, 0x56, 0xAA, -0x0E, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA0, 0xF4, 0x56, 0xAA, 0xFF, 0x6B, -0x5D, 0x4B, 0x83, 0x67, 0x00, 0x6D, 0xC2, 0x67, 0x00, 0x18, 0xD2, 0x17, 0x06, 0x10, 0x30, 0xF0, -0x20, 0x6A, 0x01, 0xF7, 0x54, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, -0xFA, 0x63, 0x0B, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF7, 0x78, 0x9A, 0x30, 0xF0, 0x20, 0x6A, -0x01, 0xF7, 0x58, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0x7F, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, -0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF7, 0x5C, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x01, 0x6A, -0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4A, 0x22, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xA0, 0xF4, 0x5C, 0xA2, 0x43, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0xA0, 0xF4, 0x79, 0xA2, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x01, 0x6B, -0x4E, 0xEB, 0x15, 0x23, 0x02, 0x6B, 0x4E, 0xEB, 0x23, 0x23, 0x32, 0x2A, 0x30, 0xF0, 0x20, 0x6A, -0x21, 0xF7, 0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF7, 0x60, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, -0x6C, 0xEC, 0x02, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x21, 0x10, 0x30, 0xF0, -0x20, 0x6A, 0x21, 0xF7, 0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF7, 0x60, 0x9B, 0x80, 0xA3, -0xFF, 0x6B, 0x6C, 0xEC, 0x06, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x10, 0x10, -0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF7, 0x40, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF7, 0x60, 0x9B, -0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x0E, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xA0, 0xF4, 0x7C, 0xC2, 0x7D, 0x67, -0x50, 0xA3, 0x7D, 0x67, 0x56, 0xC3, 0x02, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x01, 0x6A, 0x7D, 0x67, -0x51, 0xCB, 0x05, 0x02, 0x82, 0x67, 0x00, 0x18, 0x54, 0x15, 0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, -0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x40, 0xA2, 0x62, 0x67, 0x08, 0x92, 0x01, 0x4A, -0x40, 0xA2, 0x40, 0x32, 0x40, 0x32, 0x40, 0x32, 0x43, 0x32, 0x43, 0x32, 0x6D, 0xEA, 0x40, 0x32, -0x40, 0x32, 0x43, 0x32, 0x43, 0x32, 0x7D, 0x67, 0x48, 0xCB, 0x9D, 0x67, 0x48, 0xAC, 0xE1, 0xF7, -0x1F, 0x6B, 0x6E, 0xEA, 0x1A, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x9D, 0x67, -0x68, 0xAC, 0xA0, 0xF4, 0x74, 0xCA, 0x08, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x44, 0x32, 0x48, 0x33, -0x6D, 0xE2, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xA0, 0xF4, 0x76, 0xCA, 0x00, 0x18, 0x5B, 0x1F, 0x15, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0x9D, 0x67, 0x68, 0xAC, 0xA0, 0xF4, 0x74, 0xCA, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0x00, 0x6B, 0xA0, 0xF4, 0x76, 0xCA, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF7, 0x54, 0x9A, -0x00, 0x6B, 0x60, 0xC2, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFE, 0x63, 0x44, 0x67, -0x7D, 0x67, 0x50, 0xC3, 0x00, 0x6A, 0x02, 0xD2, 0x00, 0x6A, 0x01, 0xD2, 0x00, 0x6A, 0x9D, 0x67, -0x40, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF7, 0x44, 0x9A, 0x40, 0x9A, 0x02, 0xD2, 0x02, 0x93, -0x80, 0xF1, 0x01, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x02, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF7, -0x48, 0x9A, 0x40, 0x9A, 0x01, 0xD2, 0x01, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF7, 0x4C, 0x9A, -0x6C, 0xEA, 0x01, 0xD2, 0x7D, 0x67, 0x50, 0xA3, 0x01, 0x6B, 0x4E, 0xEB, 0x08, 0x23, 0x02, 0x6C, -0x8E, 0xEA, 0x0B, 0x2A, 0x02, 0x93, 0x80, 0x6A, 0x6D, 0xEA, 0x02, 0xD2, 0x06, 0x10, 0x02, 0x93, -0xFF, 0x6A, 0x01, 0x4A, 0x6D, 0xEA, 0x02, 0xD2, 0x00, 0x65, 0x50, 0x6A, 0x7D, 0x67, 0x40, 0xC3, -0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF7, 0x44, 0x9A, 0x02, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, -0x21, 0xF7, 0x48, 0x9A, 0x01, 0x93, 0x60, 0xDA, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF7, 0x50, 0x9A, -0x9D, 0x67, 0x60, 0xA4, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF7, 0x54, 0x9A, 0x9D, 0x67, -0x60, 0xA4, 0x60, 0xC2, 0x02, 0x63, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, 0x65, 0x67, 0x46, 0x67, -0xBD, 0x67, 0x20, 0xF0, 0x80, 0xC5, 0x9D, 0x67, 0x20, 0xF0, 0x64, 0xC4, 0xBD, 0x67, 0x20, 0xF0, -0x48, 0xC5, 0x00, 0x6A, 0x7D, 0x67, 0x52, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x51, 0xC4, 0x00, 0x6A, -0xBD, 0x67, 0x50, 0xC5, 0x7D, 0x67, 0x20, 0xF0, 0x44, 0xA3, 0x9D, 0x67, 0x51, 0xC4, 0xBD, 0x67, -0x51, 0xA5, 0x01, 0x6B, 0x6E, 0xEA, 0x05, 0x22, 0x9D, 0x67, 0x51, 0xA4, 0x03, 0x6D, 0xAE, 0xEA, -0x04, 0x2A, 0x09, 0x6A, 0x7D, 0x67, 0x52, 0xC3, 0x03, 0x10, 0x0A, 0x6A, 0x9D, 0x67, 0x52, 0xC4, -0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF7, 0x78, 0x9A, 0xBD, 0x67, 0x91, 0x85, 0xFF, 0x6A, 0x8C, 0xEA, -0x0F, 0x6C, 0x8C, 0xEA, 0xBD, 0x67, 0x92, 0xA5, 0x90, 0x34, 0x00, 0xF6, 0x80, 0x34, 0x00, 0xF6, -0x83, 0x34, 0x8D, 0xEA, 0x00, 0xF6, 0x40, 0x34, 0x00, 0xF6, 0x83, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, -0x40, 0xC3, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xD3, 0x1F, 0x30, 0xF0, -0x20, 0x6A, 0x21, 0xF7, 0x5C, 0x9A, 0x40, 0xA2, 0x9D, 0x67, 0x50, 0xC4, 0xBD, 0x67, 0x70, 0xA5, -0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x24, 0x5A, -0x58, 0x67, 0x07, 0x2A, 0x5D, 0x67, 0x70, 0xA2, 0x80, 0x6A, 0x4B, 0xEA, 0x6D, 0xEA, 0x7D, 0x67, -0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF7, 0x5C, 0x9A, 0x9D, 0x67, 0x70, 0xA4, 0x60, 0xC2, -0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x65, 0x67, 0x46, 0x67, -0xBD, 0x67, 0x20, 0xF0, 0x80, 0xC5, 0x9D, 0x67, 0x20, 0xF0, 0x64, 0xC4, 0xBD, 0x67, 0x20, 0xF0, -0x48, 0xC5, 0x00, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xE5, 0xF7, 0x00, 0x4A, -0x04, 0xD2, 0xBD, 0x67, 0x20, 0xF0, 0x80, 0xA5, 0x5D, 0x67, 0x20, 0xF0, 0x64, 0xA2, 0xBD, 0x67, -0x20, 0xF0, 0x48, 0xA5, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xFE, 0x1F, 0x7D, 0x67, 0x54, 0xA3, -0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, -0x7D, 0x67, 0x48, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x48, 0x9A, -0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x45, 0xC3, 0x7D, 0x67, 0x48, 0xA3, 0x4C, 0x32, 0x62, 0x67, -0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, -0x1F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x44, 0xC3, 0x7D, 0x67, 0x48, 0xA3, 0x4C, 0x32, 0x62, 0x67, -0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x50, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x7D, 0x67, 0x41, 0xCB, -0x7D, 0x67, 0x48, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x54, 0x9A, -0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x40, 0xC3, 0x01, 0x63, 0x20, 0xE8, 0xFE, 0x63, 0x44, 0x67, -0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, -0x81, 0xF7, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x07, 0x6A, 0x6C, 0xEA, -0x7D, 0x67, 0x4A, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, -0x81, 0xF7, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x10, 0x6A, -0x6C, 0xEA, 0x53, 0x32, 0x7D, 0x67, 0x49, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, -0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, -0x03, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x48, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, -0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x4C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x42, 0x32, 0x42, 0x32, -0x7D, 0x67, 0x43, 0xCB, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, -0x81, 0xF7, 0x50, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x1F, 0x6A, 0x6C, 0xEA, -0x7D, 0x67, 0x44, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, -0x81, 0xF7, 0x50, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x42, 0x32, 0x4A, 0x32, 0x00, 0xD2, 0x02, 0x63, -0x20, 0xE8, 0x00, 0x65, 0xFE, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, -0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, -0xFF, 0x6A, 0x4C, 0xEB, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x4B, 0xC3, 0x7D, 0x67, 0x50, 0xA3, -0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, -0xFF, 0x6A, 0x6C, 0xEA, 0x4E, 0x33, 0xFF, 0x6A, 0x4C, 0xEB, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, -0x4A, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, -0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x08, 0x6A, 0x6C, 0xEA, -0x4F, 0x32, 0x7D, 0x67, 0x49, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, -0x20, 0x6A, 0x81, 0xF7, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, -0x10, 0x6A, 0x6C, 0xEA, 0x53, 0x32, 0x7D, 0x67, 0x48, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, -0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x4C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x42, 0x32, -0x42, 0x32, 0x7D, 0x67, 0x43, 0xCB, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, -0x20, 0x6A, 0x81, 0xF7, 0x50, 0x9A, 0x49, 0xE3, 0x60, 0x9A, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, -0xE0, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x42, 0xCB, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, -0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, -0x6C, 0xEA, 0x62, 0x67, 0x40, 0x6A, 0x6C, 0xEA, 0x5B, 0x32, 0x7D, 0x67, 0x43, 0xC3, 0x7D, 0x67, -0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x5C, 0x9A, 0x49, 0xE3, -0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x5E, 0x32, 0x7D, 0x67, 0x42, 0xC3, 0x7D, 0x67, 0x50, 0xA3, -0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF7, 0x40, 0x9A, 0x49, 0xE3, 0x40, 0xA2, -0x7D, 0x67, 0x41, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, -0xA1, 0xF7, 0x44, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x40, 0xC3, 0x02, 0x63, 0x20, 0xE8, -0xFC, 0x63, 0x07, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF7, 0x48, 0x9A, 0x40, 0xA2, 0x7D, 0x67, -0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF7, 0x4C, 0x9A, 0x40, 0xA2, 0x9D, 0x67, 0x51, 0xC4, -0x5D, 0x67, 0x70, 0xA2, 0x9D, 0x67, 0x51, 0xA4, 0x6E, 0xEA, 0x48, 0x22, 0x7D, 0x67, 0x50, 0xA3, -0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF7, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, -0xFF, 0x6A, 0x6C, 0xEA, 0x5A, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x01, 0x6B, 0x4E, 0xEB, 0x12, 0x23, -0x02, 0x52, 0x78, 0x67, 0x02, 0x23, 0x08, 0x22, 0x1E, 0x10, 0x02, 0x6B, 0x4E, 0xEB, 0x10, 0x23, -0x03, 0x6B, 0x6E, 0xEA, 0x13, 0x22, 0x17, 0x10, 0x9D, 0x67, 0x50, 0xA4, 0x82, 0x67, 0x00, 0x18, -0x83, 0x3B, 0x11, 0x10, 0x7D, 0x67, 0x50, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x4A, 0x20, 0x0B, 0x10, -0x9D, 0x67, 0x50, 0xA4, 0x82, 0x67, 0x00, 0x18, 0x67, 0x20, 0x05, 0x10, 0x7D, 0x67, 0x50, 0xA3, -0x82, 0x67, 0x00, 0x18, 0x99, 0x20, 0x9D, 0x67, 0x50, 0xA4, 0x01, 0x4A, 0x7D, 0x67, 0x50, 0xC3, -0x9D, 0x67, 0x71, 0xA4, 0x9D, 0x67, 0x50, 0xA4, 0x6E, 0xEA, 0xC0, 0x2A, 0x30, 0xF0, 0x20, 0x6A, -0xA1, 0xF7, 0x48, 0x9A, 0x9D, 0x67, 0x70, 0xA4, 0x60, 0xC2, 0x01, 0x10, 0x00, 0x65, 0x07, 0x97, -0x04, 0x63, 0x00, 0xEF, 0x64, 0x67, 0x01, 0xD5, 0x46, 0x67, 0x9D, 0x67, 0x60, 0xC4, 0x7D, 0x67, -0x48, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x08, 0x22, 0x01, 0x92, 0x40, 0xAA, 0xFF, 0xF5, 0x1F, 0x6B, -0x6C, 0xEA, 0x01, 0x93, 0x40, 0xCB, 0x0A, 0x10, 0x01, 0x92, 0x60, 0xAA, 0x00, 0xF2, 0x00, 0x6A, -0x4D, 0xEB, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x01, 0x92, 0x60, 0xCA, 0x7D, 0x67, 0x40, 0xA3, -0x01, 0x6C, 0x8E, 0xEA, 0x06, 0x2A, 0x01, 0x92, 0xCC, 0xF4, 0x00, 0x6B, 0x6B, 0xEB, 0x60, 0xCA, -0x0F, 0x10, 0x7D, 0x67, 0x40, 0xA3, 0x03, 0x6C, 0x8E, 0xEA, 0x06, 0x2A, 0x01, 0x92, 0xC1, 0xF4, -0x00, 0x6B, 0x6B, 0xEB, 0x60, 0xCA, 0x04, 0x10, 0x01, 0x92, 0x48, 0xF2, 0x00, 0x6B, 0x60, 0xCA, -0x20, 0xE8, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF7, 0x5C, 0x9A, -0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF7, 0x7C, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, 0x02, 0x6B, -0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x40, 0x9A, -0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x44, 0x9A, 0x09, 0x6B, -0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x48, 0x9A, 0x7A, 0x6B, 0x6B, 0xEB, 0x60, 0xC2, -0xA1, 0xF0, 0x14, 0x6B, 0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xA6, 0x1A, -0x62, 0x67, 0x41, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x04, 0xD2, 0xA1, 0xF0, 0x14, 0x6C, 0x01, 0x6B, -0x6B, 0xEB, 0x04, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x30, 0xF0, 0x20, 0x6A, -0xE1, 0xF7, 0x4C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF7, 0x6C, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, -0x6C, 0xEC, 0x01, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x81, 0xF4, 0x10, 0x6C, -0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x50, 0x9A, 0xA3, 0x67, 0xC2, 0x67, -0x00, 0x18, 0xBA, 0x1A, 0x81, 0xF6, 0x10, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, -0xE1, 0xF7, 0x50, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x83, 0xF0, 0x10, 0x6C, -0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x50, 0x9A, 0xA3, 0x67, 0xC2, 0x67, -0x00, 0x18, 0xBA, 0x1A, 0x83, 0xF2, 0x10, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x30, 0xF0, 0x20, 0x6A, -0xE1, 0xF7, 0x50, 0x9A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x01, 0xF4, 0x00, 0x6B, -0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xA6, 0x1A, 0x62, 0x67, 0x03, 0x6A, -0x6D, 0xEA, 0x04, 0xD2, 0x01, 0xF4, 0x00, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x04, 0x92, 0xA3, 0x67, -0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x01, 0xF6, 0x00, 0x6B, 0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, -0xA2, 0x67, 0x00, 0x18, 0xA6, 0x1A, 0x62, 0x67, 0x03, 0x6A, 0x6D, 0xEA, 0x04, 0xD2, 0x01, 0xF6, -0x00, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x04, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, -0x03, 0xF0, 0x00, 0x6B, 0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xA6, 0x1A, -0x62, 0x67, 0x03, 0x6A, 0x6D, 0xEA, 0x04, 0xD2, 0x03, 0xF0, 0x00, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, -0x04, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x03, 0xF2, 0x00, 0x6B, 0x01, 0x6A, -0x4B, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xA6, 0x1A, 0x62, 0x67, 0x03, 0x6A, 0x6D, 0xEA, -0x04, 0xD2, 0x03, 0xF2, 0x00, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x04, 0x92, 0xA3, 0x67, 0xC2, 0x67, -0x00, 0x18, 0xBA, 0x1A, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, -0x00, 0x18, 0x9B, 0x1D, 0x01, 0xF4, 0x00, 0x6B, 0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, 0xA2, 0x67, -0x00, 0x18, 0xA6, 0x1A, 0x62, 0x67, 0x04, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x04, 0xD2, 0x01, 0xF4, -0x00, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x04, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, -0x01, 0xF6, 0x00, 0x6B, 0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xA6, 0x1A, -0x62, 0x67, 0x04, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x04, 0xD2, 0x01, 0xF6, 0x00, 0x6C, 0x01, 0x6B, -0x6B, 0xEB, 0x04, 0x92, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x03, 0xF0, 0x00, 0x6B, -0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xA6, 0x1A, 0x62, 0x67, 0x04, 0x6A, -0x4B, 0xEA, 0x6C, 0xEA, 0x04, 0xD2, 0x03, 0xF0, 0x00, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x04, 0x92, -0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x03, 0xF2, 0x00, 0x6B, 0x01, 0x6A, 0x4B, 0xEA, -0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xA6, 0x1A, 0x62, 0x67, 0x04, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, -0x04, 0xD2, 0x03, 0xF2, 0x00, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x04, 0x92, 0xA3, 0x67, 0xC2, 0x67, -0x00, 0x18, 0xBA, 0x1A, 0x81, 0xF4, 0x10, 0x6B, 0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, 0xA2, 0x67, -0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x81, 0xF6, 0x10, 0x6B, 0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, -0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x83, 0xF0, 0x10, 0x6B, 0x01, 0x6A, 0x4B, 0xEA, -0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x83, 0xF2, 0x10, 0x6B, 0x01, 0x6A, -0x4B, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0xA1, 0xF0, 0x14, 0x6B, -0x01, 0x6A, 0x4B, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xA6, 0x1A, 0x62, 0x67, 0x40, 0x6A, -0x6D, 0xEA, 0x04, 0xD2, 0xA1, 0xF0, 0x14, 0x6C, 0x01, 0x6B, 0x6B, 0xEB, 0x04, 0x92, 0xA3, 0x67, -0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x6C, 0x9A, 0x30, 0xF0, -0x20, 0x6A, 0xE1, 0xF7, 0x4C, 0x9A, 0x80, 0xA2, 0xFF, 0x6A, 0x8C, 0xEA, 0xFE, 0x6C, 0x8C, 0xEA, -0x40, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, 0x40, 0x9A, 0x3F, 0x6B, 0x60, 0xC2, 0x30, 0xF0, -0x20, 0x6A, 0xC1, 0xF7, 0x7C, 0x9A, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF7, 0x5C, 0x9A, 0x80, 0xA2, -0xFF, 0x6A, 0x8C, 0xEA, 0xFD, 0x6C, 0x8C, 0xEA, 0x40, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF7, -0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF7, 0x74, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x6C, 0xEC, -0x20, 0x6B, 0x6D, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, -0x00, 0xD4, 0x00, 0x92, 0x05, 0x6B, 0x62, 0xDA, 0x00, 0x94, 0x00, 0x6A, 0x00, 0x6B, 0x40, 0xDC, -0x61, 0xDC, 0x20, 0xE8, 0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0xE5, 0xF7, 0x00, 0x4A, 0x00, 0xD2, -0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x50, 0x9A, 0x03, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, -0x21, 0xF4, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF4, 0x78, 0x9B, 0x60, 0xDA, 0x30, 0xF0, -0x20, 0x6A, 0x21, 0xF4, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x41, 0xF4, 0x60, 0x9B, 0x60, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x50, 0x9A, 0x02, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, -0x21, 0xF4, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF4, 0x78, 0x9B, 0x60, 0xDA, 0x30, 0xF0, -0x20, 0x6A, 0x21, 0xF4, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x41, 0xF4, 0x60, 0x9B, 0x60, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x50, 0x9A, 0x01, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, -0x21, 0xF4, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x41, 0xF4, 0x64, 0x9B, 0x60, 0xDA, 0x30, 0xF0, -0x20, 0x6A, 0x21, 0xF4, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x41, 0xF4, 0x60, 0x9B, 0x60, 0xDA, -0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, 0x50, 0x9A, 0x00, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, -0x21, 0xF4, 0x54, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF4, 0x78, 0x9B, 0x60, 0xDA, 0x30, 0xF0, -0x20, 0x6A, 0x21, 0xF4, 0x5C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x41, 0xF4, 0x60, 0x9B, 0x60, 0xDA, -0x01, 0x63, 0x20, 0xE8, 0xDC, 0x63, 0x47, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0xE5, 0xF7, 0x00, 0x4A, -0x04, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x07, 0x04, 0x62, 0x67, 0xA1, 0xF2, 0x04, 0x4B, 0x54, 0x6A, -0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0x30, 0x04, 0x30, 0xF0, 0x20, 0x6A, 0x1C, 0x04, 0x62, 0x67, -0xE1, 0xF2, 0x18, 0x4B, 0x54, 0x6A, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0x30, 0x04, 0x30, 0xF0, -0x20, 0x6A, 0x31, 0x04, 0x62, 0x67, 0x41, 0xF3, 0x0C, 0x4B, 0x54, 0x6A, 0xA3, 0x67, 0xC2, 0x67, -0x00, 0x18, 0x30, 0x04, 0x00, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x87, 0x10, 0x7D, 0x67, 0x58, 0xA3, -0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, -0x05, 0xD2, 0x05, 0x92, 0x49, 0x6B, 0x60, 0xC2, 0x05, 0x92, 0x00, 0x6B, 0x61, 0xC2, 0x05, 0x92, -0x00, 0x6B, 0x63, 0xC2, 0x05, 0x92, 0x09, 0x6B, 0x64, 0xC2, 0x05, 0x92, 0x8E, 0xA2, 0x0D, 0x6B, -0x6B, 0xEB, 0x8C, 0xEB, 0x6E, 0xC2, 0x05, 0x92, 0x8E, 0xA2, 0x04, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, -0x6E, 0xC2, 0x05, 0x92, 0x8F, 0xA2, 0x04, 0x6B, 0x8D, 0xEB, 0x6F, 0xC2, 0x05, 0x92, 0x8E, 0xA2, -0x31, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6E, 0xC2, 0x05, 0x92, 0x8E, 0xA2, 0x40, 0x6B, 0x8D, 0xEB, -0x6E, 0xC2, 0x05, 0x92, 0x8E, 0xA2, 0x80, 0x6B, 0x6B, 0xEB, 0x8D, 0xEB, 0x6E, 0xC2, 0x05, 0x92, -0x9D, 0xA2, 0x03, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x7D, 0xC2, 0x05, 0x92, 0x9D, 0xA2, 0x41, 0x6B, -0x6B, 0xEB, 0x8C, 0xEB, 0x7D, 0xC2, 0x05, 0x92, 0x00, 0x6B, 0x7C, 0xC2, 0x05, 0x92, 0x91, 0xA2, -0x31, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x71, 0xC2, 0x05, 0x92, 0x00, 0x6B, 0x72, 0xC2, 0x05, 0x92, -0x8F, 0xA2, 0x41, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, 0x05, 0x92, 0x8B, 0xA2, 0x08, 0x6B, -0x6B, 0xEB, 0x8C, 0xEB, 0x6B, 0xC2, 0x05, 0x92, 0x90, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, -0x70, 0xC2, 0x05, 0x92, 0x91, 0xA2, 0x10, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x71, 0xC2, 0x05, 0x92, -0x8B, 0xA2, 0x39, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6B, 0xC2, 0x05, 0x92, 0x00, 0x6B, 0x76, 0xC2, -0x05, 0x92, 0x00, 0x6B, 0x69, 0xC2, 0x05, 0x92, 0x01, 0x6B, 0x6B, 0xEB, 0x68, 0xC2, 0x05, 0x92, -0x9D, 0xA2, 0x21, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x7D, 0xC2, 0x05, 0x92, 0x49, 0x6B, 0x67, 0xC2, -0x7D, 0x67, 0x58, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0x83, 0x00, 0x52, -0x58, 0x67, 0x7F, 0xF7, 0x13, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, -0xA3, 0xF2, 0x7E, 0xC2, 0x00, 0x18, 0xBA, 0x28, 0x00, 0x18, 0x0D, 0x22, 0x30, 0xF0, 0x20, 0x6A, -0x21, 0xF4, 0x44, 0x9A, 0x33, 0x6B, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0xC5, 0xF6, -0x14, 0x4B, 0x07, 0x02, 0x83, 0x67, 0xA2, 0x67, 0x54, 0x6E, 0x00, 0x18, 0x30, 0x04, 0x30, 0xF0, -0x20, 0x6A, 0x62, 0x67, 0x25, 0xF7, 0x08, 0x4B, 0x31, 0x02, 0x83, 0x67, 0xA2, 0x67, 0x54, 0x6E, -0x00, 0x18, 0x30, 0x04, 0x30, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x65, 0xF7, 0x1C, 0x4B, 0x1C, 0x02, -0x83, 0x67, 0xA2, 0x67, 0x54, 0x6E, 0x00, 0x18, 0x30, 0x04, 0x47, 0x97, 0x24, 0x63, 0x00, 0xEF, -0xFD, 0x63, 0x05, 0x62, 0x06, 0xD4, 0x07, 0xD5, 0x08, 0xD6, 0x09, 0xD7, 0x06, 0x04, 0x00, 0x18, -0x54, 0x15, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x09, 0xD5, -0x0A, 0xD6, 0x0B, 0xD7, 0x0A, 0x92, 0x01, 0x4A, 0x2D, 0x22, 0x09, 0x93, 0x1F, 0xF7, 0x00, 0x6A, -0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x05, 0x22, 0x09, 0x93, 0x1F, 0xF7, 0x00, 0x6A, -0x6C, 0xEA, 0x08, 0x2A, 0x09, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF6, 0x40, 0x9A, 0x49, 0xE3, -0x40, 0x9A, 0x07, 0x10, 0x09, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF6, 0x44, 0x9A, 0x49, 0xE3, -0x40, 0x9A, 0x05, 0xD2, 0x0A, 0x92, 0x82, 0x67, 0x00, 0x18, 0xB9, 0x12, 0x04, 0xD2, 0x0A, 0x92, -0x4F, 0xEB, 0x05, 0x92, 0x4C, 0xEB, 0x04, 0x92, 0x0B, 0x94, 0xA4, 0x67, 0xA4, 0xEA, 0x45, 0x67, -0x6D, 0xEA, 0x0B, 0xD2, 0x09, 0x93, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, -0x6E, 0xEA, 0x05, 0x22, 0x09, 0x93, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x09, 0x2A, 0x09, 0x93, -0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF6, 0x40, 0x9A, 0x49, 0xE3, 0x0B, 0x93, 0x60, 0xDA, 0x08, 0x10, -0x09, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF6, 0x44, 0x9A, 0x49, 0xE3, 0x0B, 0x93, 0x60, 0xDA, -0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x0A, 0xD4, 0x0B, 0xD5, -0x0C, 0xD6, 0x00, 0x6A, 0x06, 0xD2, 0x0B, 0x93, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, -0x00, 0x6B, 0x6E, 0xEA, 0x05, 0x22, 0x0B, 0x93, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x08, 0x2A, -0x0B, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF6, 0x40, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x07, 0x10, -0x0B, 0x93, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF6, 0x44, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x05, 0xD2, -0x0C, 0x92, 0x82, 0x67, 0x00, 0x18, 0xB9, 0x12, 0x04, 0xD2, 0x05, 0x93, 0x0C, 0x92, 0x4C, 0xEB, -0x04, 0x92, 0x83, 0x67, 0x86, 0xEA, 0x44, 0x67, 0x06, 0xD2, 0x06, 0x92, 0x09, 0x97, 0x05, 0x63, -0x00, 0xEF, 0x00, 0x65, 0xFB, 0x63, 0x09, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0xE5, 0xF7, 0x00, 0x4A, -0x05, 0xD2, 0x00, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x24, 0x10, 0x9D, 0x67, 0x58, 0xA4, 0x54, 0x32, -0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF6, 0x48, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, -0x50, 0xC3, 0x9D, 0x67, 0x70, 0xA4, 0x08, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x50, 0xC3, -0x9D, 0x67, 0x58, 0xA4, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF6, 0x48, 0x9A, -0x49, 0xE3, 0x9D, 0x67, 0x70, 0xA4, 0x60, 0xC2, 0x7D, 0x67, 0x58, 0xA3, 0x01, 0x4A, 0x9D, 0x67, -0x58, 0xC4, 0x7D, 0x67, 0x58, 0x83, 0x00, 0x52, 0x58, 0x67, 0xD7, 0x22, 0x00, 0x18, 0x41, 0x22, -0x00, 0x18, 0xF4, 0x3A, 0x05, 0x92, 0x82, 0x67, 0x00, 0x18, 0x08, 0x22, 0x09, 0x97, 0x05, 0x63, -0x00, 0xEF, 0x00, 0x65, 0xF9, 0x63, 0x0E, 0xD4, 0x0F, 0xD5, 0x10, 0xD6, 0x04, 0x6A, 0x04, 0xD2, -0x00, 0x6A, 0x03, 0xD2, 0x10, 0x92, 0x02, 0xD2, 0x0E, 0x92, 0x06, 0xD2, 0x07, 0x11, 0x0F, 0x92, -0x40, 0x82, 0x25, 0x6B, 0x6E, 0xEA, 0x08, 0x22, 0x0F, 0x92, 0x60, 0x82, 0x06, 0x92, 0x60, 0xC2, -0x06, 0x92, 0x01, 0x4A, 0x06, 0xD2, 0xF7, 0x10, 0x08, 0x02, 0x05, 0xD2, 0x03, 0x92, 0x13, 0x22, -0x05, 0x92, 0x30, 0x6B, 0x60, 0xC2, 0x05, 0x92, 0x01, 0x4A, 0x05, 0xD2, 0x9D, 0x67, 0x67, 0xA4, -0x58, 0x6A, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x05, 0x92, 0x60, 0xC2, -0x05, 0x92, 0x01, 0x4A, 0x05, 0xD2, 0x0F, 0x92, 0x01, 0x4A, 0x40, 0x82, 0x62, 0x6B, 0x6E, 0xEA, -0x40, 0x2A, 0x0F, 0x92, 0x02, 0x4A, 0x40, 0x82, 0x78, 0x6C, 0x8E, 0xEA, 0x06, 0x22, 0x0F, 0x92, -0x02, 0x4A, 0x40, 0x82, 0x58, 0x6B, 0x6E, 0xEA, 0x34, 0x2A, 0x02, 0x92, 0x40, 0x82, 0x9D, 0x67, -0x46, 0xC4, 0x0F, 0x92, 0x02, 0x4A, 0x40, 0x82, 0x78, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x20, 0x6A, -0x01, 0x10, 0x00, 0x6A, 0x9D, 0x67, 0x47, 0xC4, 0x04, 0x6A, 0x04, 0xD2, 0x1B, 0x10, 0x5D, 0x67, -0x66, 0xA2, 0x04, 0x92, 0x67, 0xEA, 0x0F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF6, -0x0C, 0x4A, 0x49, 0xE3, 0x60, 0x82, 0x9D, 0x67, 0x47, 0xA4, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, -0x00, 0xF6, 0x63, 0x33, 0x05, 0x92, 0x60, 0xC2, 0x05, 0x92, 0x01, 0x4A, 0x05, 0xD2, 0x04, 0x92, -0xFC, 0x4A, 0x04, 0xD2, 0x04, 0x92, 0x00, 0x52, 0x58, 0x67, 0xE1, 0x22, 0x0F, 0x92, 0x02, 0x4A, -0x0F, 0xD2, 0x0F, 0x92, 0x01, 0x4A, 0x40, 0x82, 0x77, 0x6B, 0x6E, 0xEA, 0x41, 0x2A, 0x0F, 0x92, -0x02, 0x4A, 0x40, 0x82, 0x78, 0x6C, 0x8E, 0xEA, 0x06, 0x22, 0x0F, 0x92, 0x02, 0x4A, 0x40, 0x82, -0x58, 0x6B, 0x6E, 0xEA, 0x35, 0x2A, 0x02, 0x92, 0x40, 0xAA, 0x9D, 0x67, 0x42, 0xCC, 0x0F, 0x92, -0x02, 0x4A, 0x40, 0x82, 0x78, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x20, 0x6A, 0x01, 0x10, 0x00, 0x6A, -0x9D, 0x67, 0x47, 0xC4, 0x0C, 0x6A, 0x04, 0xD2, 0x1B, 0x10, 0x5D, 0x67, 0x62, 0xAA, 0x04, 0x92, -0x67, 0xEA, 0x0F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF6, 0x0C, 0x4A, 0x49, 0xE3, -0x60, 0x82, 0x9D, 0x67, 0x47, 0xA4, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, -0x05, 0x92, 0x60, 0xC2, 0x05, 0x92, 0x01, 0x4A, 0x05, 0xD2, 0x04, 0x92, 0xFC, 0x4A, 0x04, 0xD2, -0x04, 0x92, 0x00, 0x52, 0x58, 0x67, 0xE1, 0x22, 0x0F, 0x92, 0x02, 0x4A, 0x0F, 0xD2, 0x3E, 0x10, -0x0F, 0x92, 0x01, 0x4A, 0x40, 0x82, 0x78, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x0F, 0x92, 0x01, 0x4A, -0x40, 0x82, 0x58, 0x6C, 0x8E, 0xEA, 0x32, 0x2A, 0x02, 0x92, 0x40, 0x9A, 0x00, 0xD2, 0x0F, 0x92, -0x01, 0x4A, 0x40, 0x82, 0x78, 0x6B, 0x6E, 0xEA, 0x02, 0x2A, 0x20, 0x6A, 0x01, 0x10, 0x00, 0x6A, -0x9D, 0x67, 0x47, 0xC4, 0x1C, 0x6A, 0x04, 0xD2, 0x1A, 0x10, 0x00, 0x93, 0x04, 0x92, 0x66, 0xEA, -0x0F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF6, 0x0C, 0x4A, 0x49, 0xE3, 0x60, 0x82, -0x9D, 0x67, 0x47, 0xA4, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x05, 0x92, -0x60, 0xC2, 0x05, 0x92, 0x01, 0x4A, 0x05, 0xD2, 0x04, 0x92, 0xFC, 0x4A, 0x04, 0xD2, 0x04, 0x92, -0x00, 0x52, 0x58, 0x67, 0xE2, 0x22, 0x0F, 0x92, 0x01, 0x4A, 0x0F, 0xD2, 0x08, 0x02, 0x07, 0xD2, -0x0A, 0x10, 0x07, 0x92, 0x60, 0x82, 0x06, 0x92, 0x60, 0xC2, 0x06, 0x92, 0x01, 0x4A, 0x06, 0xD2, -0x07, 0x92, 0x01, 0x4A, 0x07, 0xD2, 0x07, 0x93, 0x05, 0x92, 0x43, 0xEB, 0x58, 0x67, 0xF1, 0x2A, -0x02, 0x92, 0x04, 0x4A, 0x02, 0xD2, 0x0F, 0x92, 0x01, 0x4A, 0x0F, 0xD2, 0x0F, 0x92, 0x40, 0x82, -0xFF, 0xF6, 0x15, 0x2A, 0x0E, 0x92, 0x03, 0x22, 0x06, 0x92, 0x00, 0x6B, 0x60, 0xC2, 0x06, 0x93, -0x0E, 0x92, 0x4B, 0xE3, 0x07, 0x63, 0x20, 0xE8, 0xFD, 0x63, 0x05, 0x62, 0x07, 0xD5, 0x08, 0xD6, -0x09, 0xD7, 0x06, 0xD4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC3, 0xF2, 0x40, 0xA2, -0x01, 0x6B, 0x6E, 0xEA, 0x19, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC3, 0xF2, -0x41, 0xA2, 0x12, 0x2A, 0x06, 0x93, 0x06, 0x02, 0x04, 0x4A, 0x30, 0xF0, 0x20, 0x6C, 0x02, 0xF4, -0x08, 0x4C, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0x25, 0x23, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF4, -0x08, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x50, 0x24, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, -0xFF, 0x63, 0x02, 0xD4, 0x02, 0x92, 0x40, 0xA2, 0x7D, 0x67, 0x46, 0xC3, 0x02, 0x92, 0x02, 0x4A, -0x40, 0xA2, 0x62, 0x67, 0x08, 0x6A, 0x6C, 0xEA, 0x4F, 0x32, 0x9D, 0x67, 0x45, 0xC4, 0x7D, 0x67, -0x46, 0xA3, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, -0x49, 0xE3, 0x00, 0xD2, 0x02, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x5E, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, -0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x4C, 0xEB, 0x00, 0x92, 0x7C, 0x33, 0xAE, 0xA2, -0x7F, 0x6C, 0xAC, 0xEC, 0x8D, 0xEB, 0x6E, 0xC2, 0x02, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x62, 0x67, -0x40, 0x6A, 0x6C, 0xEA, 0x5B, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, -0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x00, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0x78, 0x33, 0xAE, 0xA2, -0x41, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6E, 0xC2, 0x9D, 0x67, 0x45, 0xA4, 0x80, 0xF0, -0x0B, 0x2A, 0x02, 0x92, 0x01, 0x4A, 0x40, 0xA2, 0x1F, 0x6B, 0x6C, 0xEA, 0x00, 0x93, 0x44, 0xC3, -0x02, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x4C, 0xEB, -0x03, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, -0x00, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0xAE, 0xA2, 0x04, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, -0x6E, 0xC2, 0x02, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, -0x4C, 0xEB, 0x03, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, -0x4C, 0xEC, 0x00, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0x68, 0x33, 0xAE, 0xA2, 0x0D, 0x6C, 0x8B, 0xEC, -0xAC, 0xEC, 0x8D, 0xEB, 0x6E, 0xC2, 0x02, 0x92, 0x01, 0x4A, 0x40, 0xA2, 0x5E, 0x33, 0xFF, 0x6A, -0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x00, 0x92, -0x01, 0x6B, 0x8C, 0xEB, 0x68, 0x33, 0xAF, 0xA2, 0x05, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, -0x6F, 0xC2, 0x02, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x30, 0x6A, 0x6C, 0xEA, 0x53, 0x33, -0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, -0x00, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0x70, 0x33, 0xAE, 0xA2, 0x31, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, -0x8D, 0xEB, 0x6E, 0xC2, 0x00, 0x6A, 0x7D, 0x67, 0x44, 0xC3, 0x18, 0x10, 0x9D, 0x67, 0x46, 0xA4, -0x4C, 0x32, 0x62, 0x67, 0x9D, 0x67, 0x44, 0xA4, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF7, -0x48, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x64, 0xA4, 0x03, 0x4B, 0x02, 0x94, 0x6D, 0xE4, 0x60, 0xA3, -0x60, 0xC2, 0x7D, 0x67, 0x44, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x44, 0xC4, 0x7D, 0x67, 0x44, 0xA3, -0x04, 0x5A, 0x58, 0x67, 0xE3, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, -0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x40, 0xA2, 0x7D, 0x67, 0x51, 0xC3, 0x00, 0x6A, -0x9D, 0x67, 0x50, 0xC4, 0x18, 0x10, 0x7D, 0x67, 0x51, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x9D, 0x67, -0x50, 0xA4, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF7, 0x4C, 0x9A, 0x49, 0xE3, 0x9D, 0x67, -0x70, 0xA4, 0x03, 0x4B, 0x08, 0x94, 0x6D, 0xE4, 0x60, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x50, 0xA3, -0x01, 0x4A, 0x9D, 0x67, 0x50, 0xC4, 0x7D, 0x67, 0x50, 0xA3, 0x02, 0x5A, 0x58, 0x67, 0xE3, 0x2A, -0x7D, 0x67, 0x51, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x16, 0x33, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, -0xFA, 0x63, 0x0B, 0x62, 0x0C, 0xD4, 0x00, 0x6A, 0x7D, 0x67, 0x56, 0xC3, 0x00, 0x6A, 0x9D, 0x67, -0x54, 0xC4, 0x01, 0x6A, 0xBD, 0x67, 0x53, 0xC5, 0x00, 0x6A, 0x7D, 0x67, 0x51, 0xC3, 0x00, 0x6A, -0x9D, 0x67, 0x50, 0xC4, 0x00, 0x6A, 0xBD, 0x67, 0x57, 0xC5, 0x22, 0x10, 0x7D, 0x67, 0x57, 0xA3, -0x0C, 0x93, 0x49, 0xE3, 0x40, 0xA2, 0x22, 0x22, 0x9D, 0x67, 0x54, 0xA4, 0x01, 0x4A, 0xBD, 0x67, -0x54, 0xC5, 0x7D, 0x67, 0x56, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x56, 0xC4, 0xBD, 0x67, 0x56, 0xA5, -0x0B, 0x6B, 0x6E, 0xEA, 0x08, 0x2A, 0x00, 0x6A, 0x9D, 0x67, 0x56, 0xC4, 0xBD, 0x67, 0x53, 0xA5, -0x01, 0x4A, 0x7D, 0x67, 0x53, 0xC3, 0x9D, 0x67, 0x57, 0xA4, 0x01, 0x4A, 0xBD, 0x67, 0x57, 0xC5, -0x7D, 0x67, 0x57, 0xA3, 0x37, 0x5A, 0x58, 0x67, 0xD9, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x5F, 0xA2, 0x0F, 0x5A, 0x58, 0x67, 0x10, 0x22, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x5F, 0xA2, 0x61, 0x42, 0xFF, 0x6A, -0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x7F, 0xC2, 0x07, 0x10, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xA3, 0xF2, 0x7F, 0xC2, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x5F, 0xA2, 0x50, 0x32, 0x7D, 0x67, 0x50, 0xC3, -0x00, 0x6A, 0x9D, 0x67, 0x57, 0xC4, 0x8E, 0x10, 0xBD, 0x67, 0x77, 0xA5, 0x43, 0x67, 0x48, 0x32, -0x48, 0x34, 0x4B, 0xE4, 0x6B, 0xE2, 0x7D, 0x67, 0x55, 0xC3, 0x9D, 0x67, 0x73, 0xA4, 0xBD, 0x67, -0x57, 0xA5, 0x4F, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, 0x6F, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, 0x0F, 0x6A, -0x6C, 0xEA, 0x7D, 0x67, 0x51, 0xC3, 0x9D, 0x67, 0x70, 0xA4, 0xBD, 0x67, 0x51, 0xA5, 0x4D, 0xEB, -0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5A, 0xC3, 0x9D, 0x67, 0x77, 0xA4, 0xBD, 0x67, 0x53, 0xA5, -0xFF, 0x4A, 0x6E, 0xEA, 0x3A, 0x2A, 0x7D, 0x67, 0x53, 0xA3, 0x01, 0x6B, 0x4F, 0xE3, 0xFF, 0x6A, -0x6C, 0xEA, 0x62, 0x67, 0x43, 0x67, 0x48, 0x32, 0x48, 0x34, 0x4B, 0xE4, 0x6F, 0xE2, 0xFF, 0x6A, -0x4C, 0xEB, 0x9D, 0x67, 0x54, 0xA4, 0x49, 0xE3, 0xBD, 0x67, 0x52, 0xC5, 0x00, 0x6A, 0x7D, 0x67, -0x56, 0xC3, 0x13, 0x10, 0x9D, 0x67, 0x56, 0xA4, 0x01, 0x4A, 0xBD, 0x67, 0x96, 0xA5, 0xBD, 0x67, -0x75, 0xA5, 0x6D, 0xE4, 0x0C, 0x94, 0x6D, 0xE4, 0x60, 0xA3, 0x04, 0x04, 0x49, 0xE4, 0x6A, 0xC2, -0x7D, 0x67, 0x56, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x56, 0xC4, 0xBD, 0x67, 0x76, 0xA5, 0x9D, 0x67, -0x52, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0xE6, 0x2A, 0x7D, 0x67, 0x52, 0xA3, 0x61, 0x42, 0xFF, 0xF7, -0x1F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x53, 0xCC, 0x1F, 0x10, 0x00, 0x6A, 0xBD, 0x67, 0x56, 0xC5, -0x13, 0x10, 0x7D, 0x67, 0x56, 0xA3, 0x01, 0x4A, 0xBD, 0x67, 0x96, 0xA5, 0xBD, 0x67, 0x75, 0xA5, -0x6D, 0xE4, 0x0C, 0x94, 0x6D, 0xE4, 0x60, 0xA3, 0x04, 0x04, 0x49, 0xE4, 0x6A, 0xC2, 0x7D, 0x67, -0x56, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x56, 0xC4, 0xBD, 0x67, 0x56, 0xA5, 0x0B, 0x5A, 0x58, 0x67, -0xE8, 0x2A, 0x0C, 0x6A, 0x7D, 0x67, 0x53, 0xCB, 0x00, 0x6A, 0x9D, 0x67, 0x58, 0xC4, 0x06, 0x94, -0x07, 0x95, 0x08, 0x96, 0x09, 0x97, 0x00, 0x18, 0xB8, 0x22, 0xBD, 0x67, 0x57, 0xA5, 0x01, 0x4A, -0x7D, 0x67, 0x57, 0xC3, 0x9D, 0x67, 0x77, 0xA4, 0xBD, 0x67, 0x53, 0xA5, 0x43, 0xEB, 0x58, 0x67, -0x7F, 0xF7, 0x0A, 0x2A, 0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFA, 0x63, 0x0B, 0x62, -0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x70, 0xC4, 0x7D, 0x67, 0x20, 0xF0, 0x54, 0xC3, -0x9D, 0x67, 0x20, 0xF0, 0x50, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, -0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x05, 0x6A, 0x7D, 0x67, 0x51, 0xCB, 0x0F, 0x6A, -0x9D, 0x67, 0x54, 0xC4, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, 0x9D, 0x67, 0x56, 0xC4, 0x7D, 0x67, -0x20, 0xF0, 0x54, 0xA3, 0x9D, 0x67, 0x57, 0xC4, 0x04, 0x92, 0x20, 0xF0, 0x45, 0xA2, 0x7D, 0x67, -0x58, 0xC3, 0x04, 0x92, 0x20, 0xF0, 0x46, 0xA2, 0x9D, 0x67, 0x59, 0xC4, 0x04, 0x92, 0x20, 0xF0, -0x47, 0xA2, 0x7D, 0x67, 0x5A, 0xC3, 0x05, 0x94, 0x06, 0x95, 0x07, 0x96, 0x08, 0x97, 0x00, 0x18, -0xB8, 0x22, 0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, 0xF7, 0x63, 0x11, 0x62, 0x44, 0x67, 0x7D, 0x67, -0x40, 0xF0, 0x48, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF7, 0x70, 0x9A, 0x09, 0xD3, 0x62, 0x67, -0xC0, 0xF7, 0x10, 0x4B, 0x61, 0x9B, 0x0A, 0xD3, 0xC0, 0xF7, 0x10, 0x4A, 0x48, 0xA2, 0x9D, 0x67, -0x20, 0xF0, 0x4C, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0xC0, 0xF7, 0x7C, 0x9A, 0x0C, 0xD3, 0x62, 0x67, -0xC0, 0xF7, 0x1C, 0x4B, 0x61, 0x9B, 0x0D, 0xD3, 0xC0, 0xF7, 0x1C, 0x4A, 0x48, 0xA2, 0xBD, 0x67, -0x20, 0xF0, 0x58, 0xC5, 0x7D, 0x67, 0x40, 0xF0, 0x48, 0xA3, 0x01, 0x6C, 0x8E, 0xEA, 0x5E, 0x2A, -0x00, 0x6A, 0xBD, 0x67, 0x52, 0xC5, 0x54, 0x10, 0x7D, 0x67, 0x52, 0xA3, 0x04, 0x03, 0x49, 0xE3, -0x20, 0xF0, 0x40, 0xA2, 0xFF, 0x6B, 0x4C, 0xEB, 0x0B, 0x5B, 0x78, 0x67, 0x01, 0x2B, 0x0A, 0x6A, -0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x50, 0xA4, 0x62, 0x42, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, -0xBD, 0x67, 0x51, 0xCD, 0x0E, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x01, 0x6A, 0x9D, 0x67, 0x56, 0xC4, -0xBD, 0x67, 0x52, 0xA5, 0x04, 0x03, 0x49, 0xE3, 0x54, 0xA2, 0x7D, 0x67, 0x57, 0xC3, 0x00, 0x6A, -0x9D, 0x67, 0x51, 0xC4, 0x1B, 0x10, 0xBD, 0x67, 0x51, 0xA5, 0x02, 0x4A, 0x9D, 0x67, 0x72, 0xA4, -0x04, 0x04, 0x6D, 0xE4, 0x74, 0xA3, 0x83, 0x67, 0xBD, 0x67, 0x71, 0xA5, 0x71, 0xE4, 0x30, 0xF0, -0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, 0xA3, 0xF1, 0x7C, 0xA3, 0x04, 0x04, 0x49, 0xE4, -0x66, 0xC2, 0x7D, 0x67, 0x51, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x51, 0xC4, 0xBD, 0x67, 0x71, 0xA5, -0x9D, 0x67, 0x50, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0xDE, 0x2A, 0x05, 0x94, 0x06, 0x95, 0x07, 0x96, -0x08, 0x97, 0x00, 0x18, 0xB8, 0x22, 0x7D, 0x67, 0x52, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x52, 0xC4, -0xBD, 0x67, 0x52, 0xA5, 0x09, 0x5A, 0x58, 0x67, 0xA7, 0x2A, 0xC7, 0x10, 0x7D, 0x67, 0x40, 0xF0, -0x48, 0xA3, 0x08, 0x6C, 0x8E, 0xEA, 0x5E, 0x2A, 0x00, 0x6A, 0xBD, 0x67, 0x52, 0xC5, 0x54, 0x10, -0x7D, 0x67, 0x52, 0xA3, 0x04, 0x03, 0x49, 0xE3, 0x20, 0xF0, 0x40, 0xA2, 0xFF, 0x6B, 0x4C, 0xEB, -0x0B, 0x5B, 0x78, 0x67, 0x01, 0x2B, 0x0A, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x50, 0xA4, -0x62, 0x42, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x51, 0xCD, 0x0E, 0x6A, 0x7D, 0x67, -0x54, 0xC3, 0x08, 0x6A, 0x9D, 0x67, 0x56, 0xC4, 0xBD, 0x67, 0x52, 0xA5, 0x04, 0x03, 0x49, 0xE3, -0x54, 0xA2, 0x7D, 0x67, 0x57, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x51, 0xC4, 0x1B, 0x10, 0xBD, 0x67, -0x51, 0xA5, 0x02, 0x4A, 0x9D, 0x67, 0x72, 0xA4, 0x04, 0x04, 0x6D, 0xE4, 0x74, 0xA3, 0x83, 0x67, -0xBD, 0x67, 0x71, 0xA5, 0x71, 0xE4, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, -0x03, 0xF2, 0x70, 0xA3, 0x04, 0x04, 0x49, 0xE4, 0x66, 0xC2, 0x7D, 0x67, 0x51, 0xA3, 0x01, 0x4A, -0x9D, 0x67, 0x51, 0xC4, 0xBD, 0x67, 0x71, 0xA5, 0x9D, 0x67, 0x50, 0xA4, 0x43, 0xEB, 0x58, 0x67, -0xDE, 0x2A, 0x05, 0x94, 0x06, 0x95, 0x07, 0x96, 0x08, 0x97, 0x00, 0x18, 0xB8, 0x22, 0x7D, 0x67, -0x52, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x52, 0xC4, 0xBD, 0x67, 0x52, 0xA5, 0x09, 0x5A, 0x58, 0x67, -0xA7, 0x2A, 0x63, 0x10, 0x7D, 0x67, 0x40, 0xF0, 0x48, 0xA3, 0x09, 0x6C, 0x8E, 0xEA, 0x5D, 0x2A, -0x00, 0x6A, 0xBD, 0x67, 0x52, 0xC5, 0x54, 0x10, 0x7D, 0x67, 0x52, 0xA3, 0x04, 0x03, 0x49, 0xE3, -0x20, 0xF0, 0x40, 0xA2, 0xFF, 0x6B, 0x4C, 0xEB, 0x0B, 0x5B, 0x78, 0x67, 0x01, 0x2B, 0x0A, 0x6A, -0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, 0x50, 0xA4, 0x62, 0x42, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, -0xBD, 0x67, 0x51, 0xCD, 0x0E, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x09, 0x6A, 0x9D, 0x67, 0x56, 0xC4, -0xBD, 0x67, 0x52, 0xA5, 0x04, 0x03, 0x49, 0xE3, 0x54, 0xA2, 0x7D, 0x67, 0x57, 0xC3, 0x00, 0x6A, -0x9D, 0x67, 0x51, 0xC4, 0x1B, 0x10, 0xBD, 0x67, 0x51, 0xA5, 0x02, 0x4A, 0x9D, 0x67, 0x72, 0xA4, -0x04, 0x04, 0x6D, 0xE4, 0x74, 0xA3, 0x83, 0x67, 0xBD, 0x67, 0x71, 0xA5, 0x71, 0xE4, 0x30, 0xF0, -0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE4, 0x63, 0xF2, 0x64, 0xA3, 0x04, 0x04, 0x49, 0xE4, -0x66, 0xC2, 0x7D, 0x67, 0x51, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x51, 0xC4, 0xBD, 0x67, 0x71, 0xA5, -0x9D, 0x67, 0x50, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0xDE, 0x2A, 0x05, 0x94, 0x06, 0x95, 0x07, 0x96, -0x08, 0x97, 0x00, 0x18, 0xB8, 0x22, 0x7D, 0x67, 0x52, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x52, 0xC4, -0xBD, 0x67, 0x52, 0xA5, 0x09, 0x5A, 0x58, 0x67, 0xA7, 0x2A, 0x11, 0x97, 0x09, 0x63, 0x00, 0xEF, -0xFB, 0x63, 0x09, 0x62, 0x0A, 0xD4, 0x0A, 0x92, 0x01, 0x4A, 0x40, 0xA2, 0x7D, 0x67, 0x59, 0xC3, -0x0A, 0x92, 0x05, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x02, 0x6A, 0x6C, 0xEA, 0x06, 0x22, 0x7D, 0x67, -0x59, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xF2, 0x24, 0x89, 0x10, 0x0A, 0x92, 0x40, 0xA2, 0x7D, 0x67, -0x5A, 0xC3, 0x0A, 0x92, 0x02, 0x4A, 0x40, 0xA2, 0x7D, 0x67, 0x58, 0xC3, 0x0A, 0x92, 0x04, 0x4A, -0x40, 0xA2, 0x50, 0x32, 0x40, 0x33, 0x60, 0x33, 0x63, 0x33, 0x63, 0x33, 0x0A, 0x92, 0x03, 0x4A, -0x40, 0xA2, 0x6D, 0xEA, 0x40, 0x32, 0x40, 0x32, 0x43, 0x32, 0x43, 0x32, 0x7D, 0x67, 0x4B, 0xCB, -0x7D, 0x67, 0x59, 0xA3, 0x01, 0x6B, 0x6E, 0xEA, 0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF6, -0x00, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x50, 0x24, 0x5D, 0x67, 0x98, 0xA2, 0x5D, 0x67, 0x6B, 0xAA, -0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0xA3, 0xF1, -0x7C, 0xC2, 0x54, 0x10, 0x7D, 0x67, 0x59, 0xA3, 0x08, 0x6B, 0x6E, 0xEA, 0x15, 0x2A, 0x30, 0xF0, -0x20, 0x6A, 0xE0, 0xF6, 0x0C, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x50, 0x24, 0x5D, 0x67, 0x98, 0xA2, -0x5D, 0x67, 0x6B, 0xAA, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x49, 0xE4, 0x03, 0xF2, 0x70, 0xC2, 0x3A, 0x10, 0x7D, 0x67, 0x59, 0xA3, 0x09, 0x6B, 0x6E, 0xEA, -0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF7, 0x0C, 0x4A, 0x82, 0x67, 0x00, 0x18, 0x50, 0x24, -0x5D, 0x67, 0x98, 0xA2, 0x5D, 0x67, 0x6B, 0xAA, 0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x63, 0xF2, 0x64, 0xC2, 0x20, 0x10, 0x7D, 0x67, 0x59, 0xA3, -0x0A, 0x6B, 0x6E, 0xEA, 0x1B, 0x2A, 0x07, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, 0x54, 0xC3, 0x28, 0xF3, -0x01, 0x6A, 0x7D, 0x67, 0x4B, 0xCB, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF7, 0x50, 0x9A, 0x04, 0xD2, -0x5D, 0x67, 0xB4, 0xA2, 0x5D, 0x67, 0x6B, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0x82, 0x67, 0x00, 0xF7, -0x1C, 0x4C, 0x04, 0x92, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x09, 0x97, 0x05, 0x63, -0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x40, 0xA2, 0x7D, 0x67, -0x55, 0xC3, 0x7D, 0x67, 0x55, 0xA3, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, -0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x04, 0x92, 0x5A, 0xA2, 0x7D, 0x67, 0x54, 0xC3, -0x08, 0x92, 0x02, 0x4A, 0x60, 0xA2, 0x04, 0x92, 0x7A, 0xC2, 0x08, 0x92, 0x03, 0x4A, 0x40, 0xA2, -0x62, 0x67, 0x20, 0x6A, 0x6C, 0xEA, 0x57, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, -0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x04, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0x74, 0x33, -0xBD, 0xA2, 0x21, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x7D, 0xC2, 0x08, 0x92, 0x03, 0x4A, -0x40, 0xA2, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x4C, 0xEB, 0x01, 0x6A, 0x6C, 0xEA, -0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x04, 0x92, 0x01, 0x6B, -0x8C, 0xEB, 0xBD, 0xA2, 0x02, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x7D, 0xC2, 0x08, 0x92, -0x03, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x02, 0x6A, 0x6C, 0xEA, 0x47, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, -0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x04, 0x92, 0x01, 0x6B, -0x8C, 0xEB, 0x64, 0x33, 0xBD, 0xA2, 0x03, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x7D, 0xC2, -0x08, 0x92, 0x03, 0x4A, 0x40, 0xA2, 0x62, 0x67, 0x40, 0x6A, 0x6C, 0xEA, 0x5B, 0x33, 0xFF, 0x6A, -0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x04, 0x92, -0x01, 0x6B, 0x8C, 0xEB, 0x78, 0x33, 0xBD, 0xA2, 0x41, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, -0x7D, 0xC2, 0x04, 0x92, 0x5D, 0xA2, 0x20, 0x6B, 0x6C, 0xEA, 0x16, 0x22, 0x7D, 0x67, 0x55, 0xA3, -0x82, 0x67, 0x00, 0x18, 0x3E, 0x3B, 0x5D, 0x67, 0x95, 0xA2, 0x04, 0x92, 0x5A, 0xA2, 0x62, 0x67, -0x04, 0x92, 0x4E, 0xA2, 0x4A, 0x32, 0xA2, 0x67, 0x03, 0x6A, 0x4C, 0xED, 0xFF, 0x6A, 0xAC, 0xEA, -0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xDE, 0x2F, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, -0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x40, 0xA2, 0x7D, 0x67, 0x50, 0xC3, 0x08, 0x92, -0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x7B, 0xC2, 0x08, 0x92, -0x01, 0x4A, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x7C, 0xC2, -0x7D, 0x67, 0x50, 0xA3, 0x03, 0x6B, 0x6E, 0xEA, 0x38, 0x2A, 0x08, 0x92, 0x02, 0x4A, 0x60, 0xA2, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x78, 0xC2, 0x08, 0x92, 0x03, 0x4A, -0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x79, 0xC2, 0x08, 0x92, -0x04, 0x4A, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x7A, 0xC2, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x58, 0xA2, 0xA2, 0x67, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x59, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x5A, 0xA2, 0x30, 0xF0, 0x20, 0x6C, 0x40, 0xF7, 0x08, 0x4C, -0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x34, 0x10, 0x7D, 0x67, 0x50, 0xA3, 0x02, 0x6B, -0x6E, 0xEA, 0x2F, 0x2A, 0x08, 0x92, 0x02, 0x4A, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0xA3, 0xF2, 0x78, 0xC2, 0x08, 0x92, 0x03, 0x4A, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x79, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x01, 0x6B, 0x6B, 0xEB, 0xA3, 0xF2, 0x7A, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xA3, 0xF2, 0x58, 0xA2, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, -0x59, 0xA2, 0x30, 0xF0, 0x20, 0x6C, 0x60, 0xF7, 0x18, 0x4C, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, -0xB6, 0x23, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x01, 0x6B, 0xA3, 0xF2, 0x7E, 0xC2, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xA3, 0xF2, 0x7D, 0xC2, 0x07, 0x97, -0x04, 0x63, 0x00, 0xEF, 0xFC, 0x63, 0x07, 0x62, 0x08, 0xD4, 0x08, 0x92, 0x40, 0xA2, 0x7D, 0x67, -0x52, 0xC3, 0x08, 0x92, 0x01, 0x4A, 0x40, 0xA2, 0x9D, 0x67, 0x51, 0xC4, 0x08, 0x92, 0x02, 0x4A, -0x40, 0xA2, 0x7D, 0x67, 0x50, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x01, 0x6B, -0xC3, 0xF2, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x9D, 0x67, 0x72, 0xA4, -0xC3, 0xF2, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x9D, 0x67, 0x71, 0xA4, -0xC3, 0xF2, 0x61, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x9D, 0x67, 0x70, 0xA4, -0xC3, 0xF2, 0x62, 0xC2, 0x7D, 0x67, 0x51, 0xA3, 0x02, 0x22, 0x00, 0x18, 0xCB, 0x2B, 0x30, 0xF0, -0x20, 0x6A, 0x80, 0xF7, 0x1C, 0x4A, 0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x07, 0x97, 0x04, 0x63, -0x00, 0xEF, 0x00, 0x65, 0xFA, 0x63, 0x0B, 0x62, 0x0C, 0xD4, 0x0C, 0x92, 0x40, 0xA2, 0x7D, 0x67, -0x53, 0xC3, 0x0C, 0x92, 0x01, 0x4A, 0x40, 0xA2, 0x7D, 0x67, 0x52, 0xC3, 0x0C, 0x92, 0x02, 0x4A, -0x40, 0xA2, 0x7D, 0x67, 0x51, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x0B, 0x10, 0x7D, 0x67, -0x50, 0xA3, 0x04, 0x03, 0x49, 0xE3, 0x00, 0x6B, 0x66, 0xC2, 0x7D, 0x67, 0x50, 0xA3, 0x01, 0x4A, -0x7D, 0x67, 0x50, 0xC3, 0x7D, 0x67, 0x50, 0xA3, 0x0C, 0x5A, 0x58, 0x67, 0xF0, 0x2A, 0x5D, 0x67, -0x71, 0xA2, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x48, 0x22, 0x7D, 0x67, 0x53, 0xA3, -0x81, 0x5A, 0x58, 0x67, 0x43, 0x2A, 0x7D, 0x67, 0x52, 0xA3, 0x81, 0x5A, 0x58, 0x67, 0x3E, 0x2A, -0x01, 0x6A, 0x7D, 0x67, 0x56, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA5, 0xF4, -0x70, 0x9A, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x57, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0xA5, 0xF4, 0x50, 0x9A, 0x42, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x58, 0xC3, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA5, 0xF4, 0x50, 0x9A, 0x42, 0x33, 0x62, 0x33, -0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x59, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xA5, 0xF4, 0x50, 0x9A, 0x00, 0xF6, 0x42, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5A, 0xC3, -0x0D, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x05, 0x6A, 0x7D, 0x67, 0x51, 0xCB, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, 0xA5, 0xF4, 0x70, 0xDA, 0xDF, 0x11, 0x5D, 0x67, 0x71, 0xA2, -0x02, 0x6A, 0x6C, 0xEA, 0xC0, 0xF0, 0x16, 0x22, 0x02, 0x6A, 0x7D, 0x67, 0x56, 0xC3, 0x7D, 0x67, -0x53, 0xA3, 0x81, 0x5A, 0x58, 0x67, 0x5D, 0x22, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, -0xC2, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x62, 0xAA, 0xFF, 0x6A, -0x6C, 0xEA, 0x7D, 0x67, 0x57, 0xC3, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF6, -0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x42, 0xAA, 0x42, 0x33, 0xFF, 0xF7, -0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x58, 0xC3, 0x5D, 0x67, 0x73, 0xA2, -0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, -0x62, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x59, 0xC3, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, -0x20, 0x6A, 0x42, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x42, 0xAA, -0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5A, 0xC3, -0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, -0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, -0x42, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, -0x04, 0x10, 0x16, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, 0x57, 0xC3, 0x7D, 0x67, 0x52, 0xA3, 0x81, 0x5A, -0x58, 0x67, 0x5D, 0x22, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF6, 0x18, 0x4B, -0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x62, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, -0x5B, 0xC3, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF6, 0x18, 0x4B, 0x64, 0x33, -0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x42, 0xAA, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, -0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5C, 0xC3, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, -0x42, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x62, 0xAA, 0xFF, 0x6A, -0x6C, 0xEA, 0x7D, 0x67, 0x5D, 0xC3, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF6, -0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x42, 0xAA, 0x42, 0x33, 0xFF, 0xF7, -0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5E, 0xC3, 0x5D, 0x67, 0x72, 0xA2, -0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, -0x00, 0x6B, 0x62, 0xCA, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF6, 0x18, 0x4B, -0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, 0x04, 0x10, 0x16, 0x6A, -0x4B, 0xEA, 0x7D, 0x67, 0x5B, 0xC3, 0x0D, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x09, 0x6A, 0x7D, 0x67, -0x51, 0xCB, 0x03, 0x11, 0x7D, 0x67, 0x51, 0xA3, 0xE0, 0xF0, 0x19, 0x2A, 0x7D, 0x67, 0x53, 0xA3, -0x81, 0x5A, 0x58, 0x67, 0x6F, 0x22, 0x7D, 0x67, 0x53, 0xA3, 0x7D, 0x67, 0x56, 0xC3, 0x5D, 0x67, -0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, -0x49, 0xE3, 0x60, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x57, 0xC3, 0x5D, 0x67, 0x73, 0xA2, -0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, -0x40, 0xAA, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, -0x58, 0xC3, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF5, 0x18, 0x4B, 0x64, 0x33, -0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x59, 0xC3, -0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, -0x18, 0x4A, 0x49, 0xE3, 0x40, 0xAA, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, -0x6C, 0xEA, 0x7D, 0x67, 0x5A, 0xC3, 0x7D, 0x67, 0x53, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, -0x20, 0x6A, 0xE0, 0xF7, 0x54, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, -0x5B, 0xC3, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF5, 0x18, 0x4B, 0x64, 0x33, -0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, 0x5D, 0x67, 0x73, 0xA2, 0x30, 0xF0, -0x20, 0x6A, 0xC2, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, -0x60, 0xCA, 0x04, 0x10, 0x7D, 0x67, 0x53, 0xA3, 0x7D, 0x67, 0x56, 0xC3, 0x7D, 0x67, 0x52, 0xA3, -0x81, 0x5A, 0x58, 0x67, 0x71, 0x22, 0x7D, 0x67, 0x52, 0xA3, 0x7D, 0x67, 0x5C, 0xC3, 0x5D, 0x67, -0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, -0x49, 0xE3, 0x60, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5D, 0xC3, 0x5D, 0x67, 0x72, 0xA2, -0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, -0x40, 0xAA, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, -0x5E, 0xC3, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF5, 0x18, 0x4B, 0x64, 0x33, -0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5F, 0xC3, -0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, -0x18, 0x4A, 0x49, 0xE3, 0x40, 0xAA, 0x42, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, -0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x7D, 0x67, 0x52, 0xA3, 0x54, 0x32, 0x62, 0x67, -0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF7, 0x54, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, -0x7D, 0x67, 0x20, 0xF0, 0x41, 0xC3, 0x5D, 0x67, 0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF5, -0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, 0x5D, 0x67, -0x72, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, -0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, 0x04, 0x10, 0x7D, 0x67, 0x52, 0xA3, 0x7D, 0x67, 0x5C, 0xC3, -0x04, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x0C, 0x6A, 0x7D, 0x67, 0x51, 0xCB, 0x06, 0x10, 0x04, 0x6A, -0x7D, 0x67, 0x54, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x51, 0xCB, 0x05, 0x02, 0x82, 0x67, 0x00, 0x18, -0x54, 0x15, 0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x07, 0xD5, -0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0xC0, 0x4A, 0x0A, 0x5A, 0x78, 0x67, 0x2F, 0x23, -0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0xA0, 0xF7, 0x08, 0x4A, 0x49, 0xE3, 0x40, 0x9A, 0x00, 0xEA, -0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0xCC, 0x23, 0x22, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, -0xED, 0x25, 0x1D, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0x38, 0x24, 0x18, 0x10, 0x07, 0x92, -0x82, 0x67, 0x00, 0x18, 0x9C, 0x25, 0x13, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0x3C, 0x26, -0x0E, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0x89, 0x26, 0x09, 0x10, 0x07, 0x92, 0x82, 0x67, -0x00, 0x18, 0xA9, 0x26, 0x04, 0x10, 0x07, 0x92, 0x82, 0x67, 0x00, 0x18, 0xAC, 0x1F, 0x05, 0x97, -0x03, 0x63, 0x00, 0xEF, 0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, 0x40, 0xA4, 0x20, 0x5A, -0x58, 0x67, 0x08, 0x22, 0x7D, 0x67, 0x40, 0xA3, 0xE0, 0x4A, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, -0x44, 0x67, 0x01, 0x10, 0x00, 0x6A, 0x20, 0xE8, 0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, -0x40, 0xA4, 0x40, 0x5A, 0x58, 0x67, 0x0D, 0x22, 0x7D, 0x67, 0x40, 0xA3, 0x20, 0x5A, 0x58, 0x67, -0x08, 0x2A, 0x7D, 0x67, 0x40, 0xA3, 0xE0, 0x4A, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, -0x01, 0x10, 0x00, 0x6A, 0x20, 0xE8, 0x00, 0x65, 0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, -0x40, 0xA4, 0x60, 0x5A, 0x58, 0x67, 0x0D, 0x22, 0x7D, 0x67, 0x40, 0xA3, 0x40, 0x5A, 0x58, 0x67, -0x08, 0x2A, 0x7D, 0x67, 0x40, 0xA3, 0xE0, 0x4A, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, -0x01, 0x10, 0x00, 0x6A, 0x20, 0xE8, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, -0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xF5, 0x27, 0x62, 0x67, 0xFF, 0x6A, -0x6C, 0xEA, 0x0F, 0x6B, 0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0xFD, 0x63, 0x05, 0x62, -0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xF5, 0x27, -0x62, 0x67, 0xFF, 0x6A, 0x6C, 0xEA, 0xF0, 0x6B, 0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, -0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, -0x00, 0x18, 0xF5, 0x27, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x40, 0x9A, 0x6C, 0xEA, -0x0C, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xFE, 0x27, 0x62, 0x67, 0x30, 0xF0, -0x20, 0x6A, 0xA1, 0xF3, 0x44, 0x9A, 0x6C, 0xEA, 0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, -0xFF, 0x6B, 0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, -0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xF5, 0x27, -0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x48, 0x9A, 0x6C, 0xEA, 0x0C, 0x2A, 0x7D, 0x67, -0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xFE, 0x27, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, -0x4C, 0x9A, 0x6C, 0xEA, 0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, -0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, -0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xF5, 0x27, 0x62, 0x67, 0x30, 0xF0, -0x20, 0x6A, 0xA1, 0xF3, 0x50, 0x9A, 0x6C, 0xEA, 0x13, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, -0x00, 0x18, 0xFE, 0x27, 0x62, 0x67, 0x0F, 0x6A, 0x6C, 0xEA, 0x0A, 0x2A, 0x7D, 0x67, 0x58, 0xA3, -0x82, 0x67, 0x00, 0x18, 0x0A, 0x28, 0x62, 0x67, 0xE0, 0xF3, 0x1F, 0x6A, 0x6C, 0xEA, 0x02, 0x22, -0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, -0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, -0x00, 0x18, 0xFE, 0x27, 0x62, 0x67, 0xE1, 0xF7, 0x10, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x7D, 0x67, -0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x0A, 0x28, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, -0x54, 0x9A, 0x6C, 0xEA, 0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, -0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, -0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xF5, 0x27, 0x62, 0x67, 0x30, 0xF0, -0x20, 0x6A, 0xA1, 0xF3, 0x58, 0x9A, 0x6C, 0xEA, 0x16, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, -0x00, 0x18, 0xFE, 0x27, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF3, 0x5C, 0x9A, 0x6C, 0xEA, -0x0A, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x0A, 0x28, 0x62, 0x67, 0x0C, 0xF0, -0x18, 0x6A, 0x6C, 0xEA, 0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, -0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, 0x44, 0x67, 0x7D, 0x67, -0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xF5, 0x27, 0x62, 0x67, 0x30, 0xF0, -0x20, 0x6A, 0xC1, 0xF3, 0x40, 0x9A, 0x6C, 0xEA, 0x18, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, -0x00, 0x18, 0xFE, 0x27, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x44, 0x9A, 0x6C, 0xEA, -0x0C, 0x2A, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x0A, 0x28, 0x62, 0x67, 0x30, 0xF0, -0x20, 0x6A, 0xC1, 0xF3, 0x48, 0x9A, 0x6C, 0xEA, 0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, -0xFF, 0x6B, 0x6C, 0xEA, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x05, 0x62, -0x44, 0x67, 0x7D, 0x67, 0x58, 0xC3, 0x7D, 0x67, 0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0xFE, 0x27, -0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x4C, 0x9A, 0x6C, 0xEA, 0x0C, 0x2A, 0x7D, 0x67, -0x58, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x0A, 0x28, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, -0x50, 0x9A, 0x6C, 0xEA, 0x02, 0x22, 0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0xFF, 0x6B, 0x6C, 0xEA, -0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFD, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0xE5, 0xF7, -0x00, 0x4A, 0x00, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x54, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, -0x4C, 0xEB, 0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x56, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, -0x54, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x9D, 0x67, -0x54, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, -0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x57, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, -0x58, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x7F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x55, 0xC4, -0x7D, 0x67, 0x54, 0xA3, 0xE0, 0xF5, 0x07, 0x22, 0x80, 0xF4, 0x0C, 0x6A, 0x9D, 0x67, 0x49, 0xCC, -0x80, 0xF4, 0x10, 0x6A, 0x7D, 0x67, 0x48, 0xCB, 0x80, 0xF4, 0x14, 0x6A, 0x9D, 0x67, 0x47, 0xCC, -0x80, 0xF4, 0x18, 0x6A, 0x7D, 0x67, 0x46, 0xCB, 0x9D, 0x67, 0x57, 0xA4, 0x10, 0x22, 0x80, 0xF4, -0x1C, 0x6A, 0x7D, 0x67, 0x49, 0xCB, 0xA0, 0xF4, 0x00, 0x6A, 0x9D, 0x67, 0x48, 0xCC, 0xA0, 0xF4, -0x04, 0x6A, 0x7D, 0x67, 0x47, 0xCB, 0xA0, 0xF4, 0x08, 0x6A, 0x9D, 0x67, 0x46, 0xCC, 0x7D, 0x67, -0x56, 0xA3, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, -0x49, 0xE3, 0x02, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x46, 0xF2, 0x08, 0x4A, 0x01, 0xD2, 0x9D, 0x67, -0x55, 0xA4, 0x01, 0x6B, 0x4E, 0xEB, 0xA0, 0xF3, 0x0E, 0x23, 0x02, 0x52, 0x78, 0x67, 0x03, 0x23, -0x0C, 0x22, 0xA0, 0xF5, 0x09, 0x10, 0x02, 0x6B, 0x4E, 0xEB, 0xC0, 0xF1, 0x01, 0x23, 0x03, 0x6B, -0x6E, 0xEA, 0x80, 0xF4, 0x03, 0x22, 0x80, 0xF5, 0x1F, 0x10, 0x9D, 0x67, 0x69, 0xAC, 0x1F, 0xF7, -0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x69, 0xAC, -0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, -0xC1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x7A, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x9D, 0x67, -0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x7A, 0xA3, -0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, -0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, -0x6C, 0xEA, 0x0F, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, -0x49, 0xE3, 0x02, 0x93, 0x8E, 0xA3, 0x03, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, -0x0E, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x48, 0x9A, 0x49, 0xE3, -0x02, 0x93, 0x8E, 0xA3, 0x03, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x7D, 0x67, -0x49, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, -0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0E, 0x2A, -0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x02, 0x93, -0x6E, 0xA3, 0x7E, 0x34, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x0D, 0x10, 0x5D, 0x67, 0x69, 0xAA, -0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x50, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6E, 0xA3, 0x7E, 0x34, -0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, -0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x63, 0x42, -0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x11, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, -0xE1, 0xF3, 0x54, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6E, 0xA3, 0x72, 0x33, 0x83, 0x67, 0x03, 0x6B, -0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x10, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, -0x20, 0x6A, 0xE1, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6E, 0xA3, 0x72, 0x33, 0x83, 0x67, -0x03, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, -0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x68, 0xAC, -0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, -0xC1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x60, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x9D, 0x67, -0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x60, 0xA3, -0x60, 0xC2, 0x7D, 0x67, 0x48, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, -0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x48, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, -0x6C, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, -0x49, 0xE3, 0x02, 0x93, 0x61, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, -0x20, 0x6A, 0xE1, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x61, 0xA3, 0x60, 0xC2, 0x7D, 0x67, -0x48, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, -0x07, 0x22, 0x7D, 0x67, 0x48, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x11, 0x2A, -0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x02, 0x93, -0x6F, 0xA3, 0x6A, 0x33, 0x83, 0x67, 0x01, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, -0x10, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x50, 0x9A, 0x49, 0xE3, -0x02, 0x93, 0x6F, 0xA3, 0x6A, 0x33, 0x83, 0x67, 0x01, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, -0x60, 0xC2, 0x7D, 0x67, 0x48, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, -0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x48, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, -0x6C, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x54, 0x9A, -0x49, 0xE3, 0x02, 0x93, 0x64, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, -0x20, 0x6A, 0xE1, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x64, 0xA3, 0x60, 0xC2, 0x9D, 0x67, -0x67, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, -0x9D, 0x67, 0x67, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x13, 0x2A, 0x5D, 0x67, 0x67, 0xAA, -0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x6C, 0x33, -0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF3, 0x7C, 0x9B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, -0x12, 0x10, 0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, -0x9D, 0x67, 0x76, 0xA4, 0x6C, 0x33, 0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF3, 0x7C, 0x9B, -0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x5D, 0x67, 0x66, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, -0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x66, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, -0x6C, 0xEA, 0x13, 0x2A, 0x5D, 0x67, 0x66, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, -0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x6C, 0x33, 0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, 0x01, 0xF4, -0x60, 0x9B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0xF7, 0x13, 0x5D, 0x67, 0x66, 0xAA, 0x30, 0xF0, -0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x6C, 0x33, 0x83, 0x67, -0x30, 0xF0, 0x20, 0x6B, 0x01, 0xF4, 0x60, 0x9B, 0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0xE4, 0x13, -0x5D, 0x67, 0x69, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, -0x06, 0x22, 0x9D, 0x67, 0x69, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x11, 0x2A, 0x5D, 0x67, -0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6E, 0xA3, -0x6A, 0x33, 0x83, 0x67, 0x03, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x10, 0x10, -0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x02, 0x93, -0x6E, 0xA3, 0x6A, 0x33, 0x83, 0x67, 0x03, 0x6B, 0x6C, 0xEC, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, -0x7D, 0x67, 0x49, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, -0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, -0x0B, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, 0x49, 0xE3, -0x02, 0x93, 0x63, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, -0xE1, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x63, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, -0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, -0x7D, 0x67, 0x49, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, -0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x65, 0xA3, -0x60, 0xC2, 0x0A, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x50, 0x9A, -0x49, 0xE3, 0x02, 0x93, 0x65, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x63, 0x42, 0x1F, 0xF7, -0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, -0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, -0x20, 0x6A, 0xE1, 0xF3, 0x54, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x66, 0xA3, 0x60, 0xC2, 0x0A, 0x10, -0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x02, 0x93, -0x66, 0xA3, 0x60, 0xC2, 0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, -0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, -0x0B, 0x2A, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, -0x02, 0x93, 0x76, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, -0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x76, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x48, 0xAB, -0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, -0x7D, 0x67, 0x48, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x9D, 0x67, -0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, -0x60, 0xA3, 0x60, 0xC2, 0x0B, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, -0x48, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, 0x60, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x48, 0xAB, -0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, -0x7D, 0x67, 0x48, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x9D, 0x67, -0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, -0x61, 0xA3, 0x60, 0xC2, 0x0B, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, -0x50, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, 0x61, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x48, 0xAB, -0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, -0x7D, 0x67, 0x48, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x9D, 0x67, -0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x54, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, -0x62, 0xA3, 0x60, 0xC2, 0x0B, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, -0x58, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, 0x62, 0xA3, 0x60, 0xC2, 0x9D, 0x67, 0x67, 0xAC, -0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, -0x67, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, -0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, 0x63, 0xA3, 0x60, 0xC2, -0x0B, 0x10, 0x9D, 0x67, 0x67, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, -0x02, 0x93, 0x20, 0xF0, 0x63, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x47, 0xAB, 0x61, 0x42, 0x1F, 0xF7, -0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x47, 0xAB, -0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0C, 0x2A, 0x9D, 0x67, 0x67, 0xAC, 0x30, 0xF0, -0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x20, 0xF0, 0x64, 0xA3, 0x60, 0xC2, -0x0B, 0x10, 0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x48, 0x9A, 0x49, 0xE3, -0x02, 0x93, 0x20, 0xF0, 0x64, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x47, 0xAB, 0x62, 0x42, 0x1F, 0xF7, -0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x47, 0xAB, -0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0D, 0x2A, 0x9D, 0x67, 0x67, 0xAC, 0x30, 0xF0, -0x20, 0x6A, 0xE1, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x30, 0xF0, 0x20, 0x6B, 0x40, 0xF0, 0x68, 0xA3, -0x60, 0xC2, 0x0C, 0x10, 0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x50, 0x9A, -0x49, 0xE3, 0x30, 0xF0, 0x20, 0x6B, 0x40, 0xF0, 0x68, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x47, 0xAB, -0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, -0x7D, 0x67, 0x47, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0E, 0x2A, 0x9D, 0x67, -0x67, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x54, 0x9A, 0x49, 0xE3, 0x30, 0xF0, 0x20, 0x6B, -0x40, 0xF0, 0x08, 0x4B, 0x61, 0xA3, 0x60, 0xC2, 0x0F, 0x12, 0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, -0x20, 0x6A, 0xE1, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x30, 0xF0, 0x20, 0x6B, 0x40, 0xF0, 0x08, 0x4B, -0x61, 0xA3, 0x60, 0xC2, 0x01, 0x12, 0x9D, 0x67, 0x69, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, -0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x69, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, -0x6C, 0xEA, 0x15, 0x2A, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, -0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x74, 0x33, 0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, 0x01, 0xF4, -0x64, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x14, 0x10, 0x5D, 0x67, -0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, -0x74, 0x33, 0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, 0x01, 0xF4, 0x64, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, -0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, -0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x61, 0x42, -0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x15, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, -0xE1, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x74, 0x33, 0x83, 0x67, 0x30, 0xF0, -0x20, 0x6B, 0x01, 0xF4, 0x68, 0x9B, 0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, -0x14, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x48, 0x9A, 0x49, 0xE3, -0x9D, 0x67, 0x76, 0xA4, 0x74, 0x33, 0x83, 0x67, 0x30, 0xF0, 0x20, 0x6B, 0x01, 0xF4, 0x68, 0x9B, -0x6D, 0xE4, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x62, 0x42, -0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, -0x49, 0xAB, 0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, 0x69, 0xAC, -0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x73, 0xA3, 0x60, 0xC2, -0x0A, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x50, 0x9A, 0x49, 0xE3, -0x02, 0x93, 0x73, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x49, 0xAB, 0x63, 0x42, 0x1F, 0xF7, 0x00, 0x6A, -0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x49, 0xAB, 0x63, 0x42, -0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, 0x69, 0xAC, 0x30, 0xF0, 0x20, 0x6A, -0xE1, 0xF3, 0x54, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6A, 0xA3, 0x60, 0xC2, 0x0A, 0x10, 0x5D, 0x67, -0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x58, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6A, 0xA3, -0x60, 0xC2, 0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, -0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0B, 0x2A, -0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x02, 0x93, -0x6C, 0xAB, 0x60, 0xDA, 0x29, 0x11, 0x9D, 0x67, 0x68, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, -0x40, 0x9A, 0x49, 0xE3, 0x02, 0x93, 0x6C, 0xAB, 0x60, 0xDA, 0x1E, 0x11, 0x5D, 0x67, 0x69, 0xAA, -0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, -0x69, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0F, 0x2A, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, -0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, 0x68, 0x33, -0x6D, 0xE4, 0x60, 0x9B, 0x60, 0xDA, 0x0E, 0x10, 0x5D, 0x67, 0x69, 0xAA, 0x30, 0xF0, 0x20, 0x6A, -0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, 0x68, 0x33, 0x6D, 0xE4, -0x60, 0x9B, 0x60, 0xDA, 0x5D, 0x67, 0x68, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, -0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x68, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, -0x13, 0x2A, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, -0x62, 0x67, 0x9D, 0x67, 0x56, 0xA4, 0x01, 0x94, 0x48, 0x32, 0x48, 0x35, 0xA9, 0xE2, 0x49, 0xE4, -0x80, 0xF2, 0x40, 0x9A, 0x40, 0xDB, 0x12, 0x10, 0x5D, 0x67, 0x68, 0xAA, 0x30, 0xF0, 0x20, 0x6A, -0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0x9D, 0x67, 0x56, 0xA4, 0x01, 0x94, 0x48, 0x32, -0x48, 0x35, 0xA9, 0xE2, 0x49, 0xE4, 0x80, 0xF2, 0x40, 0x9A, 0x40, 0xDB, 0x5D, 0x67, 0x67, 0xAA, -0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, -0x67, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x13, 0x2A, 0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, -0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x62, 0x67, 0x9D, 0x67, 0x56, 0xA4, 0x01, 0x94, -0x48, 0x32, 0x48, 0x35, 0xA9, 0xE2, 0x49, 0xE4, 0x80, 0xF2, 0x44, 0x9A, 0x40, 0xDB, 0x12, 0x10, -0x5D, 0x67, 0x67, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x62, 0x67, -0x9D, 0x67, 0x56, 0xA4, 0x01, 0x94, 0x48, 0x32, 0x48, 0x35, 0xA9, 0xE2, 0x49, 0xE4, 0x80, 0xF2, -0x44, 0x9A, 0x40, 0xDB, 0x5D, 0x67, 0x66, 0xAA, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, -0x00, 0x6B, 0x6E, 0xEA, 0x06, 0x22, 0x9D, 0x67, 0x66, 0xAC, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, -0x0F, 0x2A, 0x5D, 0x67, 0x66, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, -0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, 0x6D, 0xE4, 0x00, 0xF2, 0x60, 0xA3, 0x60, 0xC2, 0x0E, 0x10, -0x5D, 0x67, 0x66, 0xAA, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x40, 0x9A, 0x49, 0xE3, 0x9D, 0x67, -0x76, 0xA4, 0x01, 0x94, 0x6D, 0xE4, 0x00, 0xF2, 0x60, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x46, 0xAB, -0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, -0x7D, 0x67, 0x46, 0xAB, 0x61, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0F, 0x2A, 0x9D, 0x67, -0x66, 0xAC, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x44, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, -0x01, 0x94, 0x6D, 0xE4, 0x01, 0xF5, 0x60, 0xA3, 0x60, 0xC2, 0x0E, 0x10, 0x5D, 0x67, 0x66, 0xAA, -0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x48, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, -0x6D, 0xE4, 0x01, 0xF5, 0x60, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x46, 0xAB, 0x62, 0x42, 0x1F, 0xF7, -0x00, 0x6A, 0x6C, 0xEA, 0x02, 0xF0, 0x00, 0x6C, 0x8E, 0xEA, 0x07, 0x22, 0x7D, 0x67, 0x46, 0xAB, -0x62, 0x42, 0x1F, 0xF7, 0x00, 0x6A, 0x6C, 0xEA, 0x0F, 0x2A, 0x9D, 0x67, 0x66, 0xAC, 0x30, 0xF0, -0x20, 0x6A, 0xE1, 0xF3, 0x4C, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, 0x6D, 0xE4, -0x81, 0xF4, 0x60, 0xA3, 0x60, 0xC2, 0x10, 0x10, 0x5D, 0x67, 0x66, 0xAA, 0x30, 0xF0, 0x20, 0x6A, -0xE1, 0xF3, 0x50, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x76, 0xA4, 0x01, 0x94, 0x6D, 0xE4, 0x81, 0xF4, -0x60, 0xA3, 0x60, 0xC2, 0x01, 0x10, 0x00, 0x65, 0x03, 0x63, 0x20, 0xE8, 0xFA, 0x63, 0x0B, 0x62, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC3, 0xF2, 0x42, 0xA2, 0x7D, 0x67, 0x54, 0xC3, -0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, -0x00, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xC3, 0xF2, -0x41, 0xA2, 0x02, 0x6B, 0x4E, 0xEB, 0x6B, 0x23, 0x03, 0x52, 0x78, 0x67, 0x04, 0x23, 0x01, 0x6B, -0x6E, 0xEA, 0x0A, 0x22, 0x77, 0x11, 0x03, 0x6B, 0x4E, 0xEB, 0xE0, 0xF0, 0x12, 0x23, 0x04, 0x6B, -0x6E, 0xEA, 0x40, 0xF1, 0x13, 0x22, 0x6E, 0x11, 0x0C, 0x6A, 0x7D, 0x67, 0x53, 0xCB, 0x0E, 0x6A, -0x7D, 0x67, 0x58, 0xC3, 0x0C, 0x6A, 0x7D, 0x67, 0x5A, 0xC3, 0x04, 0x92, 0x5A, 0xA2, 0x7D, 0x67, -0x5B, 0xC3, 0x04, 0x92, 0x43, 0xA2, 0x7D, 0x67, 0x5C, 0xC3, 0x04, 0x92, 0x4E, 0xA2, 0x4A, 0x32, -0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5D, 0xC3, 0x04, 0x92, -0x6E, 0xA2, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5E, 0xC3, 0x04, 0x92, -0x45, 0xA2, 0x7D, 0x67, 0x5F, 0xC3, 0x04, 0x92, 0x46, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, -0x04, 0x92, 0x4E, 0xA2, 0x5E, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x41, 0xC3, -0x04, 0x92, 0x4E, 0xA2, 0x52, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, -0x7D, 0x67, 0x20, 0xF0, 0x42, 0xC3, 0x04, 0x92, 0x4F, 0xA2, 0x4A, 0x32, 0x62, 0x67, 0x01, 0x6A, -0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x43, 0xC3, 0x04, 0x92, 0x53, 0xA2, -0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, 0x04, 0x92, 0x4A, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0x45, 0xC3, -0x06, 0x94, 0x07, 0x95, 0x08, 0x96, 0x09, 0x97, 0x00, 0x18, 0xB8, 0x22, 0x13, 0x11, 0x0C, 0x6A, -0x7D, 0x67, 0x53, 0xCB, 0x0E, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x0D, 0x6A, 0x7D, 0x67, 0x5A, 0xC3, -0x04, 0x92, 0x44, 0xA2, 0x7D, 0x67, 0x5B, 0xC3, 0x04, 0x92, 0x40, 0xA2, 0x7D, 0x67, 0x5C, 0xC3, -0x04, 0x92, 0x41, 0xA2, 0x7D, 0x67, 0x5D, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, -0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, -0x7D, 0x67, 0x5E, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, -0x01, 0xF4, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5F, 0xC3, -0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x50, 0x9A, -0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x7D, 0x67, -0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x54, 0x9A, 0x49, 0xE3, -0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x41, 0xC3, 0x7D, 0x67, 0x54, 0xA3, -0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x40, 0x9A, 0x49, 0xE3, 0x60, 0xA2, -0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, -0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, -0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x43, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, -0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, -0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, 0x7D, 0x67, 0x54, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, -0x20, 0x6A, 0x21, 0xF4, 0x40, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, -0x20, 0xF0, 0x45, 0xC3, 0x06, 0x94, 0x07, 0x95, 0x08, 0x96, 0x09, 0x97, 0x00, 0x18, 0xB8, 0x22, -0x81, 0x10, 0x0C, 0x6A, 0x7D, 0x67, 0x53, 0xCB, 0x0E, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x0E, 0x6A, -0x7D, 0x67, 0x5A, 0xC3, 0x04, 0x92, 0x56, 0xA2, 0x7D, 0x67, 0x5B, 0xC3, 0x04, 0x92, 0x20, 0xF0, -0x40, 0xA2, 0x7D, 0x67, 0x5C, 0xC3, 0x04, 0x92, 0x20, 0xF0, 0x41, 0xA2, 0x7D, 0x67, 0x5D, 0xC3, -0x04, 0x92, 0x20, 0xF0, 0x42, 0xA2, 0x7D, 0x67, 0x5E, 0xC3, 0x04, 0x92, 0x20, 0xF0, 0x43, 0xA2, -0x7D, 0x67, 0x5F, 0xC3, 0x04, 0x92, 0x20, 0xF0, 0x44, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, -0x7D, 0x67, 0x54, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x44, 0x9A, -0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x41, 0xC3, 0x7D, 0x67, -0x54, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x48, 0x9A, 0x49, 0xE3, -0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xC3, 0x04, 0x92, 0x6C, 0xAA, -0xFF, 0x6A, 0x6C, 0xEA, 0x0F, 0x6B, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x43, 0xC3, 0x04, 0x92, -0x4C, 0xAA, 0x62, 0x67, 0xF0, 0x6A, 0x6C, 0xEA, 0x53, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, -0x20, 0xF0, 0x44, 0xC3, 0x04, 0x92, 0x4A, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0x45, 0xC3, 0x06, 0x94, -0x07, 0x95, 0x08, 0x96, 0x09, 0x97, 0x00, 0x18, 0xB8, 0x22, 0x1C, 0x10, 0x03, 0x6A, 0x7D, 0x67, -0x53, 0xCB, 0x0E, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x0F, 0x6A, 0x7D, 0x67, 0x5A, 0xC3, 0x30, 0xF0, -0x20, 0x6A, 0x40, 0xF0, 0x48, 0xA2, 0x7D, 0x67, 0x5B, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF0, -0x08, 0x4A, 0x41, 0xA2, 0x7D, 0x67, 0x5C, 0xC3, 0x06, 0x94, 0x07, 0x95, 0x08, 0x96, 0x09, 0x97, -0x00, 0x18, 0xB8, 0x22, 0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x64, 0x67, -0x45, 0x67, 0x9D, 0x67, 0x68, 0xC4, 0x7D, 0x67, 0x4C, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x25, 0x22, -0x7D, 0x67, 0x4C, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x48, 0x9A, -0x49, 0xE3, 0x40, 0xA2, 0x9D, 0x67, 0x40, 0xC4, 0x5D, 0x67, 0x60, 0xA2, 0x08, 0x6A, 0x4B, 0xEA, -0x6C, 0xEA, 0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, 0x60, 0xA4, 0x01, 0x6A, 0x6D, 0xEA, 0x7D, 0x67, -0x40, 0xC3, 0x9D, 0x67, 0x4C, 0xA4, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, -0x48, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x60, 0xA4, 0x60, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, -0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x68, 0xC4, 0x7D, 0x67, 0x4C, 0xC3, 0x01, 0x63, -0x20, 0xE8, 0x00, 0x65, 0xF9, 0x63, 0x0D, 0x62, 0x1C, 0x65, 0x85, 0x67, 0x66, 0x67, 0x47, 0x67, -0xD8, 0x67, 0xBD, 0x67, 0x20, 0xF0, 0xD8, 0xC5, 0xBD, 0x67, 0x20, 0xF0, 0x9C, 0xC5, 0xDD, 0x67, -0x40, 0xF0, 0x60, 0xC6, 0x7D, 0x67, 0x40, 0xF0, 0x44, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x58, 0xA4, -0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, -0x07, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0xE5, 0xF7, 0x00, 0x4A, 0x06, 0xD2, 0x00, 0x6A, 0xBD, 0x67, -0x20, 0xF0, 0x43, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x58, 0xA6, 0x4E, 0x32, 0x7D, 0x67, 0x20, 0xF0, -0x49, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x78, 0xA4, 0x07, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x20, 0xF0, -0x47, 0xC5, 0x00, 0x6A, 0xDD, 0x67, 0x20, 0xF0, 0x46, 0xC6, 0x00, 0x6A, 0x7D, 0x67, 0x20, 0xF0, -0x45, 0xC3, 0x07, 0x92, 0x60, 0xA2, 0x7F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x20, 0xF0, 0x42, 0xC4, -0x07, 0x92, 0x41, 0xA2, 0xBD, 0x67, 0x20, 0xF0, 0x41, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x7C, 0xA6, -0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x7C, 0xA4, -0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0xBD, 0x67, 0x20, 0xF0, 0x44, 0xC5, 0xDD, 0x67, 0x20, 0xF0, -0x58, 0xA6, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x48, 0x9A, 0x49, 0xE3, -0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, -0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x46, 0x6D, 0xAE, 0xEA, 0x27, 0x2A, 0xDD, 0x67, 0x40, 0xF0, -0x44, 0xA6, 0x02, 0x6B, 0x6E, 0xEA, 0x21, 0x2A, 0x07, 0x92, 0x4C, 0xA2, 0xF0, 0x6B, 0x6C, 0xEA, -0x10, 0x6C, 0x8E, 0xEA, 0x05, 0x2A, 0x47, 0x6A, 0xBD, 0x67, 0x20, 0xF0, 0x48, 0xC5, 0x0B, 0x10, -0x07, 0x92, 0x4C, 0xA2, 0xF0, 0x6B, 0x6C, 0xEA, 0x20, 0x6E, 0xCE, 0xEA, 0x04, 0x2A, 0x45, 0x6A, -0x7D, 0x67, 0x20, 0xF0, 0x48, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xA4, 0xBD, 0x67, 0x20, 0xF0, -0x44, 0xA5, 0x6D, 0xEA, 0xDD, 0x67, 0x20, 0xF0, 0x5C, 0xC6, 0x5D, 0x67, 0x20, 0xF0, 0x68, 0xA2, -0x30, 0xF0, 0x20, 0x6A, 0x64, 0x33, 0x80, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x40, 0xAA, 0x62, 0x67, -0xBD, 0x67, 0x20, 0xF0, 0x88, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x84, 0x34, 0x40, 0xF4, 0x04, 0x4A, -0x49, 0xE4, 0x40, 0xAA, 0x49, 0xE3, 0x47, 0x33, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x07, 0x92, -0x6C, 0xCA, 0xDD, 0x67, 0x20, 0xF0, 0x5C, 0xA6, 0xFF, 0x6B, 0x6E, 0xEA, 0xE0, 0xF1, 0x10, 0x22, -0x9D, 0x67, 0x20, 0xF0, 0x68, 0xA4, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, 0x63, 0xEA, 0x58, 0x67, -0x16, 0x22, 0x5D, 0x67, 0x20, 0xF0, 0x7C, 0x82, 0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x00, 0xF6, -0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x9D, 0x67, 0x20, 0xF0, 0x42, 0x84, 0x6D, 0xEA, 0x00, 0xF6, -0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0xBD, 0x67, 0x20, 0xF0, 0x5C, 0xC5, 0x0F, 0x10, 0xDD, 0x67, -0x20, 0xF0, 0x68, 0xA6, 0x9D, 0x67, 0x20, 0xF0, 0x41, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0x06, 0x22, -0x7D, 0x67, 0x20, 0xF0, 0x41, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x5C, 0xC4, 0xBD, 0x67, 0x20, 0xF0, -0x78, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x48, 0xA6, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB4, 0x2C, -0x7D, 0x67, 0x40, 0xF0, 0x40, 0xA3, 0x1A, 0x2A, 0x07, 0x92, 0x8F, 0xA2, 0x41, 0x6B, 0x6B, 0xEB, -0x8C, 0xEB, 0x6F, 0xC2, 0x07, 0x92, 0x9D, 0x67, 0x20, 0xF0, 0x7C, 0xA4, 0x63, 0xC2, 0xBD, 0x67, -0x20, 0xF0, 0x78, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x5C, 0xA6, 0x00, 0x6C, 0x04, 0xD4, 0x00, 0x6C, -0x00, 0x6D, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0xB9, 0x30, 0x56, 0x10, 0x5D, 0x67, 0x20, 0xF0, -0x65, 0xA2, 0x01, 0x6A, 0x6D, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x45, 0xC3, 0x07, 0x92, 0x4F, 0xA2, -0x5A, 0x32, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, -0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, -0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x07, 0x92, 0x01, 0x6B, 0x8C, 0xEB, -0x78, 0x33, 0xAF, 0xA2, 0x41, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0x07, 0x92, -0x9D, 0x67, 0x20, 0xF0, 0x7C, 0xA4, 0x63, 0xC2, 0xBD, 0x67, 0x20, 0xF0, 0x66, 0xA5, 0x40, 0x6A, -0x6D, 0xEA, 0xDD, 0x67, 0x20, 0xF0, 0x46, 0xC6, 0x5D, 0x67, 0x20, 0xF0, 0x68, 0xA2, 0x30, 0xF0, -0x20, 0x6A, 0x00, 0xF1, 0x04, 0x4A, 0x49, 0xE3, 0x60, 0xA2, 0x07, 0x92, 0x73, 0xC2, 0x07, 0x92, -0x7A, 0xA2, 0xBD, 0x67, 0x20, 0xF0, 0x88, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF3, 0x08, 0x4A, -0x49, 0xE4, 0x40, 0xA2, 0x43, 0xEB, 0x58, 0x67, 0x07, 0x22, 0x07, 0x92, 0x53, 0xA2, 0x64, 0x42, -0xFF, 0x6A, 0x4C, 0xEB, 0x07, 0x92, 0x73, 0xC2, 0x7D, 0x67, 0x40, 0xF0, 0x44, 0xA3, 0x4C, 0x33, -0xFF, 0x6A, 0x4C, 0xEB, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x4D, 0xE3, 0xFF, 0x6A, 0x6C, 0xEA, -0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xBD, 0x67, 0x20, 0xF0, 0x46, 0x85, 0x6D, 0xEA, -0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0xDD, 0x67, 0x20, 0xF0, 0x46, 0xC6, 0x7D, 0x67, -0x20, 0xF0, 0x58, 0xA3, 0x03, 0x5A, 0x58, 0x67, 0x10, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, -0x44, 0x9A, 0x9D, 0x67, 0x20, 0xF0, 0x7C, 0xA4, 0x60, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, -0x48, 0x9A, 0xBD, 0x67, 0x20, 0xF0, 0x66, 0xA5, 0x60, 0xC2, 0xDD, 0x67, 0x20, 0xF0, 0x58, 0xA6, -0xE0, 0xF0, 0x02, 0x2A, 0x7D, 0x67, 0x40, 0xF0, 0x40, 0xA3, 0xC0, 0xF0, 0x1D, 0x2A, 0x9D, 0x67, -0x20, 0xF0, 0x5C, 0xA4, 0x04, 0x5A, 0x58, 0x67, 0x19, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, -0x0C, 0x5A, 0x58, 0x67, 0x13, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0x6C, 0x42, 0x30, 0xF0, -0x20, 0x6A, 0x40, 0xF0, 0x0C, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF0, -0x10, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0xBE, 0x10, 0x9D, 0x67, 0x20, 0xF0, -0x5C, 0xA4, 0x04, 0x5A, 0x58, 0x67, 0x12, 0x22, 0x5D, 0x67, 0x20, 0xF0, 0x7C, 0xA2, 0x30, 0xF0, -0x20, 0x6A, 0x40, 0xF0, 0x14, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF0, -0x1C, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0xA6, 0x10, 0x07, 0x92, 0x4E, 0xA2, -0x30, 0x6B, 0x6C, 0xEA, 0x10, 0x6B, 0x6E, 0xEA, 0x4C, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x5C, 0xA4, -0x2C, 0x5A, 0x58, 0x67, 0x13, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0x36, 0x5A, 0x58, 0x67, -0x0D, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xD4, 0x4A, 0x30, 0xF0, 0x20, 0x6B, 0x81, 0xF0, -0x08, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x86, 0x10, 0x9D, 0x67, 0x20, 0xF0, -0x5C, 0xA4, 0x36, 0x5A, 0x58, 0x67, 0x14, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0x40, 0x5A, -0x58, 0x67, 0x0E, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xCA, 0x4A, 0x30, 0xF0, 0x20, 0x6B, -0x81, 0xF0, 0x14, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x00, 0x65, 0x6C, 0x10, -0x9D, 0x67, 0x20, 0xF0, 0x5C, 0xA4, 0x40, 0x5A, 0x58, 0x67, 0x63, 0x2A, 0x7D, 0x67, 0x20, 0xF0, -0x5C, 0xA3, 0x4A, 0x5A, 0x58, 0x67, 0x5F, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xC0, 0x4A, -0x30, 0xF0, 0x20, 0x6B, 0xA1, 0xF0, 0x00, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, -0x53, 0x10, 0x07, 0x92, 0x4E, 0xA2, 0x30, 0x6B, 0x6C, 0xEA, 0x4E, 0x2A, 0x9D, 0x67, 0x20, 0xF0, -0x5C, 0xA4, 0x0C, 0x5A, 0x58, 0x67, 0x13, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0x16, 0x5A, -0x58, 0x67, 0x0D, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xD4, 0x4A, 0x30, 0xF0, 0x20, 0x6B, -0xA1, 0xF0, 0x0C, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x35, 0x10, 0x9D, 0x67, -0x20, 0xF0, 0x5C, 0xA4, 0x16, 0x5A, 0x58, 0x67, 0x13, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, -0x20, 0x5A, 0x58, 0x67, 0x0D, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xEA, 0x4A, 0x30, 0xF0, -0x20, 0x6B, 0xA1, 0xF0, 0x18, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x1C, 0x10, -0x9D, 0x67, 0x20, 0xF0, 0x5C, 0xA4, 0x20, 0x5A, 0x58, 0x67, 0x16, 0x2A, 0x7D, 0x67, 0x20, 0xF0, -0x5C, 0xA3, 0x24, 0x5A, 0x58, 0x67, 0x10, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x5C, 0xA3, 0xE0, 0x4A, -0x30, 0xF0, 0x20, 0x6B, 0xC1, 0xF0, 0x04, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, -0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, 0x9D, 0x67, 0x20, 0xF0, 0x58, 0xA4, 0x54, 0x32, -0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x44, 0x9A, 0x49, 0xE3, 0xBD, 0x67, 0x20, 0xF0, -0x7C, 0xA5, 0x60, 0xC2, 0xDD, 0x67, 0x20, 0xF0, 0x58, 0xA6, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, -0x20, 0x6A, 0x01, 0xF4, 0x48, 0x9A, 0x49, 0xE3, 0x9D, 0x67, 0x20, 0xF0, 0x66, 0xA4, 0x60, 0xC2, -0xBD, 0x67, 0x20, 0xF0, 0x58, 0xA5, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF4, -0x4C, 0x9A, 0x49, 0xE3, 0xDD, 0x67, 0x20, 0xF0, 0x65, 0xA6, 0x60, 0xC2, 0x00, 0x65, 0x01, 0x10, -0x00, 0x65, 0x0D, 0x97, 0x07, 0x63, 0x00, 0xEF, 0xFE, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, -0x68, 0xCC, 0x7D, 0x67, 0x4A, 0xCB, 0x01, 0x6A, 0x9D, 0x67, 0x46, 0xCC, 0x00, 0x6A, 0x7D, 0x67, -0x40, 0xCB, 0x9D, 0x67, 0x68, 0xAC, 0x9D, 0x67, 0x4A, 0xAC, 0x6E, 0xEA, 0x04, 0x2A, 0x64, 0x6A, -0x7D, 0x67, 0x46, 0xCB, 0x87, 0x10, 0x9D, 0x67, 0x48, 0xAC, 0x07, 0x22, 0x5D, 0x67, 0x68, 0xAA, -0x9D, 0x67, 0x4A, 0xAC, 0x63, 0xEA, 0x58, 0x67, 0x04, 0x22, 0x00, 0x6A, 0x7D, 0x67, 0x46, 0xCB, -0x79, 0x10, 0x9D, 0x67, 0x4A, 0xAC, 0x02, 0xF0, 0x00, 0x5A, 0x58, 0x67, 0x04, 0x22, 0x04, 0x6A, -0x7D, 0x67, 0x40, 0xCB, 0x1C, 0x10, 0x9D, 0x67, 0x4A, 0xAC, 0x04, 0xF0, 0x00, 0x5A, 0x58, 0x67, -0x04, 0x22, 0x03, 0x6A, 0x7D, 0x67, 0x40, 0xCB, 0x12, 0x10, 0x9D, 0x67, 0x4A, 0xAC, 0x08, 0xF0, -0x00, 0x5A, 0x58, 0x67, 0x04, 0x22, 0x02, 0x6A, 0x7D, 0x67, 0x40, 0xCB, 0x08, 0x10, 0x9D, 0x67, -0x4A, 0x8C, 0x00, 0x52, 0x58, 0x67, 0x03, 0x2A, 0x01, 0x6A, 0x7D, 0x67, 0x40, 0xCB, 0x9D, 0x67, -0x6A, 0xAC, 0x9D, 0x67, 0x40, 0xAC, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x02, 0xD2, 0x5D, 0x67, -0x68, 0xAA, 0x9D, 0x67, 0x40, 0xAC, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x01, 0xD2, 0x00, 0x6A, -0x7D, 0x67, 0x4E, 0xC3, 0x33, 0x10, 0x02, 0x92, 0x46, 0x32, 0x02, 0xD2, 0x01, 0x93, 0x02, 0x92, -0x63, 0xEA, 0x58, 0x67, 0x26, 0x22, 0x7D, 0x67, 0x4E, 0xA3, 0x81, 0xF4, 0x00, 0x6B, 0x67, 0xEA, -0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x9D, 0x67, 0x46, 0xAC, 0x49, 0xE3, 0x7D, 0x67, 0x46, 0xCB, -0x01, 0x93, 0x02, 0x92, 0x4B, 0xE3, 0x01, 0xD2, 0x02, 0x92, 0x01, 0x6C, 0x8E, 0xEA, 0x07, 0x2A, -0x01, 0x92, 0x02, 0x5A, 0x58, 0x67, 0x03, 0x2A, 0x02, 0x6A, 0x02, 0xD2, 0x0A, 0x10, 0x02, 0x92, -0x01, 0x6B, 0x6E, 0xEA, 0x04, 0x2A, 0x01, 0x92, 0x01, 0x6C, 0x8E, 0xEA, 0x0E, 0x22, 0x01, 0x92, -0x0B, 0x22, 0x7D, 0x67, 0x4E, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x4E, 0xC4, 0x7D, 0x67, 0x4E, 0xA3, -0x0C, 0x5A, 0x58, 0x67, 0xC8, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x7D, 0x67, 0x46, 0xAB, 0x5A, 0x32, -0x9D, 0x67, 0x46, 0xCC, 0x5D, 0x67, 0x66, 0xAA, 0xFF, 0x6A, 0x6C, 0xEA, 0x02, 0x63, 0x20, 0xE8, -0xFC, 0x63, 0x07, 0x62, 0x64, 0x67, 0x09, 0xD5, 0x0A, 0xD6, 0x47, 0x67, 0x9D, 0x67, 0x20, 0xF0, -0x60, 0xC4, 0xBD, 0x67, 0x56, 0xCD, 0x0A, 0x92, 0x05, 0xD2, 0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, -0x01, 0x6A, 0x9D, 0x67, 0x52, 0xC4, 0x1D, 0x10, 0xBD, 0x67, 0x52, 0xA5, 0x7D, 0x67, 0x51, 0xC3, -0x0E, 0x10, 0x9D, 0x67, 0x51, 0xA4, 0x48, 0x32, 0x09, 0x93, 0x49, 0xE3, 0x40, 0x9A, 0x05, 0x93, -0x49, 0xE3, 0x05, 0xD2, 0xBD, 0x67, 0x51, 0xA5, 0x01, 0x4A, 0x7D, 0x67, 0x51, 0xC3, 0x9D, 0x67, -0x51, 0xA4, 0x05, 0x5A, 0x58, 0x67, 0xED, 0x2A, 0x7D, 0x67, 0x52, 0xA3, 0x01, 0x4A, 0x9D, 0x67, -0x52, 0xC4, 0xBD, 0x67, 0x52, 0xA5, 0x05, 0x5A, 0x58, 0x67, 0xDE, 0x2A, 0x05, 0x92, 0x04, 0x2A, -0x00, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x23, 0x10, 0x05, 0x93, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, -0x0A, 0x94, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x4F, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, -0x9D, 0x67, 0x56, 0xAC, 0x4F, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x05, 0x94, -0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEC, 0xBD, 0x67, 0x56, 0xAD, 0x53, 0xE4, 0xFF, 0xF7, 0x1F, 0x6A, -0x8C, 0xEA, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x12, 0x2E, 0x7D, 0x67, 0x50, 0xC3, 0x9D, 0x67, -0x50, 0xA4, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x44, 0x67, 0x03, 0xD5, 0x7D, 0x67, -0x48, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x20, 0x5A, 0x58, 0x67, 0x09, 0x22, 0x7D, 0x67, 0x48, 0xA3, -0xE0, 0x4A, 0x9D, 0x67, 0x48, 0xC4, 0x00, 0x6A, 0xBD, 0x67, 0x40, 0xC5, 0x03, 0x10, 0x01, 0x6A, -0x7D, 0x67, 0x40, 0xC3, 0x9D, 0x67, 0x40, 0xA4, 0x48, 0x32, 0x03, 0x93, 0x49, 0xE3, 0x60, 0x9A, -0xBD, 0x67, 0x48, 0xA5, 0x01, 0x6C, 0xA4, 0x67, 0xA4, 0xEA, 0x45, 0x67, 0x6C, 0xEA, 0x02, 0x22, -0x01, 0x6A, 0x01, 0x10, 0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x65, 0x67, -0x46, 0x67, 0xBD, 0x67, 0x88, 0xC5, 0x9D, 0x67, 0x6C, 0xC4, 0xBD, 0x67, 0x50, 0xC5, 0x7D, 0x67, -0x48, 0xA3, 0x9D, 0x67, 0x44, 0xC4, 0xBD, 0x67, 0x50, 0xA5, 0x05, 0x22, 0x7D, 0x67, 0x44, 0xA3, -0xE0, 0x4A, 0x9D, 0x67, 0x44, 0xC4, 0xBD, 0x67, 0x44, 0xA5, 0x20, 0x5A, 0x58, 0x67, 0x11, 0x2A, -0x7D, 0x67, 0x4C, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x40, 0x9A, -0x49, 0xE3, 0x40, 0x9A, 0x00, 0xD2, 0x9D, 0x67, 0x44, 0xA4, 0xE0, 0x4A, 0xBD, 0x67, 0x44, 0xC5, -0x0B, 0x10, 0x7D, 0x67, 0x4C, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, -0x5C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x00, 0xD2, 0x9D, 0x67, 0x44, 0xA4, 0x01, 0x6B, 0xA3, 0x67, -0xA4, 0xEA, 0x45, 0x67, 0x62, 0x67, 0x00, 0x92, 0x6C, 0xEA, 0x03, 0x22, 0x7D, 0x67, 0x48, 0xA3, -0x01, 0x10, 0xFF, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0xF8, 0x63, 0x0F, 0x62, 0x1C, 0x65, 0x85, 0x67, -0x66, 0x67, 0x47, 0x67, 0xD8, 0x67, 0xBD, 0x67, 0x40, 0xF0, 0xC0, 0xC5, 0xBD, 0x67, 0x40, 0xF0, -0x84, 0xC5, 0xDD, 0x67, 0x40, 0xF0, 0x68, 0xC6, 0x7D, 0x67, 0x40, 0xF0, 0x4C, 0xC3, 0x9D, 0x67, -0x40, 0xF0, 0x48, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, -0x00, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x00, 0x6A, 0xBD, 0x67, 0x5D, 0xC5, 0x03, 0x6A, 0xDD, 0x67, -0x55, 0xC6, 0x00, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x9D, 0x67, 0x40, 0xF0, 0x60, 0xA4, 0x7F, 0x6A, -0x6C, 0xEA, 0xBD, 0x67, 0x56, 0xC5, 0xDD, 0x67, 0x40, 0xF0, 0x44, 0xA6, 0x39, 0x2A, 0x7D, 0x67, -0x56, 0xA3, 0x0C, 0x5A, 0x58, 0x67, 0x0C, 0x22, 0x5D, 0x67, 0x76, 0xA2, 0x30, 0xF0, 0x20, 0x6A, -0xA0, 0xF1, 0x0C, 0x4A, 0x49, 0xE3, 0x0B, 0xD2, 0x01, 0x6A, 0x7D, 0x67, 0x54, 0xC3, 0x60, 0x10, -0x9D, 0x67, 0x56, 0xA4, 0xF4, 0x4A, 0xBD, 0x67, 0x5A, 0xC5, 0xDD, 0x67, 0x40, 0xF0, 0x4C, 0xA6, -0x0D, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x82, 0x67, 0x00, 0xF2, 0x14, 0x4C, 0x5D, 0x67, 0x7A, 0xA2, -0x43, 0x67, 0x44, 0x32, 0x69, 0xE2, 0x49, 0xE4, 0x0B, 0xD2, 0x4A, 0x10, 0x7D, 0x67, 0x5A, 0xA3, -0xE0, 0x4A, 0x9D, 0x67, 0x5A, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0x82, 0x67, 0xA0, 0xF1, 0x18, 0x4C, -0xBD, 0x67, 0x7A, 0xA5, 0x43, 0x67, 0x44, 0x32, 0x69, 0xE2, 0x49, 0xE4, 0x0B, 0xD2, 0x38, 0x10, -0xDD, 0x67, 0x56, 0xA6, 0x0C, 0x5A, 0x58, 0x67, 0x0C, 0x22, 0x5D, 0x67, 0x76, 0xA2, 0x30, 0xF0, -0x20, 0x6A, 0x40, 0xF2, 0x1C, 0x4A, 0x49, 0xE3, 0x0B, 0xD2, 0x01, 0x6A, 0x7D, 0x67, 0x54, 0xC3, -0x27, 0x10, 0x9D, 0x67, 0x56, 0xA4, 0xF4, 0x4A, 0xBD, 0x67, 0x5A, 0xC5, 0xDD, 0x67, 0x40, 0xF0, -0x4C, 0xA6, 0x0D, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x82, 0x67, 0xC0, 0xF2, 0x04, 0x4C, 0x5D, 0x67, -0x7A, 0xA2, 0x43, 0x67, 0x44, 0x32, 0x69, 0xE2, 0x49, 0xE4, 0x0B, 0xD2, 0x11, 0x10, 0x7D, 0x67, -0x5A, 0xA3, 0xE0, 0x4A, 0x9D, 0x67, 0x5A, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0x82, 0x67, 0x60, 0xF2, -0x08, 0x4C, 0xBD, 0x67, 0x7A, 0xA5, 0x43, 0x67, 0x44, 0x32, 0x69, 0xE2, 0x49, 0xE4, 0x0B, 0xD2, -0xDD, 0x67, 0x54, 0xA6, 0x01, 0x6B, 0x6E, 0xEA, 0x22, 0x2A, 0x0B, 0x92, 0x40, 0xA2, 0x9D, 0x67, -0x5B, 0xC4, 0xBD, 0x67, 0x9B, 0xA5, 0xDD, 0x67, 0x40, 0xF0, 0x68, 0xA6, 0xBD, 0x67, 0x40, 0xF0, -0x4C, 0xA5, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xAB, 0x2E, 0xDD, 0x67, 0x5C, 0xC6, 0x04, 0x92, -0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, 0x7D, 0x67, 0x5C, 0xA3, 0xFF, 0x6C, -0x8E, 0xEA, 0x02, 0x2A, 0xFF, 0x6A, 0x54, 0x11, 0xBD, 0x67, 0x5C, 0xA5, 0x51, 0x11, 0x00, 0x6A, -0xDD, 0x67, 0x59, 0xC6, 0x0D, 0x10, 0x7D, 0x67, 0x59, 0xA3, 0x04, 0x03, 0x49, 0xE3, 0x01, 0x6B, -0x6B, 0xEB, 0x20, 0xF0, 0x60, 0xC2, 0x9D, 0x67, 0x59, 0xA4, 0x01, 0x4A, 0xBD, 0x67, 0x59, 0xC5, -0xDD, 0x67, 0x59, 0xA6, 0x03, 0x5A, 0x58, 0x67, 0xEE, 0x2A, 0x00, 0x6A, 0x7D, 0x67, 0x58, 0xC3, -0x00, 0x6A, 0x9D, 0x67, 0x59, 0xC4, 0x55, 0x10, 0xBD, 0x67, 0x59, 0xA5, 0x0B, 0x93, 0x49, 0xE3, -0x40, 0xA2, 0xDD, 0x67, 0x5B, 0xC6, 0x7D, 0x67, 0x5B, 0xA3, 0x2C, 0x6C, 0x8E, 0xEA, 0x07, 0x2A, -0xBD, 0x67, 0x40, 0xF0, 0x4C, 0xA5, 0x03, 0x2A, 0x0C, 0x6A, 0xDD, 0x67, 0x5B, 0xC6, 0x5D, 0x67, -0x9B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x68, 0xA5, 0xDD, 0x67, 0x40, 0xF0, 0x4C, 0xA6, 0xA3, 0x67, -0xC2, 0x67, 0x00, 0x18, 0xAB, 0x2E, 0x7D, 0x67, 0x5C, 0xC3, 0x9D, 0x67, 0x59, 0xA4, 0x01, 0x4A, -0xBD, 0x67, 0x59, 0xC5, 0xDD, 0x67, 0x5C, 0xA6, 0xFF, 0x6B, 0x6E, 0xEA, 0x18, 0x2A, 0x9D, 0x67, -0x5B, 0xA4, 0x46, 0x6D, 0xAE, 0xEA, 0x0C, 0x2A, 0xDD, 0x67, 0x40, 0xF0, 0x44, 0xA6, 0x04, 0x2A, -0x47, 0x6A, 0x7D, 0x67, 0x5C, 0xC3, 0x24, 0x10, 0x45, 0x6A, 0x9D, 0x67, 0x5C, 0xC4, 0x20, 0x10, -0xBD, 0x67, 0x7D, 0xA5, 0xDD, 0x67, 0x59, 0xA6, 0x49, 0xE3, 0x7D, 0x67, 0x5D, 0xC3, 0x9D, 0x67, -0x5C, 0xA4, 0xFF, 0x6D, 0xAE, 0xEA, 0x0D, 0x22, 0xDD, 0x67, 0x58, 0xA6, 0x04, 0x03, 0x49, 0xE3, -0x9D, 0x67, 0x7C, 0xA4, 0x20, 0xF0, 0x60, 0xC2, 0xBD, 0x67, 0x58, 0xA5, 0x01, 0x4A, 0xDD, 0x67, -0x58, 0xC6, 0x5D, 0x67, 0x79, 0xA2, 0x9D, 0x67, 0x55, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0xA4, 0x2A, -0x7D, 0x67, 0x58, 0xA3, 0x6F, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, -0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x04, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0x6C, 0x33, 0xAF, 0xA2, -0x19, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0x9D, 0x67, 0x5D, 0xA4, 0x06, 0x5A, -0x58, 0x67, 0x02, 0x2A, 0xFF, 0x6A, 0xBC, 0x10, 0x0C, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, -0x10, 0x6A, 0x9D, 0x67, 0x5F, 0xC4, 0x10, 0x6A, 0xBD, 0x67, 0x5E, 0xC5, 0x04, 0x92, 0x51, 0xA2, -0x52, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0xDD, 0x67, 0x57, 0xC6, -0x00, 0x6A, 0x09, 0xD2, 0x04, 0x92, 0x5D, 0xA2, 0x02, 0x6B, 0x6C, 0xEA, 0x33, 0x22, 0x7D, 0x67, -0x40, 0xF0, 0x4C, 0xA3, 0x06, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF4, 0x0C, 0x4A, 0x0A, 0xD2, -0x05, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF4, 0x14, 0x4A, 0x0A, 0xD2, 0x9D, 0x67, 0x57, 0xA4, -0xFF, 0x4A, 0x02, 0x5A, 0x58, 0x67, 0x1E, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x51, 0xA3, 0x09, 0xD2, -0x09, 0x92, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x62, 0x67, 0x0A, 0x92, 0x40, 0x9A, -0x6C, 0xEA, 0x10, 0x22, 0xBD, 0x67, 0x20, 0xF0, 0x51, 0xA5, 0xDD, 0x67, 0x5C, 0xC6, 0x7D, 0x67, -0x20, 0xF0, 0x50, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x51, 0xC4, 0xBD, 0x67, 0x5C, 0xA5, 0xDD, 0x67, -0x20, 0xF0, 0x50, 0xC6, 0x04, 0x92, 0x5D, 0xA2, 0x40, 0x6B, 0x6C, 0xEA, 0x2C, 0x22, 0x7D, 0x67, -0x40, 0xF0, 0x4C, 0xA3, 0x06, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xE0, 0xF4, 0x1C, 0x4A, 0x0A, 0xD2, -0x05, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF5, 0x04, 0x4A, 0x0A, 0xD2, 0x9D, 0x67, 0x57, 0xA4, -0xFF, 0x4A, 0x02, 0x5A, 0x58, 0x67, 0x17, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x51, 0xA3, 0x01, 0x6B, -0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x62, 0x67, 0x0A, 0x92, 0x40, 0x9A, 0x6C, 0xEA, 0x0B, 0x22, -0xBD, 0x67, 0x20, 0xF0, 0x51, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x50, 0xC6, 0x01, 0x6A, 0x4B, 0xEA, -0x7D, 0x67, 0x20, 0xF0, 0x51, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x51, 0xA4, 0xFF, 0x6D, 0xAE, 0xEA, -0x11, 0x22, 0xDD, 0x67, 0x20, 0xF0, 0x52, 0xA6, 0xFF, 0x6B, 0x6E, 0xEA, 0x0B, 0x22, 0x9D, 0x67, -0x20, 0xF0, 0x71, 0xA4, 0x04, 0x92, 0x65, 0xC2, 0xBD, 0x67, 0x20, 0xF0, 0x72, 0xA5, 0x04, 0x92, -0x66, 0xC2, 0x23, 0x10, 0xDD, 0x67, 0x20, 0xF0, 0x51, 0xA6, 0xFF, 0x6B, 0x6E, 0xEA, 0x0C, 0x22, -0x9D, 0x67, 0x20, 0xF0, 0x52, 0xA4, 0xFF, 0x6D, 0xAE, 0xEA, 0x06, 0x2A, 0xDD, 0x67, 0x20, 0xF0, -0x71, 0xA6, 0x04, 0x92, 0x66, 0xC2, 0x11, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x51, 0xA3, 0xFF, 0x6C, -0x8E, 0xEA, 0x0B, 0x2A, 0xBD, 0x67, 0x20, 0xF0, 0x52, 0xA5, 0xFF, 0x6E, 0xCE, 0xEA, 0x05, 0x22, -0x5D, 0x67, 0x20, 0xF0, 0x72, 0xA2, 0x04, 0x92, 0x66, 0xC2, 0x7D, 0x67, 0x20, 0xF0, 0x50, 0xA3, -0x0F, 0x97, 0x08, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, 0x65, 0x67, 0x46, 0x67, -0xBD, 0x67, 0x20, 0xF0, 0x80, 0xC5, 0x9D, 0x67, 0x20, 0xF0, 0x64, 0xC4, 0xBD, 0x67, 0x20, 0xF0, -0x48, 0xC5, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, -0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x04, 0x92, 0x4E, 0xA2, 0x52, 0x32, -0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x55, 0xC4, 0x04, 0x92, -0x60, 0xA2, 0x04, 0x92, 0x42, 0xA2, 0x4B, 0xE3, 0xBD, 0x67, 0x57, 0xC5, 0x04, 0x92, 0x61, 0xA2, -0x04, 0x92, 0x42, 0xA2, 0x49, 0xE3, 0x7D, 0x67, 0x56, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x44, 0xA4, -0x38, 0x5A, 0x58, 0x67, 0x05, 0x2A, 0x04, 0x92, 0x40, 0xA2, 0x7D, 0x67, 0x54, 0xC3, 0x1A, 0x10, -0x9D, 0x67, 0x20, 0xF0, 0x44, 0xA4, 0x24, 0x5A, 0x58, 0x67, 0x05, 0x2A, 0x7D, 0x67, 0x57, 0xA3, -0x9D, 0x67, 0x54, 0xC4, 0x0F, 0x10, 0xBD, 0x67, 0x20, 0xF0, 0x44, 0xA5, 0x15, 0x5A, 0x58, 0x67, -0x05, 0x2A, 0x7D, 0x67, 0x56, 0xA3, 0x9D, 0x67, 0x54, 0xC4, 0x04, 0x10, 0x04, 0x92, 0x41, 0xA2, -0xBD, 0x67, 0x54, 0xC5, 0x5D, 0x67, 0x20, 0xF0, 0x80, 0xA2, 0xBD, 0x67, 0x74, 0xA5, 0xBD, 0x67, -0x20, 0xF0, 0x48, 0xA5, 0xA3, 0x67, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0xB9, 0x2C, 0x5D, 0x67, -0x20, 0xF0, 0xA0, 0xA2, 0x9D, 0x67, 0x20, 0xF0, 0x64, 0xA4, 0x9D, 0x67, 0x54, 0xA4, 0x30, 0xF0, -0x20, 0x6C, 0xC1, 0xF0, 0x10, 0x4C, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x07, 0x97, -0x04, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x68, 0xC4, 0x7D, 0x67, -0x4C, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, -0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x00, 0xD2, 0x01, 0x6A, 0x4B, 0xEA, 0x7D, 0x67, 0x44, 0xC3, -0x00, 0x92, 0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, 0x03, 0x6C, 0x8E, 0xEA, 0x38, 0x2A, 0x7D, 0x67, -0x4C, 0xA3, 0x48, 0x5A, 0x58, 0x67, 0x1D, 0x2A, 0x7D, 0x67, 0x4C, 0xA3, 0x4A, 0x5A, 0x58, 0x67, -0x18, 0x22, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x7B, 0x22, 0x7D, 0x67, 0x4C, 0xA3, -0x6F, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x80, 0x6A, -0x4B, 0xEA, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x9D, 0x67, 0x44, 0xC4, -0x6F, 0x10, 0x7D, 0x67, 0x4C, 0xA3, 0x47, 0x6C, 0x8E, 0xEA, 0x65, 0x2A, 0x00, 0x92, 0x4E, 0xA2, -0x0C, 0x6B, 0x6C, 0xEA, 0x08, 0x6B, 0x6E, 0xEA, 0x60, 0x2A, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, -0x6C, 0xEA, 0x5D, 0x22, 0x3B, 0x6A, 0x4B, 0xEA, 0x9D, 0x67, 0x44, 0xC4, 0x59, 0x10, 0x00, 0x92, -0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, 0x02, 0x6B, 0x6E, 0xEA, 0x22, 0x2A, 0x9D, 0x67, 0x4C, 0xA4, -0x3E, 0x5A, 0x58, 0x67, 0x4D, 0x2A, 0x7D, 0x67, 0x4C, 0xA3, 0x40, 0x5A, 0x58, 0x67, 0x48, 0x22, -0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x43, 0x22, 0x7D, 0x67, 0x4C, 0xA3, 0x6F, 0x42, -0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x80, 0x6A, 0x4B, 0xEA, -0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x9D, 0x67, 0x44, 0xC4, 0x30, 0x10, -0x00, 0x92, 0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, 0x01, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, 0x9D, 0x67, -0x4C, 0xA4, 0x34, 0x5A, 0x58, 0x67, 0x24, 0x2A, 0x7D, 0x67, 0x4C, 0xA3, 0x36, 0x5A, 0x58, 0x67, -0x1F, 0x22, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x1A, 0x22, 0x7D, 0x67, 0x4C, 0xA3, -0x6F, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x80, 0x6A, -0x4B, 0xEA, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, 0x43, 0x32, 0x9D, 0x67, 0x44, 0xC4, -0x07, 0x10, 0x00, 0x65, 0x05, 0x10, 0x00, 0x65, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, -0x7D, 0x67, 0x44, 0xA3, 0x01, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, -0x68, 0xC4, 0x7D, 0x67, 0x4C, 0xC3, 0x9D, 0x67, 0x48, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, -0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x00, 0xD2, 0x5D, 0x67, 0x6C, 0xA2, -0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x45, 0xC3, 0x9D, 0x67, 0x6C, 0xA4, 0x80, 0x6A, 0x4B, 0xEA, -0x6C, 0xEA, 0x7D, 0x67, 0x44, 0xC3, 0x9D, 0x67, 0x44, 0xA4, 0x0A, 0x22, 0x7D, 0x67, 0x45, 0xA3, -0x48, 0x6C, 0x8E, 0xEA, 0x02, 0x2A, 0x49, 0x6A, 0x62, 0x10, 0x7D, 0x67, 0x45, 0xA3, 0x5F, 0x10, -0x01, 0x6A, 0x4B, 0xEA, 0x9D, 0x67, 0x46, 0xC4, 0x00, 0x92, 0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, -0x03, 0x6B, 0x6E, 0xEA, 0x17, 0x2A, 0x9D, 0x67, 0x45, 0xA4, 0x45, 0x5A, 0x58, 0x67, 0x4D, 0x2A, -0x7D, 0x67, 0x45, 0xA3, 0x49, 0x5A, 0x58, 0x67, 0x48, 0x22, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, -0x6C, 0xEA, 0x43, 0x22, 0x5D, 0x67, 0x65, 0xA2, 0x80, 0x6A, 0x4B, 0xEA, 0x6D, 0xEA, 0x7D, 0x67, -0x46, 0xC3, 0x3B, 0x10, 0x00, 0x92, 0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, 0x02, 0x6C, 0x8E, 0xEA, -0x17, 0x2A, 0x7D, 0x67, 0x45, 0xA3, 0x3D, 0x5A, 0x58, 0x67, 0x2F, 0x2A, 0x7D, 0x67, 0x45, 0xA3, -0x3F, 0x5A, 0x58, 0x67, 0x2A, 0x22, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x25, 0x22, -0x5D, 0x67, 0x65, 0xA2, 0x80, 0x6A, 0x4B, 0xEA, 0x6D, 0xEA, 0x7D, 0x67, 0x46, 0xC3, 0x1D, 0x10, -0x00, 0x92, 0x4B, 0xA2, 0x07, 0x6B, 0x6C, 0xEA, 0x01, 0x6C, 0x8E, 0xEA, 0x16, 0x2A, 0x7D, 0x67, -0x45, 0xA3, 0x33, 0x5A, 0x58, 0x67, 0x11, 0x2A, 0x7D, 0x67, 0x45, 0xA3, 0x35, 0x5A, 0x58, 0x67, -0x0C, 0x22, 0x00, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, 0x07, 0x22, 0x5D, 0x67, 0x65, 0xA2, -0x80, 0x6A, 0x4B, 0xEA, 0x6D, 0xEA, 0x7D, 0x67, 0x46, 0xC3, 0x9D, 0x67, 0x46, 0xA4, 0x01, 0x63, -0x20, 0xE8, 0x00, 0x65, 0xF9, 0x63, 0x0D, 0x62, 0x1C, 0x65, 0x86, 0x67, 0x67, 0x67, 0x12, 0x92, -0xF8, 0x67, 0xDD, 0x67, 0x20, 0xF0, 0xF8, 0xC6, 0xDD, 0x67, 0x20, 0xF0, 0xBC, 0xC6, 0xFD, 0x67, -0x40, 0xF0, 0x80, 0xC7, 0x9D, 0x67, 0x40, 0xF0, 0x64, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x48, 0xC5, -0xDD, 0x67, 0x40, 0xF0, 0x40, 0xA6, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, -0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x04, 0x92, 0x5B, 0xA2, 0xFD, 0x67, 0x40, 0xF0, -0x64, 0xA7, 0x6E, 0xEA, 0x38, 0x22, 0x7D, 0x67, 0x40, 0xF0, 0x44, 0xA3, 0x9D, 0x67, 0x56, 0xC4, -0xBD, 0x67, 0x40, 0xF0, 0x40, 0xA5, 0xDD, 0x67, 0x57, 0xC6, 0xFD, 0x67, 0x20, 0xF0, 0x5C, 0xA7, -0x44, 0x32, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x9D, 0x67, 0x20, 0xF0, 0x58, 0x84, -0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, -0x58, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x48, 0xA6, 0xFD, 0x67, 0x5A, 0xC7, 0x04, 0x92, 0x56, 0xA2, -0x7D, 0x67, 0x5B, 0xC3, 0x0C, 0x6A, 0x9D, 0x67, 0x54, 0xC4, 0x06, 0x6A, 0xBD, 0x67, 0x51, 0xCD, -0x05, 0x94, 0x06, 0x95, 0x07, 0x96, 0x08, 0x97, 0x00, 0x18, 0xB8, 0x22, 0x04, 0x92, 0xDD, 0x67, -0x40, 0xF0, 0x64, 0xA6, 0x7B, 0xC2, 0x0D, 0x97, 0x07, 0x63, 0x00, 0xEF, 0xFB, 0x63, 0x09, 0x62, -0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x4C, 0xC5, -0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, -0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x54, 0x32, -0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x44, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0xBD, 0x67, -0x54, 0xC5, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, -0x01, 0xF4, 0x48, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x18, 0x6A, -0x6C, 0xEA, 0x4F, 0x32, 0x9D, 0x67, 0x55, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x48, 0xA5, 0x82, 0x67, -0x00, 0x18, 0x6A, 0x0B, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x4E, 0x32, 0x9D, 0x67, 0x58, 0xC4, -0xBD, 0x67, 0x20, 0xF0, 0x68, 0xA5, 0x07, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x57, 0xC3, 0x04, 0x92, -0x4F, 0xA2, 0x5A, 0x32, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, -0x56, 0xC4, 0xBD, 0x67, 0x56, 0xA5, 0x80, 0xF0, 0x04, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x4C, 0xA3, -0x22, 0x22, 0x04, 0x92, 0x8C, 0xA2, 0x10, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6C, 0xC2, 0x04, 0x92, -0x91, 0xA2, 0x10, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x71, 0xC2, 0xBD, 0x67, 0x20, 0xF0, 0x88, 0xA5, -0x5D, 0x67, 0x74, 0xA2, 0xBD, 0x67, 0x55, 0xA5, 0xA3, 0x67, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, -0xB9, 0x2C, 0x04, 0x92, 0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, 0x04, 0x92, -0x00, 0x6B, 0x72, 0xC2, 0x41, 0x10, 0x04, 0x92, 0x4F, 0xA2, 0x18, 0x6B, 0x6C, 0xEA, 0x18, 0x2A, -0x04, 0x92, 0x71, 0xA2, 0x0F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x61, 0x42, 0xFF, 0x6A, -0x6C, 0xEA, 0x62, 0x67, 0x0F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x04, 0x92, -0x0F, 0x6B, 0x8C, 0xEB, 0xB1, 0xA2, 0x10, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x71, 0xC2, -0x04, 0x92, 0x71, 0xA2, 0x0F, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x06, 0x52, 0x58, 0x67, -0x12, 0x2A, 0x04, 0x92, 0x4C, 0xA2, 0xF0, 0x6B, 0x6C, 0xEA, 0x10, 0x6B, 0x6E, 0xEA, 0x0B, 0x2A, -0x04, 0x92, 0x7A, 0xA2, 0x04, 0x92, 0x72, 0xC2, 0x04, 0x92, 0x91, 0xA2, 0x10, 0x6B, 0x6B, 0xEB, -0x8C, 0xEB, 0x71, 0xC2, 0x03, 0x10, 0x04, 0x92, 0x00, 0x6B, 0x72, 0xC2, 0x9D, 0x67, 0x20, 0xF0, -0x48, 0xA4, 0x82, 0x67, 0x00, 0x18, 0xD9, 0x32, 0x04, 0x92, 0x8F, 0xA2, 0x41, 0x6B, 0x6B, 0xEB, -0x8C, 0xEB, 0x6F, 0xC2, 0x04, 0x92, 0x90, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, -0x02, 0x6B, 0x8D, 0xEB, 0x70, 0xC2, 0x04, 0x92, 0x72, 0xA2, 0x04, 0x92, 0x90, 0xA2, 0x07, 0x6A, -0x4C, 0xEC, 0xFF, 0x6A, 0x8C, 0xEA, 0x4D, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x04, 0x92, 0x72, 0xC2, -0x01, 0x10, 0x00, 0x65, 0x09, 0x97, 0x05, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFA, 0x63, 0x0B, 0x62, -0x65, 0x67, 0x46, 0x67, 0xBD, 0x67, 0x20, 0xF0, 0x90, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x74, 0xC6, -0x7D, 0x67, 0x20, 0xF0, 0x58, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x50, 0xA4, 0x4C, 0x32, 0x48, 0x33, -0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x05, 0xD2, 0x30, 0xF0, -0x20, 0x6A, 0xE5, 0xF7, 0x00, 0x4A, 0x04, 0xD2, 0xBD, 0x67, 0x20, 0xF0, 0x50, 0xA5, 0x54, 0x32, -0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x44, 0x9A, 0x49, 0xE3, 0x40, 0xA2, 0xDD, 0x67, -0x20, 0xF0, 0x43, 0xC6, 0x5D, 0x67, 0x20, 0xF0, 0x63, 0xA2, 0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, -0x5D, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x63, 0xA4, 0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0xBD, 0x67, -0x20, 0xF0, 0x40, 0xC5, 0x05, 0x92, 0x40, 0xA2, 0xDD, 0x67, 0x5A, 0xC6, 0x05, 0x92, 0x41, 0xA2, -0x7D, 0x67, 0x5B, 0xC3, 0x05, 0x92, 0x4E, 0xA2, 0x52, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, -0xFF, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x20, 0xF0, 0x41, 0xC4, 0x05, 0x92, 0x4E, 0xA2, 0x4A, 0x32, -0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xC5, -0xDD, 0x67, 0x7D, 0xA6, 0x30, 0xF0, 0x20, 0x6A, 0x64, 0x33, 0x40, 0xF4, 0x04, 0x4A, 0x49, 0xE3, -0x60, 0xAA, 0x05, 0x92, 0x6C, 0xCA, 0x5D, 0x67, 0x20, 0xF0, 0x62, 0xA2, 0x03, 0x6A, 0x4C, 0xEB, -0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x05, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0xAF, 0xA2, 0x04, 0x6C, -0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0x05, 0x92, 0x01, 0x6B, 0x6B, 0xEB, 0x65, 0xC2, -0x05, 0x92, 0x01, 0x6B, 0x6B, 0xEB, 0x66, 0xC2, 0x01, 0x6A, 0x7D, 0x67, 0x58, 0xC3, 0x05, 0x92, -0x90, 0xA2, 0x7F, 0x6B, 0x8C, 0xEB, 0x70, 0xC2, 0x05, 0x92, 0x8F, 0xA2, 0x80, 0x6B, 0x6B, 0xEB, -0x8D, 0xEB, 0x6F, 0xC2, 0x05, 0x92, 0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, -0x05, 0x92, 0x00, 0x6B, 0x72, 0xC2, 0x9D, 0x67, 0x7D, 0xA4, 0xBD, 0x67, 0x5A, 0xA5, 0x63, 0xEA, -0x58, 0x67, 0x05, 0x22, 0x7D, 0x67, 0x5A, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x43, 0xC4, 0xBD, 0x67, -0x20, 0xF0, 0x54, 0xA5, 0x04, 0x2A, 0x00, 0x6A, 0xDD, 0x67, 0x58, 0xC6, 0xAA, 0x10, 0x7D, 0x67, -0x20, 0xF0, 0x54, 0xA3, 0x9D, 0x67, 0x5C, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x40, 0xA5, 0x0A, 0x22, -0xDD, 0x67, 0x5D, 0xA6, 0x7D, 0x67, 0x20, 0xF0, 0x43, 0xC3, 0x9D, 0x67, 0x5C, 0xA4, 0xFF, 0x4A, -0xBD, 0x67, 0x5C, 0xC5, 0xDD, 0x67, 0x5C, 0xA6, 0x04, 0x2A, 0x00, 0x6A, 0x7D, 0x67, 0x58, 0xC3, -0x90, 0x10, 0x9D, 0x67, 0x20, 0xF0, 0x70, 0xA4, 0xBD, 0x67, 0x20, 0xF0, 0x43, 0xA5, 0x83, 0x67, -0xA2, 0x67, 0x00, 0x18, 0x19, 0x30, 0xDD, 0x67, 0x59, 0xC6, 0x7D, 0x67, 0x59, 0xA3, 0xFF, 0x6C, -0x8E, 0xEA, 0x1A, 0x22, 0xBD, 0x67, 0x59, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x43, 0xC6, 0x5D, 0x67, -0x20, 0xF0, 0x63, 0xA2, 0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x5D, 0xC3, 0x9D, 0x67, 0x20, 0xF0, -0x63, 0xA4, 0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0xBD, 0x67, 0x20, 0xF0, 0x40, 0xC5, 0xDD, 0x67, -0x5C, 0xA6, 0xFF, 0x4A, 0x7D, 0x67, 0x5C, 0xC3, 0x9D, 0x67, 0x5C, 0xA4, 0x04, 0x2A, 0x01, 0x6A, -0xBD, 0x67, 0x58, 0xC5, 0x5E, 0x10, 0xDD, 0x67, 0x7D, 0xA6, 0x9D, 0x67, 0x5B, 0xA4, 0x63, 0xEA, -0x58, 0x67, 0x0C, 0x2A, 0x7D, 0x67, 0x5B, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x43, 0xC4, 0x00, 0x6A, -0xBD, 0x67, 0x5C, 0xC5, 0x00, 0x6A, 0xDD, 0x67, 0x58, 0xC6, 0x4B, 0x10, 0x01, 0x6A, 0x7D, 0x67, -0x58, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x5E, 0xC4, 0x3D, 0x10, 0x00, 0x6A, 0xBD, 0x67, 0x5F, 0xC5, -0x2D, 0x10, 0xDD, 0x67, 0x9D, 0xA6, 0x5D, 0x67, 0x20, 0xF0, 0x70, 0xA2, 0xBD, 0x67, 0x20, 0xF0, -0x41, 0xA5, 0x01, 0x6D, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0xCE, 0x2E, 0xDD, 0x67, 0x20, 0xF0, -0x43, 0xC6, 0x5D, 0x67, 0x7D, 0xA2, 0x9D, 0x67, 0x5B, 0xA4, 0x63, 0xEA, 0x58, 0x67, 0x06, 0x2A, -0x7D, 0x67, 0x5B, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x43, 0xC4, 0x17, 0x10, 0xBD, 0x67, 0x20, 0xF0, -0x43, 0xA5, 0xFF, 0x6E, 0xCE, 0xEA, 0x10, 0x2A, 0x7D, 0x67, 0x5D, 0xA3, 0xFF, 0x4A, 0x9D, 0x67, -0x5D, 0xC4, 0xBD, 0x67, 0x5F, 0xA5, 0x01, 0x4A, 0xDD, 0x67, 0x5F, 0xC6, 0x7D, 0x67, 0x5F, 0xA3, -0x54, 0x5A, 0x58, 0x67, 0xCE, 0x2A, 0x01, 0x10, 0x00, 0x65, 0x7D, 0x67, 0x5E, 0xA3, 0x01, 0x4A, -0x9D, 0x67, 0x5E, 0xC4, 0xBD, 0x67, 0x7E, 0xA5, 0xDD, 0x67, 0x5C, 0xA6, 0x43, 0xEB, 0x58, 0x67, -0xBC, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x58, 0xA3, 0x01, 0x6C, 0x8E, 0xEA, 0x09, 0x2A, 0x00, 0x6A, -0xBD, 0x67, 0x58, 0xC5, 0x05, 0x92, 0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, -0x05, 0x92, 0xDD, 0x67, 0x20, 0xF0, 0x63, 0xA6, 0x6A, 0xC2, 0x7D, 0x67, 0x20, 0xF0, 0x43, 0xA3, -0xFF, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x43, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x50, 0xA5, 0x03, 0x5A, -0x58, 0x67, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x48, 0x9A, 0x30, 0xF0, 0x20, 0x6B, -0x41, 0xF4, 0x68, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x81, 0x43, 0xFF, 0x6B, 0x8C, 0xEB, -0x60, 0xC2, 0x05, 0x92, 0x8C, 0xA2, 0x0F, 0x6B, 0x8C, 0xEB, 0x83, 0x67, 0x20, 0x6B, 0x8D, 0xEB, -0x6C, 0xC2, 0x5D, 0x67, 0x20, 0xF0, 0x90, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0xA3, 0xA3, 0xDD, 0x67, -0x78, 0xA6, 0xDD, 0x67, 0x20, 0xF0, 0x42, 0xA6, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0xB9, 0x2C, -0x0B, 0x97, 0x06, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFA, 0x63, 0x0B, 0x62, 0x64, 0x67, 0x45, 0x67, -0x9D, 0x67, 0x20, 0xF0, 0x70, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x54, 0xC5, 0xDD, 0x67, 0x20, 0xF0, -0x50, 0xA6, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, -0x49, 0xE3, 0x05, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0xE5, 0xF7, 0x00, 0x4A, 0x04, 0xD2, 0x7D, 0x67, -0x20, 0xF0, 0x50, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x44, 0x9A, -0x49, 0xE3, 0x40, 0xA2, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x60, 0xA5, -0x7F, 0x6A, 0x6C, 0xEA, 0xDD, 0x67, 0x5F, 0xC6, 0x5D, 0x67, 0x20, 0xF0, 0x60, 0xA2, 0x80, 0x6A, -0x4B, 0xEA, 0x6C, 0xEA, 0x7D, 0x67, 0x5C, 0xC3, 0x05, 0x92, 0x40, 0xA2, 0x9D, 0x67, 0x5A, 0xC4, -0x05, 0x92, 0x4E, 0xA2, 0x52, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, -0xBD, 0x67, 0x59, 0xC5, 0x05, 0x92, 0x4E, 0xA2, 0x4A, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, -0xFF, 0x6A, 0x6C, 0xEA, 0xDD, 0x67, 0x5B, 0xC6, 0x5D, 0x67, 0x7F, 0xA2, 0x30, 0xF0, 0x20, 0x6A, -0x64, 0x33, 0x80, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x60, 0xAA, 0x05, 0x92, 0x6C, 0xCA, 0x05, 0x92, -0x9D, 0x67, 0x20, 0xF0, 0x60, 0xA4, 0x6A, 0xC2, 0xBD, 0x67, 0x7B, 0xA5, 0x03, 0x6A, 0x4C, 0xEB, -0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x05, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0xAF, 0xA2, 0x04, 0x6C, -0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0x05, 0x92, 0x01, 0x6B, 0x6B, 0xEB, 0x65, 0xC2, -0x05, 0x92, 0x01, 0x6B, 0x6B, 0xEB, 0x66, 0xC2, 0x05, 0x92, 0x90, 0xA2, 0x7F, 0x6B, 0x8C, 0xEB, -0x70, 0xC2, 0x05, 0x92, 0x8F, 0xA2, 0x80, 0x6B, 0x6B, 0xEB, 0x8D, 0xEB, 0x6F, 0xC2, 0x05, 0x92, -0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, 0x05, 0x92, 0x00, 0x6B, 0x72, 0xC2, -0xDD, 0x67, 0x7F, 0xA6, 0x9D, 0x67, 0x5A, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0x57, 0x22, 0x5D, 0x67, -0x20, 0xF0, 0x70, 0xA2, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, -0x72, 0x30, 0xBD, 0x67, 0x58, 0xC5, 0xDD, 0x67, 0x58, 0xA6, 0xFF, 0x6B, 0x6E, 0xEA, 0x0F, 0x22, -0x9D, 0x67, 0x58, 0x84, 0x00, 0x52, 0x58, 0x67, 0x06, 0x22, 0x7D, 0x67, 0x58, 0xA3, 0x9D, 0x67, -0x20, 0xF0, 0x40, 0xC4, 0x6D, 0x10, 0xBD, 0x67, 0x58, 0xA5, 0xDD, 0x67, 0x5F, 0xC6, 0x00, 0x6A, -0x7D, 0x67, 0x5E, 0xC3, 0x2D, 0x10, 0xBD, 0x67, 0x9F, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x70, 0xA6, -0xBD, 0x67, 0x59, 0xA5, 0x00, 0x6D, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0xCE, 0x2E, 0xDD, 0x67, -0x20, 0xF0, 0x40, 0xC6, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0xFF, 0x6C, 0x8E, 0xEA, 0x4F, 0x2A, -0xBD, 0x67, 0x7F, 0xA5, 0xDD, 0x67, 0x5A, 0xA6, 0x43, 0xEB, 0x58, 0x67, 0x07, 0x2A, 0x7D, 0x67, -0x5A, 0xA3, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xC4, 0x00, 0x65, 0x42, 0x10, 0xBD, 0x67, 0x5F, 0xA5, -0x01, 0x4A, 0xDD, 0x67, 0x5F, 0xC6, 0x7D, 0x67, 0x5E, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x5E, 0xC4, -0xBD, 0x67, 0x5E, 0xA5, 0x54, 0x5A, 0x58, 0x67, 0xCE, 0x2A, 0x32, 0x10, 0x5D, 0x67, 0x7F, 0xA2, -0x9D, 0x67, 0x5A, 0xA4, 0x6E, 0xEA, 0x1D, 0x2A, 0x05, 0x92, 0x4F, 0xA2, 0x04, 0x6B, 0x6C, 0xEA, -0x0C, 0x22, 0xBD, 0x67, 0x5C, 0xA5, 0x09, 0x2A, 0xDD, 0x67, 0x7A, 0xA6, 0x80, 0x6A, 0x4B, 0xEA, -0x6D, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x1B, 0x10, 0x9D, 0x67, 0x7F, 0xA4, 0x30, 0xF0, -0x20, 0x6A, 0x64, 0x33, 0x80, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x60, 0xAA, 0x05, 0x92, 0x6C, 0xCA, -0x4E, 0x10, 0xBD, 0x67, 0x5A, 0xA5, 0xDD, 0x67, 0x20, 0xF0, 0x40, 0xC6, 0x01, 0x6A, 0x7D, 0x67, -0x20, 0xF0, 0x54, 0xC3, 0x05, 0x92, 0x9D, 0x67, 0x7A, 0xA4, 0x6A, 0xC2, 0x01, 0x10, 0x00, 0x65, -0xBD, 0x67, 0x20, 0xF0, 0x54, 0xA5, 0x01, 0x6E, 0xCE, 0xEA, 0x0A, 0x2A, 0x00, 0x6A, 0x7D, 0x67, -0x5D, 0xC3, 0x05, 0x92, 0x8F, 0xA2, 0x19, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6F, 0xC2, 0x03, 0x10, -0x01, 0x6A, 0x9D, 0x67, 0x5D, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x50, 0xA5, 0x03, 0x5A, 0x58, 0x67, -0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x4C, 0x9A, 0x30, 0xF0, 0x20, 0x6B, 0x41, 0xF4, -0x6C, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x81, 0x43, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, -0x05, 0x92, 0x8C, 0xA2, 0x0F, 0x6B, 0x8C, 0xEB, 0x83, 0x67, 0x10, 0x6B, 0x8D, 0xEB, 0x6C, 0xC2, -0x5D, 0x67, 0x20, 0xF0, 0x90, 0xA2, 0x7D, 0x67, 0x20, 0xF0, 0xA0, 0xA3, 0xDD, 0x67, 0x7D, 0xA6, -0xDD, 0x67, 0x5B, 0xA6, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0xB9, 0x2C, 0x00, 0x65, 0x0B, 0x97, -0x06, 0x63, 0x00, 0xEF, 0xFC, 0x63, 0x07, 0x62, 0x44, 0x67, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, -0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, -0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x04, 0x92, 0x40, 0xA2, 0xBD, 0x67, 0x54, 0xC5, -0x04, 0x92, 0x4A, 0xA2, 0x7D, 0x67, 0x57, 0xC3, 0x04, 0x92, 0x6F, 0xA2, 0x03, 0x6A, 0x4C, 0xEB, -0xFF, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x55, 0xC4, 0xBD, 0x67, 0x77, 0xA5, 0x7F, 0x6A, 0x6C, 0xEA, -0x7D, 0x67, 0x56, 0xC3, 0x9D, 0x67, 0x76, 0xA4, 0xBD, 0x67, 0x54, 0xA5, 0x63, 0xEA, 0x58, 0x67, -0x04, 0x22, 0x7D, 0x67, 0x54, 0xA3, 0x9D, 0x67, 0x57, 0xC4, 0x04, 0x92, 0x4A, 0xA2, 0x00, 0xF6, -0x40, 0x33, 0x00, 0xF6, 0x63, 0x33, 0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x33, -0x00, 0xF6, 0x63, 0x33, 0xBD, 0x67, 0x57, 0x85, 0x6D, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, -0x43, 0x32, 0x7D, 0x67, 0x57, 0xC3, 0xBD, 0x67, 0x20, 0xF0, 0x80, 0xA5, 0x5D, 0x67, 0x77, 0xA2, -0xBD, 0x67, 0x55, 0xA5, 0xA3, 0x67, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0xB9, 0x2C, 0x07, 0x97, -0x04, 0x63, 0x00, 0xEF, 0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, 0x7D, 0x67, 0x48, 0xA3, -0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, -0x00, 0xD2, 0x00, 0x92, 0x90, 0xA2, 0x7F, 0x6B, 0x8C, 0xEB, 0x70, 0xC2, 0x00, 0x92, 0x8F, 0xA2, -0x7F, 0x6B, 0x8C, 0xEB, 0x6F, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xFF, 0x63, 0x02, 0xD4, -0x00, 0x6A, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xF9, 0x63, 0x0D, 0x62, 0x44, 0x67, 0x7D, 0x67, -0x20, 0xF0, 0x58, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x58, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, -0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x04, 0xD2, 0x04, 0x92, 0x44, 0xA2, -0x7D, 0x67, 0x20, 0xF0, 0x46, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x46, 0xA4, 0x0F, 0x5A, 0x78, 0x67, -0x7B, 0x23, 0x48, 0x33, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF1, 0x00, 0x4A, 0x49, 0xE3, 0x40, 0x9A, -0x00, 0xEA, 0x04, 0x92, 0x1B, 0x6B, 0x67, 0xC2, 0x05, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, -0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x03, 0x6B, 0x8D, 0xEB, -0x6B, 0xC2, 0x6C, 0x10, 0x04, 0x92, 0x3D, 0x6B, 0x67, 0xC2, 0x05, 0x6A, 0x9D, 0x67, 0x20, 0xF0, -0x44, 0xC4, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x02, 0x6B, -0x8D, 0xEB, 0x6B, 0xC2, 0x5B, 0x10, 0x04, 0x92, 0x13, 0x6B, 0x67, 0xC2, 0x04, 0x6A, 0x7D, 0x67, -0x20, 0xF0, 0x44, 0xC3, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, -0x01, 0x6B, 0x8D, 0xEB, 0x6B, 0xC2, 0x04, 0x92, 0x33, 0x6B, 0x67, 0xC2, 0x04, 0x6A, 0x9D, 0x67, -0x20, 0xF0, 0x44, 0xC4, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, -0x01, 0x6B, 0x8D, 0xEB, 0x6B, 0xC2, 0x3A, 0x10, 0x04, 0x92, 0x0B, 0x6B, 0x67, 0xC2, 0x03, 0x6A, -0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, -0x6B, 0xC2, 0x2C, 0x10, 0x04, 0x92, 0x47, 0x6B, 0x67, 0xC2, 0x05, 0x6A, 0x9D, 0x67, 0x20, 0xF0, -0x44, 0xC4, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x03, 0x6B, -0x8D, 0xEB, 0x6B, 0xC2, 0x1B, 0x10, 0x04, 0x92, 0x23, 0x6B, 0x67, 0xC2, 0x05, 0x6A, 0x7D, 0x67, -0x20, 0xF0, 0x44, 0xC3, 0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, -0x03, 0x6B, 0x8D, 0xEB, 0x6B, 0xC2, 0x0A, 0x10, 0x03, 0x6A, 0x9D, 0x67, 0x20, 0xF0, 0x44, 0xC4, -0x04, 0x92, 0x8B, 0xA2, 0x08, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6B, 0xC2, 0x00, 0x6A, 0x7D, 0x67, -0x20, 0xF0, 0x4B, 0xC3, 0x5C, 0x10, 0x9D, 0x67, 0x20, 0xF0, 0x58, 0xA4, 0x4C, 0x32, 0x62, 0x67, -0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xA4, 0x48, 0x32, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, -0x5C, 0x9A, 0x49, 0xE3, 0x60, 0x9A, 0x5D, 0x67, 0x20, 0xF0, 0xA6, 0xA2, 0x5D, 0x67, 0x20, 0xF0, -0x8B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xA4, 0x35, 0x91, 0xE5, 0x88, 0x34, 0xE0, 0xF7, 0x18, 0x4A, -0x49, 0xE4, 0x40, 0x9A, 0x6C, 0xEA, 0x05, 0xD2, 0x04, 0x92, 0x4E, 0xA2, 0x03, 0x6B, 0x6C, 0xEA, -0x02, 0x6B, 0x6E, 0xEA, 0x0B, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xA4, 0x01, 0x6B, 0x6E, 0xEA, -0x05, 0x2A, 0x05, 0x93, 0x41, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0x05, 0xD2, 0x9D, 0x67, 0x20, 0xF0, -0x58, 0xA4, 0x4C, 0x32, 0x62, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xA4, 0x48, 0x32, 0x4D, 0xE3, -0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x05, 0x93, 0x60, 0xDA, 0x7D, 0x67, -0x20, 0xF0, 0x58, 0xA3, 0x4C, 0x32, 0x62, 0x67, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xA4, 0x48, 0x32, -0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, 0x5C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x05, 0xD2, -0x7D, 0x67, 0x20, 0xF0, 0x4B, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xC4, 0x7D, 0x67, -0x20, 0xF0, 0x4B, 0xA3, 0x02, 0x5A, 0x58, 0x67, 0x9E, 0x2A, 0x04, 0x92, 0x4E, 0xA2, 0x52, 0x32, -0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x20, 0xF0, 0x4A, 0xC3, -0x9D, 0x67, 0x20, 0xF0, 0x58, 0xA4, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF3, -0x5C, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x08, 0xD2, 0x7D, 0x67, 0x20, 0xF0, 0x58, 0xA3, 0x4C, 0x32, -0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x40, 0x9A, 0x49, 0xE3, 0x40, 0x9A, 0x07, 0xD2, -0x00, 0x6A, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xC4, 0x07, 0x92, 0x07, 0x22, 0x20, 0x6A, 0x7D, 0x67, -0x20, 0xF0, 0x45, 0xC3, 0x07, 0x92, 0x06, 0xD2, 0x06, 0x10, 0x00, 0x6A, 0x9D, 0x67, 0x20, 0xF0, -0x45, 0xC4, 0x08, 0x92, 0x06, 0xD2, 0x1F, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x4B, 0xC3, 0x2E, 0x10, -0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xA4, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x62, 0x67, -0x06, 0x92, 0x6C, 0xEA, 0x1C, 0x22, 0x5D, 0x67, 0x20, 0xF0, 0x6B, 0xA2, 0x9D, 0x67, 0x20, 0xF0, -0x45, 0xA4, 0x49, 0xE3, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x4A, 0xA4, -0x1C, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x0C, 0x5A, 0x58, 0x67, 0x18, 0x2A, 0x7D, 0x67, -0x20, 0xF0, 0x48, 0xA3, 0x20, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xC4, 0x11, 0x10, 0x7D, 0x67, -0x20, 0xF0, 0x4B, 0xA3, 0xFF, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xC4, 0x7D, 0x67, 0x20, 0xF0, -0x4B, 0xA3, 0x20, 0x5A, 0x58, 0x67, 0xCC, 0x2A, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, -0x00, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x47, 0xC3, 0x08, 0x92, 0x07, 0x22, 0x00, 0x6A, 0x9D, 0x67, -0x20, 0xF0, 0x45, 0xC4, 0x08, 0x92, 0x06, 0xD2, 0x06, 0x10, 0x20, 0x6A, 0x7D, 0x67, 0x20, 0xF0, -0x45, 0xC3, 0x07, 0x92, 0x06, 0xD2, 0x00, 0x6A, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xC4, 0x2E, 0x10, -0x7D, 0x67, 0x20, 0xF0, 0x4B, 0xA3, 0x01, 0x6B, 0x83, 0x67, 0x84, 0xEA, 0x44, 0x67, 0x62, 0x67, -0x06, 0x92, 0x6C, 0xEA, 0x1C, 0x22, 0x5D, 0x67, 0x20, 0xF0, 0x6B, 0xA2, 0x9D, 0x67, 0x20, 0xF0, -0x45, 0xA4, 0x49, 0xE3, 0x7D, 0x67, 0x20, 0xF0, 0x47, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x4A, 0xA4, -0x1C, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x47, 0xA3, 0x0C, 0x5A, 0x58, 0x67, 0x18, 0x2A, 0x7D, 0x67, -0x20, 0xF0, 0x47, 0xA3, 0x20, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x47, 0xC4, 0x11, 0x10, 0x7D, 0x67, -0x20, 0xF0, 0x4B, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x20, 0xF0, 0x4B, 0xC4, 0x7D, 0x67, 0x20, 0xF0, -0x4B, 0xA3, 0x20, 0x5A, 0x58, 0x67, 0xCC, 0x2A, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, -0x04, 0x92, 0x9D, 0x67, 0x20, 0xF0, 0x68, 0xA4, 0x60, 0xC2, 0x04, 0x92, 0x9D, 0x67, 0x20, 0xF0, -0x67, 0xA4, 0x61, 0xC2, 0x7D, 0x67, 0x20, 0xF0, 0x58, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, -0x20, 0x6A, 0x01, 0xF4, 0x44, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x7F, 0x6A, -0x6C, 0xEA, 0x9D, 0x67, 0x20, 0xF0, 0x49, 0xC4, 0x5D, 0x67, 0x20, 0xF0, 0x69, 0xA2, 0x9D, 0x67, -0x20, 0xF0, 0x48, 0xA4, 0x63, 0xEA, 0x58, 0x67, 0x07, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, -0x9D, 0x67, 0x20, 0xF0, 0x49, 0xC4, 0x0F, 0x10, 0x5D, 0x67, 0x20, 0xF0, 0x69, 0xA2, 0x9D, 0x67, -0x20, 0xF0, 0x47, 0xA4, 0x43, 0xEB, 0x58, 0x67, 0x06, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x47, 0xA3, -0x9D, 0x67, 0x20, 0xF0, 0x49, 0xC4, 0x5D, 0x67, 0x20, 0xF0, 0x98, 0xA2, 0x5D, 0x67, 0x20, 0xF0, -0x69, 0xA2, 0x04, 0x92, 0x4E, 0xA2, 0x4A, 0x32, 0xA2, 0x67, 0x03, 0x6A, 0x4C, 0xED, 0xFF, 0x6A, -0xAC, 0xEA, 0xA3, 0x67, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0xB9, 0x2C, 0x04, 0x92, 0x9D, 0x67, -0x20, 0xF0, 0x64, 0xA4, 0x62, 0xC2, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x4A, 0x5A, 0x58, 0x67, -0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x48, 0x6B, -0x8D, 0xEB, 0x70, 0xC2, 0x86, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x40, 0x5A, 0x58, 0x67, -0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x40, 0x6B, -0x8D, 0xEB, 0x70, 0xC2, 0x76, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x36, 0x5A, 0x58, 0x67, -0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x38, 0x6B, -0x8D, 0xEB, 0x70, 0xC2, 0x66, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x2C, 0x5A, 0x58, 0x67, -0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x30, 0x6B, -0x8D, 0xEB, 0x70, 0xC2, 0x56, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x24, 0x5A, 0x58, 0x67, -0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x28, 0x6B, -0x8D, 0xEB, 0x70, 0xC2, 0x46, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x1C, 0x5A, 0x58, 0x67, -0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x20, 0x6B, -0x8D, 0xEB, 0x70, 0xC2, 0x36, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x14, 0x5A, 0x58, 0x67, -0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x18, 0x6B, -0x8D, 0xEB, 0x70, 0xC2, 0x26, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x0C, 0x5A, 0x58, 0x67, -0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x10, 0x6B, -0x8D, 0xEB, 0x70, 0xC2, 0x16, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0x04, 0x5A, 0x58, 0x67, -0x0A, 0x2A, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x83, 0x67, 0x08, 0x6B, -0x8D, 0xEB, 0x70, 0xC2, 0x06, 0x10, 0x04, 0x92, 0x90, 0xA2, 0x79, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, -0x70, 0xC2, 0x00, 0x18, 0xBA, 0x28, 0x0D, 0x97, 0x07, 0x63, 0x00, 0xEF, 0x64, 0x67, 0x45, 0x67, -0x9D, 0x67, 0x60, 0xC4, 0x7D, 0x67, 0x44, 0xC3, 0x9D, 0x67, 0x44, 0xA4, 0x20, 0xE8, 0x00, 0x65, -0xFD, 0x63, 0x06, 0xD4, 0x65, 0x67, 0x46, 0x67, 0x9D, 0x67, 0x7C, 0xC4, 0x7D, 0x67, 0x20, 0xF0, -0x40, 0xC3, 0x9D, 0x67, 0x5C, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, -0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x00, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0xC6, 0xF4, -0x08, 0x4B, 0x9D, 0x67, 0x5C, 0xA4, 0x48, 0x32, 0x48, 0x34, 0x89, 0xE2, 0x49, 0xE3, 0x01, 0xD2, -0x30, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x40, 0xF0, 0x1C, 0x4B, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, -0x44, 0x32, 0x48, 0x34, 0x4B, 0xE4, 0x49, 0xE3, 0x02, 0xD2, 0x00, 0x92, 0x4C, 0xAA, 0x05, 0xD2, -0x00, 0x6A, 0x7D, 0x67, 0x4C, 0xC3, 0x15, 0x10, 0x9D, 0x67, 0x4C, 0xA4, 0x48, 0x32, 0x01, 0x93, -0x49, 0xE3, 0x80, 0x9A, 0x7D, 0x67, 0x4C, 0xA3, 0x02, 0x93, 0x49, 0xE3, 0x40, 0xA2, 0x58, 0xEC, -0x12, 0xEB, 0x05, 0x92, 0x69, 0xE2, 0x05, 0xD2, 0x7D, 0x67, 0x4C, 0xA3, 0x01, 0x4A, 0x9D, 0x67, -0x4C, 0xC4, 0x7D, 0x67, 0x4C, 0xA3, 0x05, 0x5A, 0x58, 0x67, 0xE6, 0x2A, 0x02, 0x92, 0x05, 0x4A, -0x40, 0xA2, 0x62, 0x67, 0x06, 0x92, 0x58, 0xEB, 0x12, 0xEA, 0x04, 0xD2, 0x05, 0x93, 0x04, 0x92, -0x63, 0xEA, 0x58, 0x67, 0x04, 0x22, 0x05, 0x93, 0x04, 0x92, 0x4B, 0xE3, 0x01, 0x10, 0x00, 0x6A, -0x05, 0xD2, 0x05, 0x93, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x00, 0x92, 0x6C, 0xCA, 0x05, 0x92, -0x03, 0x63, 0x20, 0xE8, 0xFF, 0x63, 0x30, 0xF0, 0x20, 0x6A, 0xE5, 0xF7, 0x00, 0x4A, 0x00, 0xD2, -0x30, 0xF0, 0x20, 0x6A, 0xC5, 0xF7, 0x17, 0x4A, 0x01, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, -0x50, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x10, 0x6A, 0x6C, 0xEA, 0x53, 0x33, -0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, -0x01, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0xA4, 0xA2, 0x02, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, -0x64, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x50, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, -0x62, 0x67, 0x20, 0x6A, 0x6C, 0xEA, 0x57, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, -0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x01, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0x68, 0x33, -0xA4, 0xA2, 0x05, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x64, 0xC2, 0x30, 0xF0, 0x20, 0x6A, -0x41, 0xF4, 0x50, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x40, 0x6A, 0x6C, 0xEA, -0x5B, 0x33, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, -0x4C, 0xEC, 0x01, 0x92, 0x01, 0x6B, 0x8C, 0xEB, 0x64, 0x33, 0xA4, 0xA2, 0x03, 0x6C, 0x8B, 0xEC, -0xAC, 0xEC, 0x8D, 0xEB, 0x64, 0xC2, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0xF3, 0x63, 0x19, 0x62, -0x30, 0xF0, 0x20, 0x6A, 0xC5, 0xF7, 0x17, 0x4A, 0x04, 0xD2, 0x30, 0xF0, 0x20, 0x6A, 0xE5, 0xF7, -0x00, 0x4A, 0x05, 0xD2, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xC3, 0xC0, 0xF5, 0x03, 0x10, -0x9D, 0x67, 0x40, 0xF0, 0x4B, 0xA4, 0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, -0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, 0x06, 0xD2, 0xBD, 0x67, 0x40, 0xF0, 0x4B, 0xA5, 0x82, 0x67, -0x00, 0x18, 0x6A, 0x0B, 0xA0, 0xF5, 0x03, 0x22, 0x06, 0x92, 0x4E, 0xA2, 0x80, 0x6B, 0x6C, 0xEA, -0x80, 0xF5, 0x1F, 0x2A, 0x5D, 0x67, 0x40, 0xF0, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF7, -0x0C, 0x4B, 0x68, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x40, 0x9A, 0x0E, 0xD2, 0x7D, 0x67, -0x40, 0xF0, 0x4B, 0xA3, 0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x44, 0x9A, -0x49, 0xE3, 0x40, 0xA2, 0x9D, 0x67, 0x40, 0xF0, 0x4A, 0xC4, 0xBD, 0x67, 0x40, 0xF0, 0x6A, 0xA5, -0x7F, 0x6A, 0x6C, 0xEA, 0x7D, 0x67, 0x40, 0xF0, 0x49, 0xC3, 0x9D, 0x67, 0x40, 0xF0, 0x6A, 0xA4, -0x80, 0x6A, 0x4B, 0xEA, 0x6C, 0xEA, 0xBD, 0x67, 0x40, 0xF0, 0x48, 0xC5, 0x06, 0x92, 0x40, 0xA2, -0x7D, 0x67, 0x20, 0xF0, 0x47, 0xC3, 0x06, 0x92, 0x4E, 0xA2, 0x4A, 0x32, 0x62, 0x67, 0x03, 0x6A, -0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x20, 0xF0, 0x46, 0xC4, 0x06, 0x92, 0x4F, 0xA2, -0x40, 0x6B, 0x6C, 0xEA, 0x00, 0xF4, 0x16, 0x2A, 0x0E, 0x92, 0x65, 0x5A, 0x58, 0x67, 0x1C, 0x2A, -0x06, 0x92, 0x52, 0xA2, 0x19, 0x22, 0x06, 0x92, 0x52, 0xA2, 0x6F, 0x42, 0xFF, 0x6A, 0x4C, 0xEB, -0x06, 0x92, 0x72, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x21, 0xF1, 0x1C, 0x4A, 0x82, 0x67, 0x00, 0x18, -0xB6, 0x23, 0x06, 0x92, 0x52, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0x41, 0xF1, 0x08, 0x4B, 0x83, 0x67, -0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0xF9, 0x13, 0x06, 0x92, 0x00, 0x6B, 0x72, 0xC2, 0x7D, 0x67, -0x40, 0xF0, 0x4B, 0xA3, 0x48, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0xC6, 0xF4, -0x08, 0x4A, 0x49, 0xE3, 0x13, 0x03, 0x83, 0x67, 0xA2, 0x67, 0x14, 0x6E, 0x00, 0x18, 0x30, 0x04, -0x9D, 0x67, 0x40, 0xF0, 0x6B, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, -0x23, 0xF7, 0x50, 0xA2, 0xBD, 0x67, 0x5A, 0xCD, 0x14, 0x93, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, -0x15, 0x94, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x4D, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, -0x16, 0x94, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x4D, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, -0x17, 0x94, 0xFF, 0xF7, 0x1F, 0x6A, 0x8C, 0xEA, 0x49, 0xE3, 0x7D, 0x67, 0x58, 0xCB, 0x13, 0x93, -0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x9D, 0x67, 0x58, 0xAC, 0x49, 0xE3, 0xBD, 0x67, 0x59, 0xCD, -0x14, 0x93, 0x15, 0x92, 0x44, 0x32, 0x4D, 0xE3, 0x16, 0x92, 0x44, 0x34, 0x16, 0x92, 0x49, 0xE4, -0x4D, 0xE3, 0x17, 0x92, 0x48, 0x32, 0x49, 0xE3, 0x0B, 0xD2, 0x06, 0x92, 0x5C, 0xA2, 0x05, 0x5A, -0x58, 0x67, 0xE0, 0xF4, 0x00, 0x22, 0x5D, 0x67, 0x40, 0xF0, 0x69, 0xA2, 0x9D, 0x67, 0x20, 0xF0, -0x47, 0xA4, 0x63, 0xEA, 0x58, 0x67, 0x19, 0x22, 0x7D, 0x67, 0x20, 0xF0, 0x47, 0xA3, 0x9D, 0x67, -0x40, 0xF0, 0x49, 0xC4, 0xBD, 0x67, 0x40, 0xF0, 0x48, 0xA5, 0x09, 0x22, 0x5D, 0x67, 0x20, 0xF0, -0x67, 0xA2, 0x80, 0x6A, 0x4B, 0xEA, 0x4D, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x03, 0x10, 0x7D, 0x67, -0x20, 0xF0, 0x47, 0xA3, 0x9D, 0x67, 0x40, 0xF0, 0x4A, 0xC4, 0x06, 0x92, 0x7A, 0xA2, 0xBD, 0x67, -0x40, 0xF0, 0x89, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF3, 0x08, 0x4A, 0x49, 0xE4, 0x40, 0xA2, -0x43, 0xEB, 0x58, 0x67, 0x0E, 0x2A, 0x5D, 0x67, 0x40, 0xF0, 0x69, 0xA2, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0xA3, 0xF1, 0x5C, 0xA2, 0x6E, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, -0x0A, 0x10, 0x9D, 0x67, 0x40, 0xF0, 0x69, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x49, 0xE3, 0xA3, 0xF1, 0x5C, 0xA2, 0xBD, 0x67, 0x20, 0xF0, 0x48, 0xC5, 0x7D, 0x67, 0x40, 0xF0, -0x48, 0xA3, 0x07, 0x22, 0x9D, 0x67, 0x20, 0xF0, 0x48, 0xA4, 0x02, 0x4A, 0xBD, 0x67, 0x20, 0xF0, -0x48, 0xC5, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xA3, 0xFF, 0x6B, 0x4C, 0xEB, 0x1C, 0x5B, 0x78, 0x67, -0x01, 0x2B, 0x1B, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x48, 0xC3, 0x9D, 0x67, 0x40, 0xF0, 0x69, 0xA4, -0xBD, 0x67, 0x20, 0xF0, 0x48, 0xA5, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0x73, 0x34, 0x7D, 0x67, -0x20, 0xF0, 0x48, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x62, 0x67, 0x40, 0xF0, 0x1C, 0x4B, 0x9D, 0x67, -0x20, 0xF0, 0x48, 0xA4, 0x44, 0x32, 0x48, 0x34, 0x4B, 0xE4, 0x49, 0xE3, 0x11, 0xD2, 0xBD, 0x67, -0x40, 0xF0, 0x8B, 0xA5, 0x7D, 0x67, 0x5A, 0xAB, 0x13, 0x05, 0x0E, 0x93, 0xC3, 0x67, 0xE2, 0x67, -0x00, 0x18, 0x64, 0x2E, 0x9D, 0x67, 0x20, 0xF0, 0x45, 0xC4, 0x06, 0x92, 0x56, 0xA2, 0x46, 0x33, -0xFF, 0x6A, 0x4C, 0xEB, 0xBD, 0x67, 0x20, 0xF0, 0x45, 0xA5, 0x46, 0x34, 0xFF, 0x6A, 0x8C, 0xEA, -0x4D, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x06, 0x92, 0x76, 0xC2, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, -0x03, 0x5A, 0x58, 0x67, 0x07, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x54, 0x9A, 0x06, 0x93, -0x76, 0xA3, 0x60, 0xC2, 0x7D, 0x67, 0x5A, 0xAB, 0x03, 0x5A, 0x58, 0x67, 0x09, 0x2A, 0x7D, 0x67, -0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, 0x01, 0x6E, 0x00, 0x18, 0x5B, 0x31, 0xED, 0x12, -0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x50, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, -0x20, 0x6A, 0x6C, 0xEA, 0x24, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF1, 0x14, 0x4A, 0x82, 0x67, -0x00, 0x18, 0xB6, 0x23, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x58, 0x9A, 0x40, 0xA2, 0x9D, 0x67, -0x40, 0xF0, 0x4A, 0xC4, 0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x5C, 0x9A, 0x40, 0xA2, 0xBD, 0x67, -0x5C, 0xC5, 0x5D, 0x67, 0x40, 0xF0, 0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x6A, 0xA5, 0xBD, 0x67, -0x5C, 0xA5, 0xA3, 0x67, 0x00, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0xB9, 0x2C, 0xBE, 0x12, 0x0E, 0x92, -0x19, 0x5A, 0x58, 0x67, 0x1F, 0x22, 0x0E, 0x92, 0x1D, 0x22, 0x06, 0x92, 0x4B, 0xA2, 0x5A, 0x33, -0xFF, 0x6A, 0x6C, 0xEA, 0x03, 0x52, 0x58, 0x67, 0x15, 0x22, 0x06, 0x92, 0x4B, 0xA2, 0x5A, 0x33, -0xFF, 0x6A, 0x6C, 0xEA, 0x61, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, -0xFF, 0x6A, 0x4C, 0xEB, 0x06, 0x92, 0x78, 0x33, 0xAB, 0xA2, 0x3F, 0x6C, 0xAC, 0xEC, 0x8D, 0xEB, -0x6B, 0xC2, 0x05, 0x10, 0x06, 0x92, 0x8B, 0xA2, 0x3F, 0x6B, 0x8C, 0xEB, 0x6B, 0xC2, 0x06, 0x92, -0x4B, 0xA2, 0xC0, 0x6B, 0x6C, 0xEA, 0x80, 0x6B, 0x6E, 0xEA, 0xE0, 0xF0, 0x10, 0x2A, 0x30, 0xF0, -0x20, 0x6A, 0x41, 0xF1, 0x1C, 0x4A, 0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x9D, 0x67, 0x40, 0xF0, -0x4B, 0xA4, 0x03, 0x5A, 0x58, 0x67, 0x0F, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x40, 0x9A, -0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF4, 0x60, 0x9B, 0x80, 0xA3, 0xFF, 0x6B, 0x8C, 0xEB, 0x81, 0x43, -0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, 0x17, 0x93, 0x16, 0x92, 0x4D, 0xE3, 0x15, 0x92, 0x4D, 0xE3, -0x14, 0x92, 0x4D, 0xE3, 0x0E, 0x92, 0x4A, 0x32, 0x63, 0xEA, 0x58, 0x67, 0x02, 0x2A, 0x17, 0x92, -0x33, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF1, 0x0C, 0x4A, 0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, -0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x44, 0x9A, 0x0E, 0x94, 0xFF, 0x6B, 0x8C, 0xEB, 0x60, 0xC2, -0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x48, 0x9A, 0x17, 0x94, 0xFF, 0x6B, 0x6C, 0xEC, 0x16, 0x95, -0xFF, 0x6B, 0xAC, 0xEB, 0x71, 0xE4, 0xFF, 0x6B, 0x6C, 0xEC, 0x15, 0x95, 0xFF, 0x6B, 0xAC, 0xEB, -0x71, 0xE4, 0xFF, 0x6B, 0x6C, 0xEC, 0x14, 0x95, 0xFF, 0x6B, 0xAC, 0xEB, 0x71, 0xE4, 0xFF, 0x6B, -0x8C, 0xEB, 0x60, 0xC2, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, 0x01, 0x6E, -0x00, 0x18, 0x5B, 0x31, 0x00, 0x65, 0x31, 0x12, 0x9D, 0x67, 0x5A, 0xAC, 0x10, 0x22, 0x30, 0xF0, -0x20, 0x6A, 0x61, 0xF1, 0x18, 0x4A, 0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, 0xBD, 0x67, 0x40, 0xF0, -0x4B, 0xA5, 0x82, 0x67, 0x01, 0x6D, 0x01, 0x6E, 0x00, 0x18, 0x5B, 0x31, 0x1E, 0x12, 0x13, 0x93, -0x0E, 0x92, 0x43, 0xEB, 0x58, 0x67, 0x00, 0xF2, 0x17, 0x2A, 0x01, 0x6A, 0x7D, 0x67, 0x20, 0xF0, -0x44, 0xC3, 0x06, 0x92, 0x6B, 0xA2, 0x07, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x02, 0x52, -0x58, 0x67, 0x51, 0x2A, 0x06, 0x92, 0x47, 0xA2, 0x9D, 0x67, 0x40, 0xF0, 0x69, 0xA4, 0x43, 0xEB, -0x58, 0x67, 0x16, 0x2A, 0x06, 0x92, 0x47, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0x81, 0xF1, 0x04, 0x4B, -0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF1, 0x14, 0x4A, -0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x00, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, 0x33, 0x10, -0x06, 0x92, 0x5A, 0xA2, 0x32, 0x5A, 0x58, 0x67, 0x15, 0x22, 0x5D, 0x67, 0x40, 0xF0, 0x69, 0xA2, -0x06, 0x92, 0x47, 0xA2, 0xFE, 0x4A, 0x42, 0xEB, 0x58, 0x67, 0x0C, 0x2A, 0x30, 0xF0, 0x20, 0x6A, -0xA1, 0xF1, 0x04, 0x4A, 0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x00, 0x6A, 0x7D, 0x67, 0x20, 0xF0, -0x44, 0xC3, 0x19, 0x10, 0x06, 0x92, 0x5A, 0xA2, 0x28, 0x5A, 0x58, 0x67, 0x14, 0x22, 0x5D, 0x67, -0x40, 0xF0, 0x69, 0xA2, 0x06, 0x92, 0x47, 0xA2, 0xFC, 0x4A, 0x42, 0xEB, 0x58, 0x67, 0x0B, 0x2A, -0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF1, 0x14, 0x4A, 0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x00, 0x6A, -0x7D, 0x67, 0x20, 0xF0, 0x44, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x44, 0xA4, 0x01, 0x6D, 0xAE, 0xEA, -0x0E, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF1, 0x04, 0x4A, 0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, -0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, 0x00, 0x18, 0x2A, 0x32, 0x30, 0xF0, -0x20, 0x6A, 0xC1, 0xF1, 0x0C, 0x4A, 0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x9E, 0x11, 0x06, 0x92, -0x4F, 0xA2, 0x18, 0x6B, 0x6C, 0xEA, 0x10, 0x6C, 0x8E, 0xEA, 0x2F, 0x2A, 0x06, 0x92, 0x45, 0xA2, -0xBD, 0x67, 0x40, 0xF0, 0x4A, 0xC5, 0x06, 0x92, 0x4F, 0xA2, 0x4E, 0x32, 0x62, 0x67, 0x03, 0x6A, -0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x6F, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, -0x4C, 0xEB, 0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x06, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0x6C, 0x33, -0xAF, 0xA2, 0x19, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0x5D, 0x67, 0x40, 0xF0, -0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x6A, 0xA5, 0xBD, 0x67, 0x20, 0xF0, 0x46, 0xA5, 0xA3, 0x67, -0x01, 0x6E, 0xE2, 0x67, 0x00, 0x18, 0xB9, 0x2C, 0x68, 0x11, 0x06, 0x92, 0x4F, 0xA2, 0x18, 0x6B, -0x6C, 0xEA, 0x08, 0x6B, 0x6E, 0xEA, 0x2F, 0x2A, 0x06, 0x92, 0x46, 0xA2, 0x9D, 0x67, 0x40, 0xF0, -0x4A, 0xC4, 0x06, 0x92, 0x4F, 0xA2, 0x4E, 0x32, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, -0x6C, 0xEA, 0x6F, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x03, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, -0x83, 0x67, 0x4C, 0xEC, 0x06, 0x92, 0x03, 0x6B, 0x8C, 0xEB, 0x6C, 0x33, 0xAF, 0xA2, 0x19, 0x6C, -0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6F, 0xC2, 0xBD, 0x67, 0x40, 0xF0, 0x8B, 0xA5, 0x5D, 0x67, -0x40, 0xF0, 0x6A, 0xA2, 0xBD, 0x67, 0x20, 0xF0, 0x46, 0xA5, 0xA3, 0x67, 0x01, 0x6E, 0xE2, 0x67, -0x00, 0x18, 0xB9, 0x2C, 0x32, 0x11, 0x06, 0x92, 0x4C, 0xAA, 0x0F, 0xD2, 0x00, 0x6A, 0x7D, 0x67, -0x5D, 0xC3, 0x17, 0x10, 0x9D, 0x67, 0x5D, 0xA4, 0x48, 0x32, 0x04, 0x03, 0x49, 0xE3, 0x8F, 0x9A, -0xBD, 0x67, 0x5D, 0xA5, 0x11, 0x93, 0x49, 0xE3, 0x40, 0xA2, 0x58, 0xEC, 0x12, 0xEA, 0x10, 0xD2, -0x0F, 0x93, 0x10, 0x92, 0x49, 0xE3, 0x0F, 0xD2, 0x7D, 0x67, 0x5D, 0xA3, 0x01, 0x4A, 0x9D, 0x67, -0x5D, 0xC4, 0xBD, 0x67, 0x5D, 0xA5, 0x05, 0x5A, 0x58, 0x67, 0xE4, 0x2A, 0x11, 0x92, 0x05, 0x4A, -0x40, 0xA2, 0x62, 0x67, 0x0E, 0x92, 0x58, 0xEB, 0x12, 0xEA, 0x08, 0xD2, 0x0F, 0x93, 0x08, 0x92, -0x63, 0xEA, 0x58, 0x67, 0x05, 0x22, 0x0F, 0x93, 0x08, 0x92, 0x4B, 0xE3, 0x0F, 0xD2, 0x02, 0x10, -0x00, 0x6A, 0x0F, 0xD2, 0x0F, 0x93, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x06, 0x92, 0x6C, 0xCA, -0x30, 0xF0, 0x20, 0x6A, 0x41, 0xF4, 0x50, 0x9A, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, -0x10, 0x6A, 0x6C, 0xEA, 0x7B, 0x22, 0x06, 0x92, 0x56, 0xA2, 0x17, 0x5A, 0x58, 0x67, 0x0F, 0x2A, -0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, 0x01, 0x6E, 0x00, 0x18, 0x5B, 0x31, -0x06, 0x92, 0x8B, 0xA2, 0x39, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6B, 0xC2, 0xD6, 0x10, 0x0E, 0x92, -0x65, 0x5A, 0x58, 0x67, 0x00, 0xF2, 0x17, 0x2A, 0x06, 0x92, 0x76, 0xA2, 0x5D, 0x67, 0x40, 0xF0, -0x89, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x63, 0xF2, 0x44, 0xA2, -0x63, 0xEA, 0x58, 0x67, 0x0F, 0x22, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, -0x00, 0x6E, 0x00, 0x18, 0x5B, 0x31, 0x06, 0x92, 0x8B, 0xA2, 0x39, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, -0x6B, 0xC2, 0xB3, 0x10, 0x06, 0x92, 0x76, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x89, 0xA5, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x03, 0xF2, 0x50, 0xA2, 0x43, 0xEB, 0x58, 0x67, -0xA0, 0xF0, 0x03, 0x22, 0x06, 0x92, 0x4B, 0xA2, 0x4E, 0x32, 0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, -0xFF, 0x6A, 0x6C, 0xEA, 0x61, 0x42, 0xFF, 0x6A, 0x6C, 0xEA, 0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, -0xFF, 0x6A, 0x83, 0x67, 0x4C, 0xEC, 0x06, 0x92, 0x07, 0x6B, 0x8C, 0xEB, 0x6C, 0x33, 0xAB, 0xA2, -0x39, 0x6C, 0x8B, 0xEC, 0xAC, 0xEC, 0x8D, 0xEB, 0x6B, 0xC2, 0x06, 0x92, 0x4B, 0xA2, 0x4E, 0x32, -0x62, 0x67, 0x07, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x05, 0x52, 0x58, 0x67, 0x7D, 0x2A, -0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x00, 0x6D, 0x00, 0x18, 0x2A, 0x32, 0x06, 0x92, -0x8B, 0xA2, 0x39, 0x6B, 0x6B, 0xEB, 0x8C, 0xEB, 0x6B, 0xC2, 0x6F, 0x10, 0x9D, 0x67, 0x40, 0xF0, -0x69, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0x64, 0x33, 0x80, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x40, 0xAA, -0x62, 0x67, 0x0F, 0x92, 0x43, 0xEB, 0x58, 0x67, 0x0F, 0x22, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, -0x82, 0x67, 0x00, 0x6D, 0x00, 0x18, 0x2A, 0x32, 0x30, 0xF0, 0x20, 0x6A, 0xC1, 0xF1, 0x18, 0x4A, -0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x51, 0x10, 0x9D, 0x67, 0x40, 0xF0, 0x69, 0xA4, 0x30, 0xF0, -0x20, 0x6A, 0x64, 0x33, 0x40, 0xF4, 0x04, 0x4A, 0x49, 0xE3, 0x40, 0xAA, 0x62, 0x67, 0x0F, 0x92, -0x63, 0xEA, 0x58, 0x67, 0x05, 0x2A, 0x06, 0x92, 0x56, 0xA2, 0x17, 0x5A, 0x58, 0x67, 0x32, 0x2A, -0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x82, 0x67, 0x01, 0x6D, 0x00, 0x6E, 0x00, 0x18, 0x5B, 0x31, -0x30, 0xF0, 0x20, 0x6A, 0xE1, 0xF1, 0x00, 0x4A, 0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x06, 0x92, -0x56, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0xE1, 0xF1, 0x0C, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, -0xB6, 0x23, 0x0F, 0x92, 0x4E, 0x33, 0xBD, 0x67, 0x40, 0xF0, 0x89, 0xA5, 0x30, 0xF0, 0x20, 0x6A, -0x84, 0x34, 0x40, 0xF4, 0x04, 0x4A, 0x49, 0xE4, 0x40, 0xAA, 0x4E, 0x34, 0xFF, 0xF7, 0x1F, 0x6A, -0x8C, 0xEA, 0x30, 0xF0, 0x20, 0x6C, 0xE1, 0xF1, 0x18, 0x4C, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, -0xB6, 0x23, 0x0B, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF2, 0x0C, 0x4A, 0x82, 0x67, 0x00, 0x18, -0xB6, 0x23, 0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, 0x00, 0x18, 0xBA, 0x28, 0x30, 0xF0, -0x20, 0x6A, 0x01, 0xF2, 0x18, 0x4A, 0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x7D, 0x67, 0x40, 0xF0, -0x4B, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x58, 0x3B, 0x9D, 0x67, 0x40, 0xF0, 0x6B, 0xA4, 0x30, 0xF0, -0x20, 0x6A, 0xC2, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x40, 0xAA, -0x62, 0x67, 0xBD, 0x67, 0x5A, 0xAD, 0xFF, 0xF7, 0x1F, 0x6C, 0x4B, 0xE4, 0x62, 0xEA, 0x58, 0x67, -0x1F, 0x2A, 0x5D, 0x67, 0x40, 0xF0, 0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x6B, 0xA5, 0x30, 0xF0, -0x20, 0x6A, 0xC2, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0xAA, -0xBD, 0x67, 0x5A, 0xAD, 0x4D, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, -0xC2, 0xF5, 0x18, 0x4C, 0x84, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xCA, 0x0E, 0x10, -0x5D, 0x67, 0x40, 0xF0, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF5, 0x18, 0x4B, 0x64, 0x33, -0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xCA, 0x9D, 0x67, 0x40, 0xF0, -0x6B, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, -0x49, 0xE3, 0x40, 0xAA, 0x62, 0x67, 0xBD, 0x67, 0x59, 0xAD, 0xFF, 0xF7, 0x1F, 0x6C, 0x4B, 0xE4, -0x62, 0xEA, 0x58, 0x67, 0x1F, 0x2A, 0x5D, 0x67, 0x40, 0xF0, 0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, -0x6B, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, -0x49, 0xE3, 0x60, 0xAA, 0xBD, 0x67, 0x59, 0xAD, 0x4D, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, -0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF5, 0x18, 0x4C, 0x84, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, -0x60, 0xCA, 0x0E, 0x10, 0x5D, 0x67, 0x40, 0xF0, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF5, -0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x01, 0x6B, 0x6B, 0xEB, 0x60, 0xCA, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA5, 0xF4, 0x70, 0x9A, 0x9D, 0x67, 0x58, 0xAC, -0x4F, 0xEA, 0x63, 0xEA, 0x58, 0x67, 0x10, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0xA5, 0xF4, 0x70, 0x9A, 0x9D, 0x67, 0x58, 0xAC, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0xA5, 0xF4, 0x70, 0xDA, 0x08, 0x10, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x01, 0x6B, 0x6B, 0xEB, 0xA5, 0xF4, 0x70, 0xDA, 0xBD, 0x67, 0x40, 0xF0, 0x6B, 0xA5, 0x30, 0xF0, -0x20, 0x6A, 0x42, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x42, 0xAA, -0x62, 0x67, 0xFF, 0xF7, 0x1F, 0x6C, 0x0B, 0x92, 0x4B, 0xE4, 0x63, 0xEA, 0x58, 0x67, 0x21, 0x2A, -0x5D, 0x67, 0x40, 0xF0, 0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, 0x6B, 0xA5, 0x30, 0xF0, 0x20, 0x6A, -0x42, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x62, 0xAA, 0x0B, 0x95, -0xFF, 0xF7, 0x1F, 0x6A, 0xAC, 0xEA, 0x4D, 0xE3, 0xFF, 0xF7, 0x1F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, -0x20, 0x6A, 0x42, 0xF6, 0x18, 0x4C, 0x84, 0x34, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x62, 0xCA, -0x0E, 0x10, 0x5D, 0x67, 0x40, 0xF0, 0x6B, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF6, 0x18, 0x4B, -0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x01, 0x6B, 0x6B, 0xEB, 0x62, 0xCA, 0x9D, 0x67, -0x40, 0xF0, 0x6B, 0xA4, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, -0x18, 0x4A, 0x49, 0xE3, 0x42, 0xAA, 0x62, 0x67, 0xFF, 0xF7, 0x1F, 0x6C, 0x0E, 0x92, 0x4B, 0xE4, -0x63, 0xEA, 0x58, 0x67, 0x21, 0x2A, 0x5D, 0x67, 0x40, 0xF0, 0x8B, 0xA2, 0xBD, 0x67, 0x40, 0xF0, -0x6B, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, -0x49, 0xE3, 0x62, 0xAA, 0x0E, 0x95, 0xFF, 0xF7, 0x1F, 0x6A, 0xAC, 0xEA, 0x4D, 0xE3, 0xFF, 0xF7, -0x1F, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF6, 0x18, 0x4C, 0x84, 0x34, 0x02, 0xF5, -0x18, 0x4A, 0x49, 0xE4, 0x62, 0xCA, 0x18, 0x10, 0x5D, 0x67, 0x40, 0xF0, 0x6B, 0xA2, 0x30, 0xF0, -0x20, 0x6A, 0xC2, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x01, 0x6B, -0x6B, 0xEB, 0x62, 0xCA, 0x09, 0x10, 0x06, 0x92, 0x00, 0x6B, 0x7C, 0xC2, 0x05, 0x10, 0x00, 0x65, -0x03, 0x10, 0x00, 0x65, 0x01, 0x10, 0x00, 0x65, 0x7D, 0x67, 0x40, 0xF0, 0x4B, 0xA3, 0x01, 0x4A, -0x9D, 0x67, 0x40, 0xF0, 0x4B, 0xC4, 0xBD, 0x67, 0x40, 0xF0, 0x4B, 0x85, 0x00, 0x52, 0x58, 0x67, -0x3F, 0xF2, 0x16, 0x22, 0x19, 0x97, 0x0D, 0x63, 0x00, 0xEF, 0x00, 0x65, 0xFC, 0x63, 0x07, 0x62, -0x44, 0x67, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x00, 0x6A, 0x9D, 0x67, 0x54, 0xC4, 0x30, 0xF0, -0x20, 0x6A, 0xE5, 0xF7, 0x00, 0x4A, 0x04, 0xD2, 0x00, 0x6A, 0x7D, 0x67, 0x55, 0xC3, 0x15, 0x10, -0x9D, 0x67, 0x20, 0xF0, 0x60, 0xA4, 0x9D, 0x67, 0x55, 0xA4, 0x67, 0xEA, 0x01, 0x6A, 0x4C, 0xEB, -0xFF, 0x6A, 0x6C, 0xEA, 0x05, 0x22, 0x7D, 0x67, 0x54, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x54, 0xC4, -0x7D, 0x67, 0x55, 0xA3, 0x01, 0x4A, 0x9D, 0x67, 0x55, 0xC4, 0x7D, 0x67, 0x55, 0xA3, 0x04, 0x5A, -0x58, 0x67, 0xE6, 0x2A, 0x7D, 0x67, 0x54, 0xA3, 0x01, 0x6C, 0x8E, 0xEA, 0x56, 0x2A, 0x7D, 0x67, -0x20, 0xF0, 0x40, 0xA3, 0x21, 0xF1, 0x1C, 0x6C, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF4, 0x6C, 0x9B, -0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x01, 0x6B, -0x6E, 0xEA, 0x0C, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x50, 0x9A, -0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x28, 0x13, 0x9D, 0x67, 0x20, 0xF0, -0x40, 0xA4, 0x02, 0x6B, 0x6E, 0xEA, 0x0C, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, -0x61, 0xF4, 0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x16, 0x13, -0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x04, 0x6B, 0x6E, 0xEA, 0x0C, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, -0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, -0xBA, 0x1A, 0x04, 0x13, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x08, 0x6B, 0x6E, 0xEA, 0xE0, 0xF2, -0x1D, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x5C, 0x9A, 0x83, 0x67, -0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0xF1, 0x12, 0x9D, 0x67, 0x54, 0xA4, 0x02, 0x6B, -0x6E, 0xEA, 0x20, 0xF1, 0x12, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x21, 0xF1, 0x1C, 0x6C, -0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF4, 0x6C, 0x9B, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, -0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x41, 0xF1, 0x00, 0x6B, 0x83, 0x67, 0xF0, 0x6D, 0xC2, 0x67, -0x00, 0x18, 0xBA, 0x1A, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x03, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, -0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x50, 0x9A, 0x83, 0x67, 0xA2, 0x67, -0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, -0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, -0x00, 0xF3, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, -0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, -0xA5, 0x12, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x05, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, 0x21, 0xF1, -0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x50, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, -0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x58, 0x9A, -0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x00, 0xF3, -0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, -0x06, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x76, 0x12, -0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x09, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, -0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x50, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, -0xBA, 0x1A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x5C, 0x9A, 0x83, 0x67, -0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x00, 0xF3, 0x00, 0x6A, -0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, -0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x47, 0x12, 0x9D, 0x67, -0x20, 0xF0, 0x40, 0xA4, 0x06, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, -0x20, 0x6A, 0x61, 0xF4, 0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, -0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, -0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, -0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x06, 0xF0, 0x00, 0x6A, -0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x18, 0x12, 0x9D, 0x67, 0x20, 0xF0, -0x40, 0xA4, 0x0A, 0x6B, 0x6E, 0xEA, 0x29, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, -0x61, 0xF4, 0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF1, -0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, -0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, -0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, 0x00, 0x6A, 0x83, 0x67, -0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0xE9, 0x11, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, -0x0C, 0x6B, 0x6E, 0xEA, 0xE0, 0xF1, 0x02, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, -0x61, 0xF4, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF1, -0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, -0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x06, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, -0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, 0x00, 0x6A, 0x83, 0x67, -0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0xB9, 0x11, 0x9D, 0x67, 0x54, 0xA4, 0x03, 0x6B, -0x6E, 0xEA, 0xA0, 0xF1, 0x13, 0x2A, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x21, 0xF1, 0x1C, 0x6C, -0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF4, 0x6C, 0x9B, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, -0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x41, 0xF1, 0x00, 0x6B, 0x83, 0x67, 0xF0, 0x6D, 0xC2, 0x67, -0x00, 0x18, 0xBA, 0x1A, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x41, 0xF1, 0x00, 0x6C, 0x30, 0xF0, -0x20, 0x6B, 0x81, 0xF4, 0x60, 0x9B, 0xA3, 0x67, 0xC2, 0x67, 0x00, 0x18, 0xBA, 0x1A, 0x7D, 0x67, -0x20, 0xF0, 0x40, 0xA3, 0x07, 0x6C, 0x8E, 0xEA, 0x5E, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, -0x20, 0x6A, 0x61, 0xF4, 0x50, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, -0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, -0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, -0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, -0x00, 0xF3, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, -0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, -0x41, 0xF1, 0x00, 0x6B, 0x06, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, -0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x44, 0x9A, 0x83, 0x67, -0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, -0x81, 0xF4, 0x48, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, -0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x50, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, -0x00, 0x18, 0xBA, 0x1A, 0x2B, 0x11, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x0B, 0x6C, 0x8E, 0xEA, -0x5E, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x50, 0x9A, 0x83, 0x67, -0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, -0x61, 0xF4, 0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF1, -0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, -0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x00, 0xF3, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, -0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, -0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, 0x00, 0x6A, -0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, -0x20, 0x6A, 0x81, 0xF4, 0x44, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, -0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x48, 0x9A, 0x83, 0x67, 0xA2, 0x67, -0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, -0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0xC7, 0x10, 0x7D, 0x67, -0x20, 0xF0, 0x40, 0xA3, 0x0D, 0x6C, 0x8E, 0xEA, 0x5E, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, -0x20, 0x6A, 0x61, 0xF4, 0x50, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, -0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, -0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, -0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, -0x00, 0xF3, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, -0x00, 0x6B, 0x06, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, -0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, -0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x44, 0x9A, 0x83, 0x67, -0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, -0x61, 0xF4, 0x50, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, -0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, -0x00, 0x18, 0xBA, 0x1A, 0x63, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x0E, 0x6C, 0x8E, 0xEA, -0x5D, 0x2A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x54, 0x9A, 0x83, 0x67, -0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF1, 0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, -0x61, 0xF4, 0x58, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x21, 0xF1, -0x1C, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x5C, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, -0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x01, 0xF4, 0x00, 0x6A, 0x83, 0x67, 0xA2, 0x67, -0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x06, 0xF0, 0x00, 0x6A, 0x83, 0x67, -0xA2, 0x67, 0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x18, 0xF0, 0x00, 0x6A, -0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, -0x20, 0x6A, 0x81, 0xF4, 0x48, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x6E, 0x00, 0x18, 0xBA, 0x1A, -0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, 0x50, 0x9A, 0x83, 0x67, 0xA2, 0x67, -0x01, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x41, 0xF1, 0x00, 0x6B, 0x30, 0xF0, 0x20, 0x6A, 0x61, 0xF4, -0x54, 0x9A, 0x83, 0x67, 0xA2, 0x67, 0x02, 0x6E, 0x00, 0x18, 0xBA, 0x1A, 0x07, 0x97, 0x04, 0x63, -0x00, 0xEF, 0x00, 0x65, 0xFF, 0x63, 0x64, 0x67, 0x45, 0x67, 0x9D, 0x67, 0x68, 0xC4, 0x7D, 0x67, -0x4C, 0xC3, 0x9D, 0x67, 0x4C, 0xA4, 0x2D, 0x2A, 0x7D, 0x67, 0x48, 0xA3, 0x0C, 0x5A, 0x58, 0x67, -0x09, 0x2A, 0x7D, 0x67, 0x48, 0xA3, 0x14, 0x5A, 0x58, 0x67, 0x04, 0x22, 0x01, 0x6A, 0x7D, 0x67, -0x42, 0xC3, 0x1B, 0x10, 0x9D, 0x67, 0x48, 0xA4, 0x14, 0x5A, 0x58, 0x67, 0x09, 0x2A, 0x7D, 0x67, -0x48, 0xA3, 0x1C, 0x5A, 0x58, 0x67, 0x04, 0x22, 0x02, 0x6A, 0x7D, 0x67, 0x42, 0xC3, 0x0D, 0x10, -0x9D, 0x67, 0x48, 0xA4, 0x1C, 0x5A, 0x58, 0x67, 0x08, 0x2A, 0x7D, 0x67, 0x48, 0xA3, 0x24, 0x5A, -0x58, 0x67, 0x03, 0x22, 0x03, 0x6A, 0x7D, 0x67, 0x42, 0xC3, 0x07, 0x6A, 0x9D, 0x67, 0x40, 0xC4, -0x29, 0x10, 0x7D, 0x67, 0x48, 0xA3, 0x2C, 0x5A, 0x58, 0x67, 0x09, 0x2A, 0x7D, 0x67, 0x48, 0xA3, -0x36, 0x5A, 0x58, 0x67, 0x04, 0x22, 0x01, 0x6A, 0x7D, 0x67, 0x42, 0xC3, 0x1B, 0x10, 0x9D, 0x67, -0x48, 0xA4, 0x36, 0x5A, 0x58, 0x67, 0x09, 0x2A, 0x7D, 0x67, 0x48, 0xA3, 0x40, 0x5A, 0x58, 0x67, -0x04, 0x22, 0x02, 0x6A, 0x7D, 0x67, 0x42, 0xC3, 0x0D, 0x10, 0x9D, 0x67, 0x48, 0xA4, 0x40, 0x5A, -0x58, 0x67, 0x08, 0x2A, 0x7D, 0x67, 0x48, 0xA3, 0x4A, 0x5A, 0x58, 0x67, 0x03, 0x22, 0x03, 0x6A, -0x7D, 0x67, 0x42, 0xC3, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x5C, 0xA2, -0x03, 0x6C, 0x8E, 0xEA, 0x4E, 0x2A, 0x7D, 0x67, 0x42, 0xA3, 0x03, 0x6C, 0x8E, 0xEA, 0x05, 0x2A, -0x7D, 0x67, 0x48, 0xA3, 0x9D, 0x67, 0x41, 0xC4, 0x6F, 0x10, 0x7D, 0x67, 0x42, 0xA3, 0x02, 0x6C, -0x8E, 0xEA, 0x1D, 0x2A, 0x7D, 0x67, 0x4C, 0xA3, 0x0D, 0x2A, 0x9D, 0x67, 0x48, 0xA4, 0x68, 0x42, -0xF4, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, -0x41, 0xC3, 0x5A, 0x10, 0x9D, 0x67, 0x48, 0xA4, 0x68, 0x42, 0xD2, 0x4B, 0x30, 0xF0, 0x20, 0x6A, -0x20, 0xF3, 0x1C, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x41, 0xC3, 0x4D, 0x10, 0x9D, 0x67, -0x42, 0xA4, 0x01, 0x6B, 0x6E, 0xEA, 0x48, 0x2A, 0x9D, 0x67, 0x4C, 0xA4, 0x0D, 0x2A, 0x7D, 0x67, -0x48, 0xA3, 0x68, 0x42, 0xFC, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0xF3, 0x14, 0x4A, 0x49, 0xE3, -0x40, 0xA2, 0x9D, 0x67, 0x41, 0xC4, 0x38, 0x10, 0x7D, 0x67, 0x48, 0xA3, 0x68, 0x42, 0xDC, 0x4B, -0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF3, 0x10, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x9D, 0x67, 0x41, 0xC4, -0x2B, 0x10, 0x7D, 0x67, 0x42, 0xA3, 0x02, 0x6C, 0x8E, 0xEA, 0x05, 0x2A, 0x7D, 0x67, 0x48, 0xA3, -0x9D, 0x67, 0x41, 0xC4, 0x21, 0x10, 0x7D, 0x67, 0x42, 0xA3, 0x01, 0x6C, 0x8E, 0xEA, 0x1C, 0x2A, -0x7D, 0x67, 0x4C, 0xA3, 0x0D, 0x2A, 0x9D, 0x67, 0x48, 0xA4, 0x68, 0x42, 0xFC, 0x4B, 0x30, 0xF0, -0x20, 0x6A, 0x00, 0xF3, 0x0C, 0x4A, 0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x41, 0xC3, 0x0C, 0x10, -0x9D, 0x67, 0x48, 0xA4, 0x68, 0x42, 0xDC, 0x4B, 0x30, 0xF0, 0x20, 0x6A, 0x20, 0xF3, 0x04, 0x4A, -0x49, 0xE3, 0x40, 0xA2, 0x7D, 0x67, 0x41, 0xC3, 0x9D, 0x67, 0x41, 0xA4, 0x01, 0x63, 0x20, 0xE8, -0xF8, 0x63, 0x0F, 0x62, 0x0E, 0xD0, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, -0x5D, 0xA2, 0x7D, 0x67, 0x5E, 0xC3, 0xBD, 0x67, 0x5E, 0xA5, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF2, -0x04, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x7D, 0x67, 0x5E, 0xA3, 0x56, 0x2A, -0x00, 0x6A, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xC5, 0x4A, 0x10, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, -0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, -0x06, 0xD2, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, 0x82, 0x67, 0x00, 0x18, 0x6A, 0x0B, 0x30, 0x22, -0x06, 0x92, 0x4E, 0xA2, 0x80, 0x6B, 0x6C, 0xEA, 0x2B, 0x2A, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, -0x54, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x01, 0xF4, 0x44, 0x9A, 0x49, 0xE3, 0x40, 0xA2, -0xBD, 0x67, 0x20, 0xF0, 0x41, 0xC5, 0x5D, 0x67, 0x20, 0xF0, 0x61, 0xA2, 0x7F, 0x6A, 0x6C, 0xEA, -0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, 0x0B, 0x2A, 0x7D, 0x67, -0x20, 0xF0, 0x40, 0xA3, 0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF2, 0x10, 0x4B, 0x83, 0x67, 0xA2, 0x67, -0x00, 0x18, 0xB6, 0x23, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, 0x82, 0x67, 0x00, 0x18, 0x58, 0x3B, -0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, 0x01, 0x4A, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xC5, 0x7D, 0x67, -0x20, 0xF0, 0x42, 0x83, 0x00, 0x52, 0x58, 0x67, 0xB0, 0x22, 0x02, 0x11, 0x7D, 0x67, 0x5E, 0xA3, -0xE0, 0xF0, 0x1E, 0x22, 0xBD, 0x67, 0x5E, 0xA5, 0x04, 0x5A, 0x58, 0x67, 0xE0, 0xF0, 0x18, 0x22, -0x00, 0x6A, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xC3, 0xEC, 0x10, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, -0x4C, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, 0x20, 0x6A, 0x83, 0xF2, 0x00, 0x4A, 0x49, 0xE3, -0x06, 0xD2, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x6A, 0x0B, 0xC0, 0xF0, -0x11, 0x22, 0x06, 0x92, 0x4E, 0xA2, 0x80, 0x6B, 0x6C, 0xEA, 0xC0, 0xF0, 0x0B, 0x2A, 0xBD, 0x67, -0x20, 0xF0, 0x62, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF7, 0x0C, 0x4B, 0x68, 0x33, 0x02, 0xF5, -0x18, 0x4A, 0x49, 0xE3, 0x40, 0x9A, 0x7D, 0x67, 0x5D, 0xC3, 0xBD, 0x67, 0x20, 0xF0, 0x62, 0xA5, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x23, 0xF7, 0x50, 0xA2, 0x7D, 0x67, -0x5C, 0xC3, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, 0x48, 0x32, 0x48, 0x33, 0x6D, 0xE2, 0x30, 0xF0, -0x20, 0x6A, 0xC6, 0xF4, 0x08, 0x4A, 0x49, 0xE3, 0x09, 0x03, 0x83, 0x67, 0xA2, 0x67, 0x14, 0x6E, -0x00, 0x18, 0x30, 0x04, 0x7D, 0x67, 0x5E, 0xA3, 0x0F, 0x42, 0xBD, 0x67, 0x20, 0xF0, 0x82, 0xA5, -0x5D, 0x67, 0x7D, 0xA2, 0xBD, 0x67, 0x5C, 0xA5, 0x09, 0x05, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, -0x64, 0x2E, 0x64, 0x6B, 0x4F, 0xE3, 0xFF, 0x6A, 0x4C, 0xEB, 0x06, 0x92, 0x09, 0xE2, 0x20, 0xF0, -0x65, 0xC2, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, 0x29, 0x2A, 0xBD, 0x67, 0x20, 0xF0, 0x42, 0xA5, -0x30, 0xF0, 0x20, 0x6B, 0x21, 0xF2, 0x1C, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, -0x09, 0x95, 0x0A, 0x93, 0x0B, 0x92, 0x0C, 0x97, 0x0D, 0x96, 0x30, 0xF0, 0x20, 0x6C, 0x41, 0xF2, -0x04, 0x4C, 0x04, 0xD7, 0x05, 0xD6, 0xC3, 0x67, 0xE2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x7D, 0x67, -0x5E, 0xA3, 0xFF, 0x4A, 0x06, 0x93, 0x49, 0xE3, 0x20, 0xF0, 0x45, 0xA2, 0x30, 0xF0, 0x20, 0x6B, -0x61, 0xF2, 0x08, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0xBD, 0x67, 0x20, 0xF0, -0x42, 0xA5, 0x82, 0x67, 0x00, 0x18, 0x58, 0x3B, 0x7D, 0x67, 0x5E, 0xA3, 0x03, 0x6D, 0xAE, 0xEA, -0x51, 0x2A, 0x06, 0x92, 0x20, 0xF0, 0x65, 0xA2, 0x06, 0x92, 0x20, 0xF0, 0x46, 0xA2, 0x43, 0xEB, -0x58, 0x67, 0x0D, 0x2A, 0x06, 0x92, 0x20, 0xF0, 0x65, 0xA2, 0x06, 0x92, 0x20, 0xF0, 0x47, 0xA2, -0x43, 0xEB, 0x58, 0x67, 0x04, 0x2A, 0x00, 0x6A, 0x7D, 0x67, 0x5F, 0xC3, 0x10, 0x10, 0x06, 0x92, -0x20, 0xF0, 0x66, 0xA2, 0x06, 0x92, 0x20, 0xF0, 0x47, 0xA2, 0x43, 0xEB, 0x58, 0x67, 0x04, 0x2A, -0x01, 0x6A, 0x7D, 0x67, 0x5F, 0xC3, 0x03, 0x10, 0x02, 0x6A, 0xBD, 0x67, 0x5F, 0xC5, 0x7D, 0x67, -0x20, 0xF0, 0x42, 0xA3, 0x27, 0x2A, 0xBD, 0x67, 0x7F, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0x49, 0xE3, 0xA3, 0xF2, 0x58, 0xA2, 0x82, 0x67, 0x00, 0x18, 0xCF, 0x37, 0x7D, 0x67, -0x5F, 0xA3, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF2, 0x10, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, -0xB6, 0x23, 0xBD, 0x67, 0x7F, 0xA5, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, -0xA3, 0xF2, 0x58, 0xA2, 0x30, 0xF0, 0x20, 0x6B, 0x61, 0xF2, 0x1C, 0x4B, 0x83, 0x67, 0xA2, 0x67, -0x00, 0x18, 0xB6, 0x23, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0xA3, 0x01, 0x4A, 0xBD, 0x67, 0x20, 0xF0, -0x42, 0xC5, 0x7D, 0x67, 0x20, 0xF0, 0x42, 0x83, 0x00, 0x52, 0x58, 0x67, 0x1F, 0xF7, 0x0D, 0x22, -0x7D, 0x67, 0x5E, 0xA3, 0x03, 0x5A, 0x58, 0x67, 0x34, 0x22, 0x5D, 0x67, 0x7E, 0xA2, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0xA3, 0xF2, 0x58, 0xA2, 0x30, 0xF0, 0x20, 0x6B, -0x81, 0xF2, 0x0C, 0x4B, 0x83, 0x67, 0xA2, 0x67, 0x00, 0x18, 0xB6, 0x23, 0xBD, 0x67, 0x7E, 0xA5, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0xA3, 0xF2, 0x58, 0xA2, 0x82, 0x67, -0x00, 0x18, 0xCF, 0x37, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x01, 0x6B, 0xA3, 0xF2, -0x7E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x5D, 0xA2, 0x61, 0x42, -0xFF, 0x6A, 0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0xA3, 0xF2, 0x7D, 0xC2, -0x1A, 0x10, 0x7D, 0x67, 0x5E, 0xA3, 0x03, 0x6D, 0xAE, 0xEA, 0x15, 0x2A, 0x30, 0xF0, 0x20, 0x6A, -0x81, 0xF2, 0x1C, 0x4A, 0x82, 0x67, 0x00, 0x18, 0xB6, 0x23, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0x00, 0x6B, 0xA3, 0xF2, 0x7E, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, -0x00, 0x6B, 0xA3, 0xF2, 0x7D, 0xC2, 0x0F, 0x97, 0x0E, 0x90, 0x08, 0x63, 0x00, 0xEF, 0x00, 0x65, -0xFD, 0x63, 0x05, 0x62, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x49, 0xA2, 0x61, 0x42, 0xFF, 0x6A, -0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x69, 0xC2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x49, 0xA2, 0x02, 0x5A, 0x58, 0x67, 0x08, 0x2A, 0x30, 0xF0, 0x20, 0x6A, 0x00, 0x6B, 0x02, 0xF5, -0x69, 0xC2, 0x00, 0x18, 0xDF, 0x34, 0x01, 0x10, 0x00, 0x65, 0x05, 0x97, 0x03, 0x63, 0x00, 0xEF, -0xFF, 0x63, 0x00, 0x6A, 0x7D, 0x67, 0x41, 0xC3, 0x80, 0x10, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, -0x18, 0x10, 0x5D, 0x67, 0x61, 0xA2, 0x5D, 0x67, 0xA0, 0xA2, 0x30, 0xF0, 0x20, 0x6C, 0x43, 0x67, -0x48, 0x32, 0x69, 0xE2, 0xA9, 0xE2, 0xE0, 0xF7, 0x0C, 0x4A, 0x48, 0x33, 0x44, 0x67, 0x02, 0xF5, -0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xDA, 0x7D, 0x67, 0x40, 0xA3, 0x01, 0x4A, 0x7D, 0x67, -0x40, 0xC3, 0x7D, 0x67, 0x40, 0xA3, 0x05, 0x5A, 0x58, 0x67, 0xE3, 0x2A, 0x5D, 0x67, 0x61, 0xA2, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x23, 0xF7, 0x70, 0xC2, -0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF7, 0x0C, 0x4B, 0x68, 0x33, 0x02, 0xF5, -0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xDA, 0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0xA5, 0xF1, 0x70, 0xC2, 0x5D, 0x67, 0x61, 0xA2, -0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x25, 0xF2, 0x70, 0xC2, -0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, -0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, 0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, -0x42, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, -0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, -0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, 0x5D, 0x67, 0x61, 0xA2, 0x30, 0xF0, 0x20, 0x6A, -0xC2, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, -0x7D, 0x67, 0x41, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x41, 0xC3, 0x7D, 0x67, 0x41, 0x83, 0x00, 0x52, -0x58, 0x67, 0x7F, 0xF7, 0x1A, 0x22, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x00, 0x6B, -0xA5, 0xF4, 0x70, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0x44, 0x67, 0x7D, 0x67, 0x40, 0xC3, 0x5D, 0x67, -0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF5, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, -0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF5, -0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x60, 0xCA, 0x5D, 0x67, -0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x42, 0xF6, 0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, -0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0xC2, 0xF6, -0x18, 0x4B, 0x64, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x62, 0xCA, 0x20, 0xE8, -0xFF, 0x63, 0x44, 0x67, 0x7D, 0x67, 0x48, 0xC3, 0x00, 0x6A, 0x7D, 0x67, 0x40, 0xC3, 0x18, 0x10, -0x5D, 0x67, 0x68, 0xA2, 0x5D, 0x67, 0xA0, 0xA2, 0x30, 0xF0, 0x20, 0x6C, 0x43, 0x67, 0x48, 0x32, -0x69, 0xE2, 0xA9, 0xE2, 0xE0, 0xF7, 0x0C, 0x4A, 0x48, 0x33, 0x44, 0x67, 0x02, 0xF5, 0x18, 0x4A, -0x49, 0xE3, 0x00, 0x6B, 0x60, 0xDA, 0x7D, 0x67, 0x40, 0xA3, 0x01, 0x4A, 0x7D, 0x67, 0x40, 0xC3, -0x7D, 0x67, 0x40, 0xA3, 0x05, 0x5A, 0x58, 0x67, 0xE3, 0x2A, 0x5D, 0x67, 0x68, 0xA2, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x23, 0xF7, 0x70, 0xC2, 0x5D, 0x67, -0x68, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF7, 0x0C, 0x4B, 0x68, 0x33, 0x02, 0xF5, 0x18, 0x4A, -0x49, 0xE3, 0x00, 0x6B, 0x60, 0xDA, 0x01, 0x63, 0x20, 0xE8, 0x00, 0x65, 0x44, 0x67, 0x7D, 0x67, -0x40, 0xC3, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, -0x00, 0x6B, 0xA5, 0xF1, 0x70, 0xC2, 0x5D, 0x67, 0x60, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0x49, 0xE3, 0x00, 0x6B, 0x25, 0xF2, 0x70, 0xC2, 0x20, 0xE8, 0xFC, 0x63, 0x07, 0x62, -0x44, 0x67, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xC3, 0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x4C, 0x32, -0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x4C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, -0x6C, 0xEA, 0x62, 0x67, 0x10, 0x6A, 0x6C, 0xEA, 0x40, 0xF1, 0x1F, 0x2A, 0xBD, 0x67, 0x20, 0xF0, -0x40, 0xA5, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x50, 0x9A, 0x49, 0xE3, -0x40, 0xA2, 0xDD, 0x67, 0x56, 0xC6, 0x7D, 0x67, 0x20, 0xF0, 0x40, 0xA3, 0x4C, 0x32, 0x62, 0x67, -0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x54, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, -0x3F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x55, 0xC4, 0xBD, 0x67, 0x20, 0xF0, 0x40, 0xA5, 0x4C, 0x32, -0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x58, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, -0x6C, 0xEA, 0x56, 0x32, 0xDD, 0x67, 0x52, 0xC6, 0x7D, 0x67, 0x56, 0xA3, 0x54, 0x32, 0x62, 0x67, -0x30, 0xF0, 0x20, 0x6A, 0x81, 0xF4, 0x5C, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, -0x7F, 0x6A, 0x6C, 0xEA, 0x9D, 0x67, 0x51, 0xC4, 0xBD, 0x67, 0x51, 0xA5, 0x49, 0x6E, 0xCE, 0xEA, -0x04, 0x2A, 0x01, 0x6A, 0x7D, 0x67, 0x50, 0xC3, 0x03, 0x10, 0x02, 0x6A, 0x9D, 0x67, 0x50, 0xC4, -0xBD, 0x67, 0x20, 0xF0, 0x40, 0xA5, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, -0x40, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x6C, 0xEA, 0x00, 0xF6, 0x40, 0x32, 0x00, 0xF6, -0x43, 0x32, 0x00, 0x52, 0x58, 0x67, 0x7A, 0x22, 0x7D, 0x67, 0x56, 0xA3, 0x30, 0xF0, 0x20, 0x6B, -0x4C, 0x32, 0x48, 0x34, 0x89, 0xE2, 0x02, 0xF5, 0x18, 0x4B, 0x69, 0xE2, 0x60, 0xF5, 0x57, 0xA2, -0x5A, 0x32, 0x62, 0x67, 0x01, 0x6A, 0x4C, 0xEB, 0xFF, 0x6A, 0x6C, 0xEA, 0x67, 0x22, 0x9D, 0x67, -0x55, 0xA4, 0x37, 0x2A, 0xBD, 0x67, 0x56, 0xA5, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, -0x6D, 0xE2, 0xA5, 0xF1, 0x70, 0xA3, 0x81, 0x43, 0xFF, 0x6B, 0x8C, 0xEB, 0x30, 0xF0, 0x20, 0x6C, -0x02, 0xF5, 0x18, 0x4C, 0x89, 0xE2, 0xA5, 0xF1, 0x70, 0xC2, 0xDD, 0x67, 0x76, 0xA6, 0x30, 0xF0, -0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0xA5, 0xF1, 0x70, 0xA2, 0x9D, 0x67, 0x56, 0xA4, -0x30, 0xF0, 0x20, 0x6C, 0x4C, 0x32, 0x48, 0x35, 0xA9, 0xE2, 0x02, 0xF5, 0x18, 0x4C, 0x89, 0xE2, -0x60, 0xF5, 0x5B, 0xA2, 0x6E, 0xEA, 0xC0, 0xF0, 0x02, 0x2A, 0xBD, 0x67, 0x56, 0xA5, 0x82, 0x67, -0x01, 0x6D, 0x00, 0x18, 0xEB, 0x30, 0xDD, 0x67, 0x56, 0xA6, 0x82, 0x67, 0x00, 0x18, 0x77, 0x3B, -0xB9, 0x10, 0x7D, 0x67, 0x56, 0xA3, 0x30, 0xF0, 0x20, 0x6B, 0x02, 0xF5, 0x18, 0x4B, 0x6D, 0xE2, -0x25, 0xF2, 0x70, 0xA3, 0x81, 0x43, 0xFF, 0x6B, 0x8C, 0xEB, 0x30, 0xF0, 0x20, 0x6C, 0x02, 0xF5, -0x18, 0x4C, 0x89, 0xE2, 0x25, 0xF2, 0x70, 0xC2, 0x9D, 0x67, 0x76, 0xA4, 0x30, 0xF0, 0x20, 0x6A, -0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x25, 0xF2, 0x50, 0xA2, 0xBD, 0x67, 0x70, 0xA5, 0x6E, 0xEA, -0x80, 0xF0, 0x17, 0x2A, 0xDD, 0x67, 0x56, 0xA6, 0x82, 0x67, 0x00, 0x6D, 0x00, 0x18, 0xEB, 0x30, -0x7D, 0x67, 0x56, 0xA3, 0x82, 0x67, 0x00, 0x18, 0x77, 0x3B, 0x8C, 0x10, 0x9D, 0x67, 0x55, 0xA4, -0xFF, 0x6B, 0x4C, 0xEB, 0x05, 0x5B, 0x78, 0x67, 0x01, 0x2B, 0x04, 0x6A, 0x7D, 0x67, 0x55, 0xC3, -0x9D, 0x67, 0x20, 0xF0, 0x40, 0xA4, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, 0xA1, 0xF4, -0x40, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x3F, 0x6A, 0x6C, 0xEA, 0xBD, 0x67, -0x54, 0xC5, 0xDD, 0x67, 0x20, 0xF0, 0x40, 0xA6, 0x4C, 0x32, 0x62, 0x67, 0x30, 0xF0, 0x20, 0x6A, -0xA1, 0xF4, 0x44, 0x9A, 0x49, 0xE3, 0x60, 0xA2, 0xFF, 0x6A, 0x4C, 0xEB, 0x3F, 0x6A, 0x6C, 0xEA, -0x7D, 0x67, 0x53, 0xC3, 0x9D, 0x67, 0x76, 0xA4, 0xBD, 0x67, 0xD5, 0xA5, 0x5D, 0x67, 0x96, 0xA2, -0xBD, 0x67, 0xF5, 0xA5, 0x30, 0xF0, 0x20, 0x6D, 0x44, 0x67, 0x48, 0x32, 0x89, 0xE2, 0xE9, 0xE2, -0xE0, 0xF7, 0x0C, 0x4A, 0x48, 0x34, 0x45, 0x67, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x80, 0x9A, -0xBD, 0x67, 0x54, 0xA5, 0x51, 0xE4, 0x30, 0xF0, 0x20, 0x6D, 0x43, 0x67, 0x48, 0x32, 0x69, 0xE2, -0xC9, 0xE2, 0xE0, 0xF7, 0x0C, 0x4A, 0x48, 0x33, 0x45, 0x67, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, -0x80, 0xDA, 0xDD, 0x67, 0x96, 0xA6, 0x5D, 0x67, 0x76, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, -0x18, 0x4A, 0x49, 0xE3, 0x23, 0xF7, 0x70, 0xA2, 0xBD, 0x67, 0x53, 0xA5, 0x4D, 0xE3, 0xFF, 0x6A, -0x4C, 0xEB, 0x30, 0xF0, 0x20, 0x6A, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x23, 0xF7, 0x70, 0xC2, -0xDD, 0x67, 0x96, 0xA6, 0x5D, 0x67, 0x76, 0xA2, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF7, 0x0C, 0x4B, -0x68, 0x33, 0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE3, 0x60, 0x9A, 0xDD, 0x67, 0xB4, 0xA6, 0xDD, 0x67, -0x53, 0xA6, 0x49, 0xE5, 0x4D, 0xE3, 0x30, 0xF0, 0x20, 0x6A, 0x40, 0xF7, 0x0C, 0x4C, 0x88, 0x34, -0x02, 0xF5, 0x18, 0x4A, 0x49, 0xE4, 0x60, 0xDA, 0x05, 0x10, 0x00, 0x65, 0x03, 0x10, 0x00, 0x65, -0x01, 0x10, 0x00, 0x65, 0x07, 0x97, 0x04, 0x63, 0x00, 0xEF, 0x00, 0x65, 0x01, 0x14, 0x00, 0x00, -0xEC, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -u32 array_length_mp_8814a_fw_nic = 66904; - - -#endif // end of DM_ODM_SUPPORT_TYPE & (ODM_AP) - - -#endif // end of HWIMG_SUPPORT - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/rtl8814a_cmd.c b/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/rtl8814a_cmd.c deleted file mode 100644 index 6aa1fda1765efd..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/rtl8814a_cmd.c +++ /dev/null @@ -1,1515 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#define _RTL8814A_CMD_C_ - -//#include -#include - -#define CONFIG_H2C_EF - -#define RTL8814_MAX_H2C_BOX_NUMS 4 -#define RTL8814_MAX_CMD_LEN 7 -#define RTL8814_MESSAGE_BOX_SIZE 4 -#define RTL8814_EX_MESSAGE_BOX_SIZE 4 - - -static u8 _is_fw_read_cmd_down(_adapter *padapter, u8 msgbox_num) -{ - u8 read_down = _FALSE; - int retry_cnts = 100; - - u8 valid; - - /* RTW_INFO(" _is_fw_read_cmd_down ,reg_1cc(%x),msg_box(%d)...\n",rtw_read8(padapter,REG_HMETFR),msgbox_num); */ - - do { - valid = rtw_read8(padapter, REG_HMETFR) & BIT(msgbox_num); - if (0 == valid) - read_down = _TRUE; - else - rtw_msleep_os(1); - } while ((!read_down) && (retry_cnts--)); - - return read_down; - -} - - -/***************************************** -* H2C Msg format : -* 0x1DF - 0x1D0 -*| 31 - 8 | 7-5 4 - 0 | -*| h2c_msg |Class_ID CMD_ID | -* -* Extend 0x1FF - 0x1F0 -*|31 - 0 | -*|ext_msg| -******************************************/ -s32 FillH2CCmd_8814(PADAPTER padapter, u8 ElementID, u32 CmdLen, u8 *pCmdBuffer) -{ - u8 h2c_box_num; - u32 msgbox_addr; - u32 msgbox_ex_addr=0; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - u8 cmd_idx,ext_cmd_len; - u32 h2c_cmd = 0; - u32 h2c_cmd_ex = 0; - s32 ret = _FAIL; - - - padapter = GET_PRIMARY_ADAPTER(padapter); - pHalData = GET_HAL_DATA(padapter); - - - if (pHalData->bFWReady == _FALSE) { - /* RTW_INFO("fill_h2c_cmd_8812(): return H2C cmd because fw is not ready\n"); */ - return ret; - } - - _enter_critical_mutex(&(adapter_to_dvobj(padapter)->h2c_fwcmd_mutex), NULL); - - - if (!pCmdBuffer) - goto exit; - if (CmdLen > RTL8814_MAX_CMD_LEN) - goto exit; - if (rtw_is_surprise_removed(padapter)) - goto exit; - - /* pay attention to if race condition happened in H2C cmd setting. */ - do { - h2c_box_num = pHalData->LastHMEBoxNum; - - if (!_is_fw_read_cmd_down(padapter, h2c_box_num)) { - RTW_INFO(" fw read cmd failed...\n"); - goto exit; - } - - *(u8 *)(&h2c_cmd) = ElementID; - - if(CmdLen<=3) - { - _rtw_memcpy((u8*)(&h2c_cmd)+1, pCmdBuffer, CmdLen ); - } - else{ - _rtw_memcpy((u8*)(&h2c_cmd)+1, pCmdBuffer,3); - ext_cmd_len = CmdLen-3; - _rtw_memcpy((u8*)(&h2c_cmd_ex), pCmdBuffer+3,ext_cmd_len ); - - //Write Ext command - msgbox_ex_addr = REG_HMEBOX_EXT0_8814A + (h2c_box_num *RTL8814_EX_MESSAGE_BOX_SIZE); - #ifdef CONFIG_H2C_EF - for(cmd_idx=0;cmd_idxh2c_cmd:0x%x, reg:0x%x =>h2c_cmd_ex:0x%x ..\n" - //,pHalData->LastHMEBoxNum ,CmdLen,msgbox_addr,h2c_cmd,msgbox_ex_addr,h2c_cmd_ex); - - pHalData->LastHMEBoxNum = (h2c_box_num+1) % RTL8814_MAX_H2C_BOX_NUMS; - - }while(0); - - ret = _SUCCESS; - -exit: - - _exit_critical_mutex(&(adapter_to_dvobj(padapter)->h2c_fwcmd_mutex), NULL); - - return ret; -} - -u8 rtl8814_set_rssi_cmd(_adapter*padapter, u8 *param) -{ - u8 res=_SUCCESS; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - - *((u32*) param ) = cpu_to_le32( *((u32*) param ) ); - - FillH2CCmd_8814(padapter, H2C_RSSI_SETTING, 4, param); - - return res; -} - -void rtl8814_fw_update_beacon_cmd(_adapter *padapter) -{ - u8 param[2] = {0}; - u16 txpktbuf_bndy; - - SET_8814A_H2CCMD_BCNHWSEQ_EN(param, 1); - SET_8814A_H2CCMD_BCNHWSEQ_BCN_NUMBER(param, 0); - SET_8814A_H2CCMD_BCNHWSEQ_HWSEQ(param, 1); - SET_8814A_H2CCMD_BCNHWSEQ_EXHWSEQ(param, 0); - SET_8814A_H2CCMD_BCNHWSEQ_PAGE(param, 0); - if (GET_HAL_DATA(padapter)->firmware_version < 23) - /* FW v21, v22 use H2C_BCNHWSEQ = 0xC2 */ - FillH2CCmd_8814(padapter, 0xC2, 2, param); - else - FillH2CCmd_8814(padapter, H2C_BCNHWSEQ, 2, param); - - /*RTW_INFO("%s, %d, correct beacon HW sequence, FirmwareVersion=%d, H2C_BCNHWSEQ=%d\n", __func__, __LINE__, GET_HAL_DATA(padapter)->firmware_version, H2C_BCNHWSEQ);*/ - -} - -static u8 Get_VHT_ENI( - u32 IOTAction, - u32 WirelessMode, - u32 ratr_bitmap - ) -{ - u8 Ret = 0; - - if(WirelessMode == WIRELESS_11_24AC) - { - if(ratr_bitmap & 0xfff00000) // Mix , 2SS - Ret = 3; - else // Mix, 1SS - Ret = 2; - } - else if(WirelessMode == WIRELESS_11_5AC) - { - Ret = 1; // VHT - } - - return (Ret << 4); -} - -BOOLEAN -Get_RA_ShortGI_8814( - PADAPTER Adapter, - struct sta_info *psta, - u8 shortGIrate, - u32 ratr_bitmap -) -{ - BOOLEAN bShortGI; - struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - bShortGI = shortGIrate; - -#ifdef CONFIG_80211AC_VHT - if( bShortGI && - is_supported_vht(psta->wireless_mode) && - (pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_REALTEK_JAGUAR_CCUTAP) && - TEST_FLAG(psta->vhtpriv.ldpc_cap, LDPC_VHT_ENABLE_TX) - ) - { - if(ratr_bitmap & 0xC0000000) - bShortGI = _FALSE; - } -#endif //CONFIG_80211AC_VHT - - return bShortGI; -} - - -void -Set_RA_LDPC_8814( - struct sta_info *psta, - BOOLEAN bLDPC - ) -{ - if(psta == NULL) - return; -#ifdef CONFIG_80211AC_VHT - if(psta->wireless_mode == WIRELESS_11_5AC) - { - if(bLDPC && TEST_FLAG(psta->vhtpriv.ldpc_cap, LDPC_VHT_CAP_TX)) - SET_FLAG(psta->vhtpriv.ldpc_cap, LDPC_VHT_ENABLE_TX); - else - CLEAR_FLAG(psta->vhtpriv.ldpc_cap, LDPC_VHT_ENABLE_TX); - } - else if(is_supported_ht(psta->wireless_mode) || is_supported_vht(psta->wireless_mode)) - { - if(bLDPC && TEST_FLAG(psta->htpriv.ldpc_cap, LDPC_HT_CAP_TX)) - SET_FLAG(psta->htpriv.ldpc_cap, LDPC_HT_ENABLE_TX); - else - CLEAR_FLAG(psta->htpriv.ldpc_cap, LDPC_HT_ENABLE_TX); - } - - update_ldpc_stbc_cap(psta); -#endif //CONFIG_80211AC_VHT - - //RTW_INFO("MacId %d bLDPC %d\n", psta->mac_id, bLDPC); -} - - -u8 -Get_RA_LDPC_8814( - struct sta_info *psta -) -{ - u8 bLDPC = 0; - - if (psta != NULL) { - if(psta->cmn.mac_id == 1) { - bLDPC = 0; - } else { -#ifdef CONFIG_80211AC_VHT - if(is_supported_vht(psta->wireless_mode)) - { - if(TEST_FLAG(psta->vhtpriv.ldpc_cap, LDPC_VHT_CAP_TX)) - bLDPC = 1; - else - bLDPC = 0; - } - else if(is_supported_ht(psta->wireless_mode)) - { - if(TEST_FLAG(psta->htpriv.ldpc_cap, LDPC_HT_CAP_TX)) - bLDPC =1; - else - bLDPC =0; - } - else -#endif - bLDPC = 0; - } - } - - return (bLDPC << 2); -} - - -void rtl8814_set_FwPwrMode_cmd(PADAPTER padapter, u8 PSMode) -{ - u8 u1H2CSetPwrMode[H2C_PWRMODE_LEN]={0}; - struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); - u8 Mode = 0, RLBM = 0, PowerState = 0, LPSAwakeIntvl = 2, pwrModeByte5 = 0; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - u8 allQueueUAPSD = 0; - - - RTW_INFO("%s: Mode=%d SmartPS=%d\n", __FUNCTION__, PSMode, pwrpriv->smart_ps); - - switch (PSMode) { - case PS_MODE_ACTIVE: - Mode = 0; - break; - case PS_MODE_MIN: - Mode = 1; - break; - case PS_MODE_MAX: - RLBM = 1; - Mode = 1; - break; - case PS_MODE_DTIM: - RLBM = 2; - Mode = 1; - break; - case PS_MODE_UAPSD_WMM: - Mode = 2; - break; - default: - Mode = 0; - break; - } - - if (Mode > PS_MODE_ACTIVE) - { -#ifdef CONFIG_BT_COEXIST - if ((rtw_btcoex_IsBtControlLps(padapter) == _TRUE) && (_TRUE == pHalData->EEPROMBluetoothCoexist)) - { - PowerState = rtw_btcoex_RpwmVal(padapter); - pwrModeByte5 = rtw_btcoex_LpsVal(padapter); - } - else -#endif // CONFIG_BT_COEXIST - { - PowerState = 0x00;// AllON(0x0C), RFON(0x04), RFOFF(0x00) - pwrModeByte5 = 0x40; - } - -#ifdef CONFIG_EXT_CLK - Mode |= BIT(7);//supporting 26M XTAL CLK_Request feature. -#endif //CONFIG_EXT_CLK - } - else - { - PowerState = 0x0C;// AllON(0x0C), RFON(0x04), RFOFF(0x00) - pwrModeByte5 = 0x40; - } - - // 0: Active, 1: LPS, 2: WMMPS - SET_8814A_H2CCMD_PWRMODE_PARM_MODE(u1H2CSetPwrMode, Mode); - - // 0:Min, 1:Max , 2:User define - SET_8814A_H2CCMD_PWRMODE_PARM_RLBM(u1H2CSetPwrMode, RLBM); - - /* (LPS) smart_ps: 0: PS_Poll, 1: PS_Poll , 2: NullData */ - /* (WMM)smart_ps: 0:PS_Poll, 1:NullData */ - SET_8814A_H2CCMD_PWRMODE_PARM_SMART_PS(u1H2CSetPwrMode, pwrpriv->smart_ps); - - // AwakeInterval: Unit is beacon interval, this field is only valid in PS_DTIM mode - SET_8814A_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(u1H2CSetPwrMode, LPSAwakeIntvl); - - /* (WMM only)bAllQueueUAPSD */ - SET_8814A_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(u1H2CSetPwrMode, allQueueUAPSD); - - /* AllON(0x0C), RFON(0x04), RFOFF(0x00) */ - SET_8814A_H2CCMD_PWRMODE_PARM_PWR_STATE(u1H2CSetPwrMode, PowerState); - - //SET_8814A_H2CCMD_PWRMODE_PARM_BYTE5(u1H2CSetPwrMode, pwrModeByte5); - -#ifdef CONFIG_BT_COEXIST - if (_TRUE == pHalData->EEPROMBluetoothCoexist) - rtw_btcoex_RecordPwrMode(padapter, u1H2CSetPwrMode, sizeof(u1H2CSetPwrMode)); -#endif /* CONFIG_BT_COEXIST */ - //RTW_INFO("u1H2CSetPwrMode="MAC_FMT"\n", MAC_ARG(u1H2CSetPwrMode)); - FillH2CCmd_8814(padapter, H2C_SET_PWR_MODE, sizeof(u1H2CSetPwrMode), u1H2CSetPwrMode); - -} - -static void ConstructBeacon(_adapter *padapter, u8 *pframe, u32 *pLength) -{ - struct rtw_ieee80211_hdr *pwlanhdr; - u16 *fctrl; - u32 rate_len, pktlen; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); - u8 bc_addr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - - - //RTW_INFO("%s\n", __FUNCTION__); - - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - - _rtw_memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(cur_network), ETH_ALEN); - - SetSeqNum(pwlanhdr, 0/*pmlmeext->mgnt_seq*/); - /* pmlmeext->mgnt_seq++; */ - set_frame_sub_type(pframe, WIFI_BEACON); - - pframe += sizeof(struct rtw_ieee80211_hdr_3addr); - pktlen = sizeof (struct rtw_ieee80211_hdr_3addr); - - //timestamp will be inserted by hardware - pframe += 8; - pktlen += 8; - - // beacon interval: 2 bytes - _rtw_memcpy(pframe, (unsigned char *)(rtw_get_beacon_interval_from_ie(cur_network->IEs)), 2); - - pframe += 2; - pktlen += 2; - - // capability info: 2 bytes - _rtw_memcpy(pframe, (unsigned char *)(rtw_get_capability_from_ie(cur_network->IEs)), 2); - - pframe += 2; - pktlen += 2; - - if( (pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) - { - //RTW_INFO("ie len=%d\n", cur_network->IELength); - pktlen += cur_network->IELength - sizeof(NDIS_802_11_FIXED_IEs); - _rtw_memcpy(pframe, cur_network->IEs+sizeof(NDIS_802_11_FIXED_IEs), pktlen); - - goto _ConstructBeacon; - } - - //below for ad-hoc mode - - // SSID - pframe = rtw_set_ie(pframe, _SSID_IE_, cur_network->Ssid.SsidLength, cur_network->Ssid.Ssid, &pktlen); - - // supported rates... - rate_len = rtw_get_rateset_len(cur_network->SupportedRates); - pframe = rtw_set_ie(pframe, _SUPPORTEDRATES_IE_, ((rate_len > 8)? 8: rate_len), cur_network->SupportedRates, &pktlen); - - // DS parameter set - pframe = rtw_set_ie(pframe, _DSSET_IE_, 1, (unsigned char *)&(cur_network->Configuration.DSConfig), &pktlen); - - if( (pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) - { - u32 ATIMWindow; - // IBSS Parameter Set... - //ATIMWindow = cur->Configuration.ATIMWindow; - ATIMWindow = 0; - pframe = rtw_set_ie(pframe, _IBSS_PARA_IE_, 2, (unsigned char *)(&ATIMWindow), &pktlen); - } - - - //todo: ERP IE - - - // EXTERNDED SUPPORTED RATE - if (rate_len > 8) - { - pframe = rtw_set_ie(pframe, _EXT_SUPPORTEDRATES_IE_, (rate_len - 8), (cur_network->SupportedRates + 8), &pktlen); - } - - - //todo:HT for adhoc - -_ConstructBeacon: - - if ((pktlen + TXDESC_SIZE) > 512) - { - RTW_INFO("beacon frame too large\n"); - return; - } - - *pLength = pktlen; - - //RTW_INFO("%s bcn_sz=%d\n", __FUNCTION__, pktlen); - -} - -static void ConstructPSPoll(_adapter *padapter, u8 *pframe, u32 *pLength) -{ - struct rtw_ieee80211_hdr *pwlanhdr; - u16 *fctrl; - u32 pktlen; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - /* RTW_INFO("%s\n", __FUNCTION__); */ - - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - - /* Frame control. */ - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - SetPwrMgt(fctrl); - set_frame_sub_type(pframe, WIFI_PSPOLL); - - /* AID. */ - set_duration(pframe, (pmlmeinfo->aid | 0xc000)); - - /* BSSID. */ - _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - - /* TA. */ - _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); - - *pLength = 16; -} - -static void ConstructNullFunctionData( - PADAPTER padapter, - u8 *pframe, - u32 *pLength, - u8 *StaAddr, - u8 bQoS, - u8 AC, - u8 bEosp, - u8 bForcePowerSave) -{ - struct rtw_ieee80211_hdr *pwlanhdr; - u16 *fctrl; - u32 pktlen; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct wlan_network *cur_network = &pmlmepriv->cur_network; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - - //RTW_INFO("%s:%d\n", __FUNCTION__, bForcePowerSave); - - pwlanhdr = (struct rtw_ieee80211_hdr*)pframe; - - fctrl = &pwlanhdr->frame_ctl; - *(fctrl) = 0; - if (bForcePowerSave) - { - SetPwrMgt(fctrl); - } - - switch(cur_network->network.InfrastructureMode) - { - case Ndis802_11Infrastructure: - SetToDs(fctrl); - _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, StaAddr, ETH_ALEN); - break; - case Ndis802_11APMode: - SetFrDs(fctrl); - _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, adapter_mac_addr(padapter), ETH_ALEN); - break; - case Ndis802_11IBSS: - default: - _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - break; - } - - SetSeqNum(pwlanhdr, 0); - - if (bQoS == _TRUE) { - struct rtw_ieee80211_hdr_3addr_qos *pwlanqoshdr; - - set_frame_sub_type(pframe, WIFI_QOS_DATA_NULL); - - pwlanqoshdr = (struct rtw_ieee80211_hdr_3addr_qos *)pframe; - SetPriority(&pwlanqoshdr->qc, AC); - SetEOSP(&pwlanqoshdr->qc, bEosp); - - pktlen = sizeof(struct rtw_ieee80211_hdr_3addr_qos); - } else { - set_frame_sub_type(pframe, WIFI_DATA_NULL); - - pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); - } - - *pLength = pktlen; -} - -void ConstructProbeRsp(_adapter *padapter, u8 *pframe, u32 *pLength, u8 *StaAddr, BOOLEAN bHideSSID) -{ - struct rtw_ieee80211_hdr *pwlanhdr; - u16 *fctrl; - u8 *mac, *bssid; - u32 pktlen; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - WLAN_BSSID_EX *cur_network = &(pmlmeinfo->network); - - - //RTW_INFO("%s\n", __FUNCTION__); - - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - - mac = adapter_mac_addr(padapter); - bssid = cur_network->MacAddress; - - fctrl = &(pwlanhdr->frame_ctl); - *(fctrl) = 0; - _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, mac, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, bssid, ETH_ALEN); - - SetSeqNum(pwlanhdr, 0); - set_frame_sub_type(fctrl, WIFI_PROBERSP); - - pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); - pframe += pktlen; - - if(cur_network->IELength>MAX_IE_SZ) - return; - - _rtw_memcpy(pframe, cur_network->IEs, cur_network->IELength); - pframe += cur_network->IELength; - pktlen += cur_network->IELength; - - *pLength = pktlen; -} - -#ifdef CONFIG_GTK_OL -static void ConstructGTKResponse( - PADAPTER padapter, - u8 *pframe, - u32 *pLength - ) -{ - struct rtw_ieee80211_hdr *pwlanhdr; - u16 *fctrl; - u32 pktlen; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct wlan_network *cur_network = &pmlmepriv->cur_network; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct security_priv *psecuritypriv = &padapter->securitypriv; - static u8 LLCHeader[8] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00, 0x88, 0x8E}; - static u8 GTKbody_a[11] = {0x01, 0x03, 0x00, 0x5F, 0x02, 0x03, 0x12, 0x00, 0x10, 0x42, 0x0B}; - u8 *pGTKRspPkt = pframe; - u8 EncryptionHeadOverhead = 0; - /* RTW_INFO("%s:%d\n", __FUNCTION__, bForcePowerSave); */ - - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - - fctrl = &pwlanhdr->frame_ctl; - *(fctrl) = 0; - - /* ------------------------------------------------------------------------- */ - /* MAC Header. */ - /* ------------------------------------------------------------------------- */ - SetFrameType(fctrl, WIFI_DATA); - /* set_frame_sub_type(fctrl, 0); */ - SetToDs(fctrl); - _rtw_memcpy(pwlanhdr->addr1, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, adapter_mac_addr(padapter), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - - SetSeqNum(pwlanhdr, 0); - set_duration(pwlanhdr, 0); - -#ifdef CONFIG_WAPI_SUPPORT - *pLength = sMacHdrLng; -#else - *pLength = 24; -#endif /* CONFIG_WAPI_SUPPORT */ - - /* YJ,del,120503 */ -#if 0 - /* ------------------------------------------------------------------------- */ - /* Qos Header: leave space for it if necessary. */ - /* ------------------------------------------------------------------------- */ - if (pStaQos->CurrentQosMode > QOS_DISABLE) { - SET_80211_HDR_QOS_EN(pGTKRspPkt, 1); - PlatformZeroMemory(&(Buffer[*pLength]), sQoSCtlLng); - *pLength += sQoSCtlLng; - } -#endif /* 0 */ - /* ------------------------------------------------------------------------- */ - /* Security Header: leave space for it if necessary. */ - /* ------------------------------------------------------------------------- */ - -#if 1 - switch (psecuritypriv->dot11PrivacyAlgrthm) { - case _WEP40_: - case _WEP104_: - EncryptionHeadOverhead = 4; - break; - case _TKIP_: - EncryptionHeadOverhead = 8; - break; - case _AES_: - EncryptionHeadOverhead = 8; - break; -#ifdef CONFIG_WAPI_SUPPORT - case _SMS4_: - EncryptionHeadOverhead = 18; - break; -#endif /* CONFIG_WAPI_SUPPORT */ - default: - EncryptionHeadOverhead = 0; - } - - if (EncryptionHeadOverhead > 0) { - _rtw_memset(&(pframe[*pLength]), 0, EncryptionHeadOverhead); - *pLength += EncryptionHeadOverhead; - /* SET_80211_HDR_WEP(pGTKRspPkt, 1); */ /* Suggested by CCW. */ - /* GTK's privacy bit is done by FW */ - /* SetPrivacy(fctrl); */ - } -#endif /* 1 */ - /* ------------------------------------------------------------------------- */ - /* Frame Body. */ - /* ------------------------------------------------------------------------- */ - pGTKRspPkt = (u8 *)(pframe + *pLength); - /* LLC header */ - _rtw_memcpy(pGTKRspPkt, LLCHeader, 8); - *pLength += 8; - - /* GTK element */ - pGTKRspPkt += 8; - - /* GTK frame body after LLC, part 1 */ - _rtw_memcpy(pGTKRspPkt, GTKbody_a, 11); - *pLength += 11; - pGTKRspPkt += 11; - /* GTK frame body after LLC, part 2 */ - _rtw_memset(&(pframe[*pLength]), 0, 88); - *pLength += 88; - pGTKRspPkt += 88; - -} -#endif /* CONFIG_GTK_OL */ - -/* - * Description: Get the reserved page number in Tx packet buffer. - * Retrun value: the page number. - * 2012.08.09, by tynli. - * */ -u8 -GetTxBufferRsvdPageNum8814(_adapter *Adapter, bool bWoWLANBoundary) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 RsvdPageNum=0; - u16 TxPageBndy= LAST_ENTRY_OF_TX_PKT_BUFFER_8814A; // default reseved 1 page for the IC type which is undefined. - - if(bWoWLANBoundary) - { - rtw_hal_get_def_var(Adapter, HAL_DEF_TX_PAGE_BOUNDARY_WOWLAN, (u8 *)&TxPageBndy); - } - else - { - rtw_hal_get_def_var(Adapter, HAL_DEF_TX_PAGE_BOUNDARY, (u8 *)&TxPageBndy); - } - - RsvdPageNum = LAST_ENTRY_OF_TX_PKT_BUFFER_8814A -TxPageBndy + 1; - - return RsvdPageNum; -} - - -void rtl8814_set_FwJoinBssReport_cmd(PADAPTER padapter, u8 mstatus) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - BOOLEAN bSendBeacon=_FALSE; - BOOLEAN bcn_valid = _FALSE; - u8 DLBcnCount=0; - u32 poll = 0; - u8 RegFwHwTxQCtrl; - - RTW_INFO("%s mstatus(%x)\n", __FUNCTION__,mstatus); - - if(mstatus == 1) - { - // We should set AID, correct TSF, HW seq enable before set JoinBssReport to Fw in 88/92C. - // Suggested by filen. Added by tynli. - rtw_write16(padapter, REG_BCN_PSR_RPT, (0xC000|pmlmeinfo->aid)); - // Do not set TSF again here or vWiFi beacon DMA INT will not work. - //correct_TSF(padapter, pmlmeext); - // Hw sequende enable by dedault. 2010.06.23. by tynli. - //rtw_write16(padapter, REG_NQOS_SEQ, ((pmlmeext->mgnt_seq+100)&0xFFF)); - //rtw_write8(padapter, REG_HWSEQ_CTRL, 0xFF); - - //Set REG_CR bit 8. DMA beacon by SW. - rtw_write8(padapter, REG_CR+1, rtw_read8(padapter, REG_CR + 1) | BIT0); - - /*RTW_INFO("%s-%d: enable SW BCN, REG_CR=0x%x\n", __func__, __LINE__, rtw_read32(padapter, REG_CR));*/ - - // Disable Hw protection for a time which revserd for Hw sending beacon. - // Fix download reserved page packet fail that access collision with the protection time. - // 2010.05.11. Added by tynli. - //SetBcnCtrlReg(padapter, 0, BIT3); - //SetBcnCtrlReg(padapter, BIT4, 0); - rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)&(~BIT(3))); - rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|BIT(4)); - RegFwHwTxQCtrl = rtw_read8(padapter, REG_FWHW_TXQ_CTRL + 2); - - if(RegFwHwTxQCtrl&BIT6) - { - RTW_INFO("HalDownloadRSVDPage(): There is an Adapter is sending beacon.\n"); - bSendBeacon = _TRUE; - } - - // Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame. - RegFwHwTxQCtrl &= (~BIT6); - rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, RegFwHwTxQCtrl); - - - // Clear beacon valid check bit. - rtw_hal_set_hwreg(padapter, HW_VAR_BCN_VALID, NULL); - DLBcnCount = 0; - poll = 0; - do - { - // download rsvd page. - rtw_hal_set_fw_rsvd_page(padapter, _FALSE); - DLBcnCount++; - do - { - rtw_yield_os(); - //rtw_mdelay_os(10); - // check rsvd page download OK. - rtw_hal_get_hwreg(padapter, HW_VAR_BCN_VALID, (u8*)(&bcn_valid)); - poll++; - } while (!bcn_valid && (poll%10) != 0 && !RTW_CANNOT_RUN(padapter)); - - } while (!bcn_valid && DLBcnCount <= 100 && !RTW_CANNOT_RUN(padapter)); - - //RT_ASSERT(bcn_valid, ("HalDownloadRSVDPage88ES(): 1 Download RSVD page failed!\n")); - if (RTW_CANNOT_RUN(padapter)) - ; - else if(!bcn_valid) - RTW_INFO(ADPT_FMT": 1 DL RSVD page failed! DLBcnCount:%u, poll:%u\n", - ADPT_ARG(padapter) ,DLBcnCount, poll); - else { - struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter); - pwrctl->fw_psmode_iface_id = padapter->iface_id; - RTW_INFO(ADPT_FMT": 1 DL RSVD page success! DLBcnCount:%u, poll:%u\n", - ADPT_ARG(padapter), DLBcnCount, poll); - } - // - // We just can send the reserved page twice during the time that Tx thread is stopped (e.g. pnpsetpower) - // becuase we need to free the Tx BCN Desc which is used by the first reserved page packet. - // At run time, we cannot get the Tx Desc until it is released in TxHandleInterrupt() so we will return - // the beacon TCB in the following code. 2011.11.23. by tynli. - // - //if(bcn_valid && padapter->bEnterPnpSleep) - if(0) - { - if(bSendBeacon) - { - rtw_hal_set_hwreg(padapter, HW_VAR_BCN_VALID, NULL); - DLBcnCount = 0; - poll = 0; - do - { - //SetFwRsvdPagePkt_8812(padapter, _TRUE); - rtw_hal_set_fw_rsvd_page(padapter, _TRUE); - DLBcnCount++; - - do - { - rtw_yield_os(); - //rtw_mdelay_os(10); - // check rsvd page download OK. - rtw_hal_get_hwreg(padapter, HW_VAR_BCN_VALID, (u8*)(&bcn_valid)); - poll++; - } while (!bcn_valid && (poll%10) != 0 && !RTW_CANNOT_RUN(padapter)); - } while (!bcn_valid && DLBcnCount <= 100 && !RTW_CANNOT_RUN(padapter)); - - //RT_ASSERT(bcn_valid, ("HalDownloadRSVDPage(): 2 Download RSVD page failed!\n")); - if (RTW_CANNOT_RUN(padapter)) - ; - else if(!bcn_valid) - RTW_INFO("%s: 2 Download RSVD page failed! DLBcnCount:%u, poll:%u\n", __FUNCTION__ ,DLBcnCount, poll); - else - RTW_INFO("%s: 2 Download RSVD success! DLBcnCount:%u, poll:%u\n", __FUNCTION__, DLBcnCount, poll); - } - } - - // Enable Bcn - //SetBcnCtrlReg(padapter, BIT3, 0); - //SetBcnCtrlReg(padapter, 0, BIT4); - rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|BIT(3)); - rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)&(~BIT(4))); - - - // To make sure that if there exists an adapter which would like to send beacon. - // If exists, the origianl value of 0x422[6] will be 1, we should check this to - // prevent from setting 0x422[6] to 0 after download reserved page, or it will cause - // the beacon cannot be sent by HW. - // 2010.06.23. Added by tynli. - if(bSendBeacon) - { - RegFwHwTxQCtrl |= BIT6; - rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, RegFwHwTxQCtrl); - - } - - // - // Update RSVD page location H2C to Fw. - // - if(bcn_valid) - { - rtw_hal_set_hwreg(padapter, HW_VAR_BCN_VALID, NULL); - RTW_INFO("Set RSVD page location to Fw.\n"); - //FillH2CCmd88E(Adapter, H2C_88E_RSVDPAGE, H2C_RSVDPAGE_LOC_LENGTH, pMgntInfo->u1RsvdPageLoc); - } - - // Do not enable HW DMA BCN or it will cause Pcie interface hang by timing issue. 2011.11.24. by tynli. - //if(!padapter->bEnterPnpSleep) - { -#ifndef RTL8814AE_SW_BCN - // Clear CR[8] or beacon packet will not be send to TxBuf anymore. - rtw_write8(padapter, REG_CR+1, rtw_read8(padapter, REG_CR + 1)&~(BIT0)); - /*RTW_INFO("%s-%d: disable SW BCN, REG_CR=0x%x\n", __func__, __LINE__, rtw_read32(padapter, REG_CR));*/ -#endif - } - } -} - -#ifdef CONFIG_P2P_PS -void rtl8814_set_p2p_ps_offload_cmd(_adapter* padapter, u8 p2p_ps_state) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); - struct wifidirect_info *pwdinfo = &( padapter->wdinfo ); - u8 *p2p_ps_offload = (u8 *)&pHalData->p2p_ps_offload; - u8 i; - -#if 1 - switch(p2p_ps_state) - { - case P2P_PS_DISABLE: - RTW_INFO("P2P_PS_DISABLE \n"); - _rtw_memset(p2p_ps_offload, 0, 1); - break; - case P2P_PS_ENABLE: - RTW_INFO("P2P_PS_ENABLE \n"); - // update CTWindow value. - if( pwdinfo->ctwindow > 0 ) - { - SET_8814A_H2CCMD_P2P_PS_OFFLOAD_CTWINDOW_EN(p2p_ps_offload, 1); - rtw_write8(padapter, REG_P2P_CTWIN, pwdinfo->ctwindow); - } - - // hw only support 2 set of NoA - for( i=0 ; inoa_num ; i++) - { - // To control the register setting for which NOA - rtw_write8(padapter, REG_NOA_DESC_SEL, (i << 4)); - if(i == 0) { - SET_8814A_H2CCMD_P2P_PS_OFFLOAD_NOA0_EN(p2p_ps_offload, 1); - } else { - SET_8814A_H2CCMD_P2P_PS_OFFLOAD_NOA1_EN(p2p_ps_offload, 1); - } - - // config P2P NoA Descriptor Register - //RTW_INFO("%s(): noa_duration = %x\n",__FUNCTION__,pwdinfo->noa_duration[i]); - rtw_write32(padapter, REG_NOA_DESC_DURATION, pwdinfo->noa_duration[i]); - - //RTW_INFO("%s(): noa_interval = %x\n",__FUNCTION__,pwdinfo->noa_interval[i]); - rtw_write32(padapter, REG_NOA_DESC_INTERVAL, pwdinfo->noa_interval[i]); - - //RTW_INFO("%s(): start_time = %x\n",__FUNCTION__,pwdinfo->noa_start_time[i]); - rtw_write32(padapter, REG_NOA_DESC_START, pwdinfo->noa_start_time[i]); - - //RTW_INFO("%s(): noa_count = %x\n",__FUNCTION__,pwdinfo->noa_count[i]); - rtw_write8(padapter, REG_NOA_DESC_COUNT, pwdinfo->noa_count[i]); - } - - if( (pwdinfo->opp_ps == 1) || (pwdinfo->noa_num > 0) ) - { - // rst p2p circuit: reg 0x5F0 - rtw_write8(padapter, REG_P2P_RST_8814A, BIT(0)); //rst p2p 0 circuit NOA 0 - - SET_8814A_H2CCMD_P2P_PS_OFFLOAD_ENABLE(p2p_ps_offload, 1); - - if(pwdinfo->role == P2P_ROLE_GO) - { - // 1: Owner, 0: Client - SET_8814A_H2CCMD_P2P_PS_OFFLOAD_ROLE(p2p_ps_offload, 1); - SET_8814A_H2CCMD_P2P_PS_OFFLOAD_ALLSTASLEEP(p2p_ps_offload, 0); - } - else - { - // 1: Owner, 0: Client - SET_8814A_H2CCMD_P2P_PS_OFFLOAD_ROLE(p2p_ps_offload, 0); - } - - SET_8814A_H2CCMD_P2P_PS_OFFLOAD_DISCOVERY(p2p_ps_offload, 0); - } - break; - case P2P_PS_SCAN: - RTW_INFO("P2P_PS_SCAN \n"); - SET_8814A_H2CCMD_P2P_PS_OFFLOAD_DISCOVERY(p2p_ps_offload, 1); - break; - case P2P_PS_SCAN_DONE: - RTW_INFO("P2P_PS_SCAN_DONE \n"); - SET_8814A_H2CCMD_P2P_PS_OFFLOAD_DISCOVERY(p2p_ps_offload, 0); - pwdinfo->p2p_ps_state = P2P_PS_ENABLE; - break; - default: - break; - } - - RTW_INFO("P2P_PS_OFFLOAD : %x\n", p2p_ps_offload[0]); - FillH2CCmd_8814(padapter, H2C_P2P_PS_OFFLOAD, 1, p2p_ps_offload); -#endif - -} -#endif //CONFIG_P2P - -#ifdef CONFIG_TSF_RESET_OFFLOAD -/* - ask FW to Reset sync register at Beacon early interrupt -*/ -u8 rtl8814_reset_tsf(_adapter *padapter, u8 reset_port ) -{ - u8 buf[2]; - u8 res=_SUCCESS; - - s32 ret; - - if (IFACE_PORT0==reset_port) { - buf[0] = 0x1; buf[1] = 0; - } else{ - buf[0] = 0x0; buf[1] = 0x1; - } - - ret = FillH2CCmd_8814(padapter, H2C_RESET_TSF, 2, buf); - - return res; -} - -int reset_tsf(PADAPTER Adapter, u8 reset_port ) -{ - u8 reset_cnt_before = 0, reset_cnt_after = 0, loop_cnt = 0; - u32 reg_reset_tsf_cnt = (IFACE_PORT0==reset_port) ? - REG_FW_RESET_TSF_CNT_0:REG_FW_RESET_TSF_CNT_1; - u32 reg_bcncrtl = (IFACE_PORT0==reset_port) ? - REG_BCN_CTRL_1:REG_BCN_CTRL; - - rtw_scan_abort(Adapter->pbuddy_adapter); /* site survey will cause reset_tsf fail */ - reset_cnt_after = reset_cnt_before = rtw_read8(Adapter,reg_reset_tsf_cnt); - rtl8814_reset_tsf(Adapter, reset_port); - - while ((reset_cnt_after == reset_cnt_before ) && (loop_cnt < 10)) { - rtw_msleep_os(100); - loop_cnt++; - reset_cnt_after = rtw_read8(Adapter, reg_reset_tsf_cnt); - } - - return(loop_cnt >= 10) ? _FAIL : _TRUE; -} - - -#endif // CONFIG_TSF_RESET_OFFLOAD - -static void rtl8814_set_FwRsvdPage_cmd(PADAPTER padapter, PRSVDPAGE_LOC rsvdpageloc) -{ - u8 u1H2CRsvdPageParm[H2C_RSVDPAGE_LOC_LEN]={0}; - - RTW_INFO("8812au/8821/8811 RsvdPageLoc: ProbeRsp=%d PsPoll=%d Null=%d QoSNull=%d BTNull=%d\n", - rsvdpageloc->LocProbeRsp, rsvdpageloc->LocPsPoll, - rsvdpageloc->LocNullData, rsvdpageloc->LocQosNull, - rsvdpageloc->LocBTQosNull); - - SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(u1H2CRsvdPageParm, rsvdpageloc->LocProbeRsp); - SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1H2CRsvdPageParm, rsvdpageloc->LocPsPoll); - SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1H2CRsvdPageParm, rsvdpageloc->LocNullData); - SET_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(u1H2CRsvdPageParm, rsvdpageloc->LocQosNull); - SET_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(u1H2CRsvdPageParm, rsvdpageloc->LocBTQosNull); - - RTW_INFO_DUMP("u1H2CRsvdPageParm:", u1H2CRsvdPageParm, H2C_RSVDPAGE_LOC_LEN); - FillH2CCmd_8814(padapter, H2C_RSVD_PAGE, H2C_RSVDPAGE_LOC_LEN, u1H2CRsvdPageParm); -} - -#ifdef CONFIG_WOWLAN -static void rtl8814_set_FwAoacRsvdPage_cmd(PADAPTER padapter, PRSVDPAGE_LOC rsvdpageloc) -{ - struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - u8 res = 0, count = 0; -#ifdef CONFIG_WOWLAN - u8 u1H2CAoacRsvdPageParm[H2C_AOAC_RSVDPAGE_LOC_LEN]={0}; - - RTW_INFO("8192EAOACRsvdPageLoc: RWC=%d ArpRsp=%d NbrAdv=%d GtkRsp=%d GtkInfo=%d ProbeReq=%d NetworkList=%d\n", - rsvdpageloc->LocRemoteCtrlInfo, rsvdpageloc->LocArpRsp, - rsvdpageloc->LocNbrAdv, rsvdpageloc->LocGTKRsp, - rsvdpageloc->LocGTKInfo, rsvdpageloc->LocProbeReq, - rsvdpageloc->LocNetList); - -#ifdef CONFIG_PNO_SUPPORT - RTW_INFO("NLO_INFO=%d\n", rsvdpageloc->LocPNOInfo); -#endif - if (check_fwstate(pmlmepriv, _FW_LINKED)) { - SET_H2CCMD_AOAC_RSVDPAGE_LOC_REMOTE_WAKE_CTRL_INFO(u1H2CAoacRsvdPageParm, rsvdpageloc->LocRemoteCtrlInfo); - SET_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(u1H2CAoacRsvdPageParm, rsvdpageloc->LocArpRsp); - //SET_H2CCMD_AOAC_RSVDPAGE_LOC_NEIGHBOR_ADV(u1H2CAoacRsvdPageParm, rsvdpageloc->LocNbrAdv); - SET_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_RSP(u1H2CAoacRsvdPageParm, rsvdpageloc->LocGTKRsp); - SET_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_INFO(u1H2CAoacRsvdPageParm, rsvdpageloc->LocGTKInfo); -#ifdef CONFIG_GTK_OL - SET_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_EXT_MEM(u1H2CAoacRsvdPageParm, rsvdpageloc->LocGTKEXTMEM); -#endif // CONFIG_GTK_OL - } else { -#ifdef CONFIG_PNO_SUPPORT - if(!pwrpriv->pno_in_resume) { - SET_H2CCMD_AOAC_RSVDPAGE_LOC_NLO_INFO(u1H2CAoacRsvdPageParm, rsvdpageloc->LocPNOInfo); - } -#endif - } - - RT_PRINT_DATA(_module_hal_init_c_, _drv_always_, "u1H2CAoacRsvdPageParm:", u1H2CAoacRsvdPageParm, H2C_AOAC_RSVDPAGE_LOC_LEN); - FillH2CCmd_8814(padapter, H2C_AOAC_RSVD_PAGE, H2C_AOAC_RSVDPAGE_LOC_LEN, u1H2CAoacRsvdPageParm); - -#ifdef CONFIG_PNO_SUPPORT - if (!check_fwstate(pmlmepriv, WIFI_AP_STATE) && - !check_fwstate(pmlmepriv, _FW_LINKED) && - pwrpriv->pno_in_resume == _FALSE) { - - res = rtw_read8(padapter, 0x1b8); - while(res == 0 && count < 25) { - RTW_INFO("[%d] FW loc_NLOInfo: %d\n", count, res); - res = rtw_read8(padapter, 0x1b8); - count++; - rtw_msleep_os(2); - } - } -#endif // CONFIG_PNO_SUPPORT -#endif // CONFIG_WOWLAN -} -#endif - - -int rtl8814_iqk_wait(_adapter* padapter, u32 timeout_ms) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct submit_ctx *iqk_sctx = &pHalData->iqk_sctx; - - iqk_sctx->submit_time = rtw_get_current_time(); - iqk_sctx->timeout_ms = timeout_ms; - iqk_sctx->status = RTW_SCTX_SUBMITTED; - - return rtw_sctx_wait(iqk_sctx, __func__); -} - -void rtl8814_iqk_done(_adapter* padapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct submit_ctx *iqk_sctx = &pHalData->iqk_sctx; - - rtw_sctx_done(&iqk_sctx); -} - -static VOID -C2HTxBeamformingHandler_8814( - IN PADAPTER Adapter, - IN u8* CmdBuf, - IN u8 CmdLen -) -{ -#ifdef CONFIG_BEAMFORMING -#if (BEAMFORMING_SUPPORT == 1) - u8 status = CmdBuf[0] & BIT0; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct dm_struct * pDM_Odm = &pHalData->odmpriv; - /*Beamforming_CheckSoundingSuccess(Adapter, status);*/ - phydm_beamforming_end_sw(pDM_Odm, status); -#endif/*(BEAMFORMING_SUPPORT == 1)*/ -#endif /*CONFIG_BEAMFORMING*/ -} - -static VOID -C2HTxFeedbackHandler_8814( - IN PADAPTER Adapter, - IN u8 *CmdBuf, - IN u8 CmdLen -) -{ -#ifdef CONFIG_XMIT_ACK - if (GET_8814A_C2H_TX_RPT_RETRY_OVER(CmdBuf) | GET_8814A_C2H_TX_RPT_LIFE_TIME_OVER(CmdBuf)) { - rtw_ack_tx_done(&Adapter->xmitpriv, RTW_SCTX_DONE_CCX_PKT_FAIL); - } else { - rtw_ack_tx_done(&Adapter->xmitpriv, RTW_SCTX_DONE_SUCCESS); - } -#endif -} - -s32 c2h_handler_8814a(_adapter *adapter, u8 id, u8 seq, u8 plen, u8 *payload) -{ - //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - //struct dm_struct * pDM_Odm = &pHalData->odmpriv; - s32 ret = _SUCCESS; - - switch (id) { - case C2H_DBG: - RTW_INFO("[C2H], C2H_DBG!!\n"); - break; - - case C2H_TXBF: - RTW_INFO("[C2H], C2H_TXBF!!\n"); - C2HTxBeamformingHandler_8814(adapter, payload, plen); - break; - - case C2H_CCX_TX_RPT: - C2HTxFeedbackHandler_8814(adapter, payload, plen); - break; - default: - ret = _FAIL; - break; - } - - return ret; -} - -#ifdef CONFIG_BT_COEXIST - -void ConstructBtNullFunctionData( - PADAPTER padapter, - u8 *pframe, - u32 *pLength, - u8 *StaAddr, - u8 bQoS, - u8 AC, - u8 bEosp, - u8 bForcePowerSave) -{ - struct rtw_ieee80211_hdr *pwlanhdr; - u16 *fctrl; - u32 pktlen; - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - u8 bssid[ETH_ALEN]; - - /* RTW_INFO("%s:%d\n", __FUNCTION__, bForcePowerSave); */ - - pwlanhdr = (struct rtw_ieee80211_hdr *)pframe; - - if (NULL == StaAddr) { - _rtw_memcpy(bssid, adapter_mac_addr(padapter), ETH_ALEN); - StaAddr = bssid; - } - - fctrl = &pwlanhdr->frame_ctl; - *(fctrl) = 0; - if (bForcePowerSave) - SetPwrMgt(fctrl); - - SetFrDs(fctrl); - _rtw_memcpy(pwlanhdr->addr1, StaAddr, ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr2, get_my_bssid(&(pmlmeinfo->network)), ETH_ALEN); - _rtw_memcpy(pwlanhdr->addr3, adapter_mac_addr(padapter), ETH_ALEN); - - set_duration(pwlanhdr, 0); - SetSeqNum(pwlanhdr, 0); - - if (bQoS == _TRUE) { - struct rtw_ieee80211_hdr_3addr_qos *pwlanqoshdr; - - set_frame_sub_type(pframe, WIFI_QOS_DATA_NULL); - - pwlanqoshdr = (struct rtw_ieee80211_hdr_3addr_qos *)pframe; - SetPriority(&pwlanqoshdr->qc, AC); - SetEOSP(&pwlanqoshdr->qc, bEosp); - - pktlen = sizeof(struct rtw_ieee80211_hdr_3addr_qos); - } else { - set_frame_sub_type(pframe, WIFI_DATA_NULL); - - pktlen = sizeof(struct rtw_ieee80211_hdr_3addr); - } - - *pLength = pktlen; -} - - -static void SetFwRsvdPagePkt_BTCoex(PADAPTER padapter) -{ - PHAL_DATA_TYPE pHalData; - struct xmit_frame *pcmdframe; - struct pkt_attrib *pattrib; - struct xmit_priv *pxmitpriv; - struct mlme_ext_priv *pmlmeext; - struct mlme_ext_info *pmlmeinfo; - struct pwrctrl_priv *pwrctl; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - u32 BeaconLength = 0; - u32 NullDataLength = 0, QosNullLength = 0, BTQosNullLength = 0; - u32 ProbeReqLength = 0; - u8 *ReservedPagePacket; - u8 TxDescLen = TXDESC_SIZE, TxDescOffset = TXDESC_OFFSET; - u8 TotalPageNum = 0, CurtPktPageNum = 0, RsvdPageNum = 0; - u16 BufIndex, PageSize = PAGE_SIZE_TX_8814; - u32 TotalPacketLen, MaxRsvdPageBufSize = 0; - RSVDPAGE_LOC RsvdPageLoc; - - pHalData = GET_HAL_DATA(padapter); - - pxmitpriv = &padapter->xmitpriv; - pmlmeext = &padapter->mlmeextpriv; - pmlmeinfo = &pmlmeext->mlmext_info; - pwrctl = adapter_to_pwrctl(padapter); - - //RsvdPageNum = BCNQ_PAGE_NUM_8723B + WOWLAN_PAGE_NUM_8723B; - - RsvdPageNum = BCNQ_PAGE_NUM_8814; - MaxRsvdPageBufSize = RsvdPageNum*PageSize; - - pcmdframe = rtw_alloc_cmdxmitframe(pxmitpriv); - if (pcmdframe == NULL) { - RTW_INFO("%s: alloc ReservedPagePacket fail!\n", __FUNCTION__); - return; - } - - ReservedPagePacket = pcmdframe->buf_addr; - _rtw_memset(&RsvdPageLoc, 0, sizeof(RSVDPAGE_LOC)); - - /* 3 (1) beacon */ - BufIndex = TxDescOffset; - ConstructBeacon(padapter, &ReservedPagePacket[BufIndex], &BeaconLength); - - /* When we count the first page size, we need to reserve description size for the RSVD */ - /* packet, it will be filled in front of the packet in TXPKTBUF. */ - CurtPktPageNum = (u8)PageNum(TxDescLen + BeaconLength, PageSize); - - /* If we don't add 1 more page, the WOWLAN function has a problem. Baron thinks it's a bug of firmware */ - if (CurtPktPageNum == 1) - CurtPktPageNum += 1; - TotalPageNum += CurtPktPageNum; - - BufIndex += (CurtPktPageNum * PageSize); - - /* Jump to lastest third page *;RESERV 2 PAGES for TxBF NDPA */ - if (BufIndex < (MaxRsvdPageBufSize - PageSize)) { - BufIndex = TxDescOffset + (MaxRsvdPageBufSize - PageSize); - TotalPageNum = BCNQ_PAGE_NUM_8814-1; - - } - - /* 3 (6) BT Qos null data */ - RsvdPageLoc.LocBTQosNull = TotalPageNum; - ConstructBtNullFunctionData( - padapter, - &ReservedPagePacket[BufIndex], - &BTQosNullLength, - NULL, - _TRUE, 0, 0, _FALSE); - rtl8814a_fill_fake_txdesc(padapter, &ReservedPagePacket[BufIndex-TxDescLen], BTQosNullLength, _FALSE, _TRUE, _FALSE); - - //RTW_INFO("%s(): HW_VAR_SET_TX_CMD: BT QOS NULL DATA %p %d\n", - // __FUNCTION__, &ReservedPagePacket[BufIndex-TxDescLen], (BTQosNullLength+TxDescLen)); - - CurtPktPageNum = (u8)PageNum(TxDescLen + BTQosNullLength,PageSize); - - TotalPageNum += CurtPktPageNum; - - TotalPacketLen = BufIndex + BTQosNullLength; - if(TotalPacketLen > MaxRsvdPageBufSize) - { - RTW_INFO("%s(): ERROR: The rsvd page size is not enough!!TotalPacketLen %d, MaxRsvdPageBufSize %d\n",__FUNCTION__, - TotalPacketLen,MaxRsvdPageBufSize); - goto error; - } - else - { - // update attribute - pattrib = &pcmdframe->attrib; - update_mgntframe_attrib(padapter, pattrib); - pattrib->qsel = QSLT_BEACON; - pattrib->pktlen = pattrib->last_txcmdsz = TotalPacketLen - TxDescOffset; -#ifdef CONFIG_PCI_HCI - dump_mgntframe(padapter, pcmdframe); -#else - dump_mgntframe_and_wait(padapter, pcmdframe, 100); -#endif - } - - RTW_INFO("%s: Set RSVD page location to Fw ,TotalPacketLen(%d), TotalPageNum(%d)\n", __FUNCTION__,TotalPacketLen,TotalPageNum); - if(check_fwstate(pmlmepriv, _FW_LINKED)) { - rtl8814_set_FwRsvdPage_cmd(padapter, &RsvdPageLoc); - #ifdef CONFIG_WOWLAN - rtl8814_set_FwAoacRsvdPage_cmd(padapter, &RsvdPageLoc); - #endif - } - - return; - -error: - - rtw_free_xmitframe(pxmitpriv, pcmdframe); -} - - -void rtl8812a_download_BTCoex_AP_mode_rsvd_page(PADAPTER padapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); - BOOLEAN bRecover = _FALSE; - BOOLEAN bcn_valid = _FALSE; - u8 DLBcnCount=0; - u32 poll = 0; - u8 val8; - u8 v8; - - RTW_INFO("+" FUNC_ADPT_FMT ": iface_type=%d", - FUNC_ADPT_ARG(padapter), get_iface_type(padapter)); - - // We should set AID, correct TSF, HW seq enable before set JoinBssReport to Fw in 88/92C. - // Suggested by filen. Added by tynli. - rtw_write16(padapter, REG_BCN_PSR_RPT, (0xC000|pmlmeinfo->aid)); - - // set REG_CR bit 8 - v8 = rtw_read8(padapter, REG_CR+1); - v8 |= BIT(0); // ENSWBCN - rtw_write8(padapter, REG_CR+1, v8); - - // Disable Hw protection for a time which revserd for Hw sending beacon. - // Fix download reserved page packet fail that access collision with the protection time. - // 2010.05.11. Added by tynli. - val8 = rtw_read8(padapter, REG_BCN_CTRL); - val8 &= ~BIT(3); - val8 |= BIT(4); - rtw_write8(padapter, REG_BCN_CTRL, val8); - - // Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame. - if (pHalData->RegFwHwTxQCtrl & BIT(6)) - bRecover = _TRUE; - - // To tell Hw the packet is not a real beacon frame. - rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, pHalData->RegFwHwTxQCtrl & ~BIT(6)); - pHalData->RegFwHwTxQCtrl &= ~BIT(6); - - // Clear beacon valid check bit. - rtw_hal_set_hwreg(padapter, HW_VAR_BCN_VALID, NULL); - rtw_hal_set_hwreg(padapter, HW_VAR_DL_BCN_SEL, NULL); - - DLBcnCount = 0; - poll = 0; - do - { - SetFwRsvdPagePkt_BTCoex(padapter); - DLBcnCount++; - do - { - rtw_yield_os(); - //rtw_mdelay_os(10); - // check rsvd page download OK. - rtw_hal_get_hwreg(padapter, HW_VAR_BCN_VALID, (u8*)(&bcn_valid)); - poll++; - } while (!bcn_valid && (poll%10) != 0 && !RTW_CANNOT_RUN(padapter)); - - } while (!bcn_valid && DLBcnCount <= 100 && !RTW_CANNOT_RUN(padapter)); - - if (RTW_CANNOT_RUN(padapter)) - ; - else if(!bcn_valid) - RTW_INFO(ADPT_FMT": 1 DL RSVD page failed! DLBcnCount:%u, poll:%u\n", - ADPT_ARG(padapter) ,DLBcnCount, poll); - else { - struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter); - pwrctl->fw_psmode_iface_id = padapter->iface_id; - RTW_INFO(ADPT_FMT": 1 DL RSVD page success! DLBcnCount:%u, poll:%u\n", - ADPT_ARG(padapter), DLBcnCount, poll); - } - - // 2010.05.11. Added by tynli. - val8 = rtw_read8(padapter, REG_BCN_CTRL); - val8 |= BIT(3); - val8 &= ~BIT(4); - rtw_write8(padapter, REG_BCN_CTRL, val8); - - // To make sure that if there exists an adapter which would like to send beacon. - // If exists, the origianl value of 0x422[6] will be 1, we should check this to - // prevent from setting 0x422[6] to 0 after download reserved page, or it will cause - // the beacon cannot be sent by HW. - // 2010.06.23. Added by tynli. - if(bRecover) - { - rtw_write8(padapter, REG_FWHW_TXQ_CTRL+2, pHalData->RegFwHwTxQCtrl | BIT(6)); - pHalData->RegFwHwTxQCtrl |= BIT(6); - } - - // Clear CR[8] or beacon packet will not be send to TxBuf anymore. -#ifndef RTL8814AE_SW_BCN - v8 = rtw_read8(padapter, REG_CR+1); - v8 &= ~BIT(0); // ~ENSWBCN - rtw_write8(padapter, REG_CR+1, v8); -#endif - -} - -#endif // CONFIG_BT_COEXIST - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/rtl8814a_dm.c b/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/rtl8814a_dm.c deleted file mode 100644 index 42bc23df6d4afb..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/rtl8814a_dm.c +++ /dev/null @@ -1,407 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -//============================================================ -// Description: -// -// This file is for 92CE/92CU dynamic mechanism only -// -// -//============================================================ -#define _RTL8814A_DM_C_ - -//============================================================ -// include files -//============================================================ -//#include -#include - -//============================================================ -// Global var -//============================================================ - -//static VOID -//dm_CheckProtection( -// IN PADAPTER Adapter -// ) -//{ -#if 0 - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - u1Byte CurRate, RateThreshold; - - if(pMgntInfo->pHTInfo->bCurBW40MHz) - RateThreshold = MGN_MCS1; - else - RateThreshold = MGN_MCS3; - - if(Adapter->TxStats.CurrentInitTxRate <= RateThreshold) { - pMgntInfo->bDmDisableProtect = TRUE; - DbgPrint("Forced disable protect: %x\n", Adapter->TxStats.CurrentInitTxRate); - } else { - pMgntInfo->bDmDisableProtect = FALSE; - DbgPrint("Enable protect: %x\n", Adapter->TxStats.CurrentInitTxRate); - } -#endif -//} - -#ifdef CONFIG_SUPPORT_HW_WPS_PBC -static void dm_CheckPbcGPIO(_adapter *padapter) -{ - u8 tmp1byte; - u8 bPbcPressed = _FALSE; - - if(!padapter->registrypriv.hw_wps_pbc) - return; - -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - - tmp1byte = rtw_read8(padapter, REG_GPIO_EXT_CTRL_8814A); - //DBG_871X("CheckPbcGPIO - %x\n", tmp1byte); - - if (tmp1byte == 0xff) - return ; - else if (tmp1byte & BIT3) { - // Here we only set bPbcPressed to TRUE. After trigger PBC, the variable will be set to FALSE - DBG_871X("CheckPbcGPIO - PBC is pressed\n"); - bPbcPressed = _TRUE; - } - -#endif - - if (_TRUE == bPbcPressed) { - /* Here we only set bPbcPressed to true */ - /* After trigger PBC, the variable will be set to false */ - RTW_INFO("CheckPbcGPIO - PBC is pressed\n"); - - rtw_request_wps_pbc_event(padapter); - } -} -#endif /* #ifdef CONFIG_SUPPORT_HW_WPS_PBC */ - -#ifdef CONFIG_PCI_HCI -/* - * Description: - * Perform interrupt migration dynamically to reduce CPU utilization. - * - * Assumption: - * 1. Do not enable migration under WIFI test. - * - * Created by Roger, 2010.03.05. - * */ -VOID -dm_InterruptMigration( - IN PADAPTER Adapter -) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); - BOOLEAN bCurrentIntMt, bCurrentACIntDisable; - BOOLEAN IntMtToSet = _FALSE; - BOOLEAN ACIntToSet = _FALSE; - - /* Retrieve current interrupt migration and Tx four ACs IMR settings first. */ - bCurrentIntMt = pHalData->bInterruptMigration; - bCurrentACIntDisable = pHalData->bDisableTxInt; - - /* */ - /* Currently we use busy traffic for reference instead of RxIntOK counts to prevent non-linear Rx statistics */ - /* when interrupt migration is set before. 2010.03.05. */ - /* */ - if (!Adapter->registrypriv.wifi_spec && - (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) && - pmlmepriv->LinkDetectInfo.bHigherBusyTraffic) { - IntMtToSet = _TRUE; - - /* To check whether we should disable Tx interrupt or not. */ - if (pmlmepriv->LinkDetectInfo.bHigherBusyRxTraffic) - ACIntToSet = _TRUE; - } - - /* Update current settings. */ - if (bCurrentIntMt != IntMtToSet) { - RTW_INFO("%s(): Update interrrupt migration(%d)\n", __FUNCTION__, IntMtToSet); - if (IntMtToSet) { - /* */ - /* Set interrrupt migration timer and corresponging Tx/Rx counter. */ - /* timer 25ns*0xfa0=100us for 0xf packets. */ - /* 2010.03.05. */ - /* */ - rtw_write32(Adapter, REG_INT_MIG, 0xff000fa0);/* 0x306:Rx, 0x307:Tx */ - pHalData->bInterruptMigration = IntMtToSet; - } else { - /* Reset all interrupt migration settings. */ - rtw_write32(Adapter, REG_INT_MIG, 0); - pHalData->bInterruptMigration = IntMtToSet; - } - } - -#if 0 - if (bCurrentACIntDisable != ACIntToSet) { - RTW_INFO("%s(): Update AC interrrupt(%d)\n", __FUNCTION__, ACIntToSet); - if (ACIntToSet) { /* Disable four ACs interrupts. */ - /* */ - /* Disable VO, VI, BE and BK four AC interrupts to gain more efficient CPU utilization. */ - /* When extremely highly Rx OK occurs, we will disable Tx interrupts. */ - /* 2010.03.05. */ - /* */ - UpdateInterruptMask8192CE(Adapter, 0, RT_AC_INT_MASKS); - pHalData->bDisableTxInt = ACIntToSet; - } else { /* Enable four ACs interrupts. */ - UpdateInterruptMask8192CE(Adapter, RT_AC_INT_MASKS, 0); - pHalData->bDisableTxInt = ACIntToSet; - } - } -#endif - -} - -#endif - -/* - * Initialize GPIO setting registers - * */ -static void -dm_InitGPIOSetting( - IN PADAPTER Adapter -) -{ - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - - u8 tmp1byte; - - tmp1byte = rtw_read8(Adapter, REG_GPIO_MUXCFG); - tmp1byte &= (GPIOSEL_GPIO | ~GPIOSEL_ENBT); - - rtw_write8(Adapter, REG_GPIO_MUXCFG, tmp1byte); -} - -/* ************************************************************ - * functions - * ************************************************************ */ -static void Init_ODM_ComInfo_8814(PADAPTER Adapter) -{ - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - struct dm_struct *pDM_Odm = &(pHalData->odmpriv); - u8 cut_ver, fab_ver; - - Init_ODM_ComInfo(Adapter); - - odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_IC_TYPE, ODM_RTL8814A); - - fab_ver = ODM_TSMC; - if(IS_A_CUT(pHalData->version_id)) - cut_ver = ODM_CUT_A; - else if(IS_B_CUT(pHalData->version_id)) - cut_ver = ODM_CUT_B; - else if(IS_C_CUT(pHalData->version_id)) - cut_ver = ODM_CUT_C; - else if(IS_D_CUT(pHalData->version_id)) - cut_ver = ODM_CUT_D; - else if(IS_E_CUT(pHalData->version_id)) - cut_ver = ODM_CUT_E; - else - cut_ver = ODM_CUT_A; - - odm_cmn_info_init(pDM_Odm,ODM_CMNINFO_FAB_VER,fab_ver); - odm_cmn_info_init(pDM_Odm,ODM_CMNINFO_CUT_VER,cut_ver); - - odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_RF_ANTENNA_TYPE, pHalData->TRxAntDivType); - - //odm_cmn_info_init(pDM_Odm, ODM_CMNINFO_IQKFWOFFLOAD, pHalData->RegIQKFWOffload); - -} - -void -rtl8814_InitHalDm( - IN PADAPTER Adapter - ) -{ - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - struct dm_struct * pDM_Odm = &(pHalData->odmpriv); - u8 i; - -#ifdef CONFIG_USB_HCI - dm_InitGPIOSetting(Adapter); -#endif //CONFIG_USB_HCI - - odm_dm_init(pDM_Odm); - - //Adapter->fix_rate = 0xFF; - -} - -VOID -rtl8814_HalDmWatchDog( - IN PADAPTER Adapter - ) -{ - BOOLEAN bFwCurrentInPSMode = _FALSE; - BOOLEAN bFwPSAwake = _TRUE; - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - struct dm_struct *pDM_Odm = &(pHalData->odmpriv); - struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(Adapter); - u8 in_lps = _FALSE; - - if (!rtw_is_hw_init_completed(Adapter)) - goto skip_dm; - -#ifdef CONFIG_LPS - bFwCurrentInPSMode = adapter_to_pwrctl(Adapter)->bFwCurrentInPSMode; - rtw_hal_get_hwreg(Adapter, HW_VAR_FWLPS_RF_ON, &bFwPSAwake); -#endif - -#ifdef CONFIG_P2P_PS - /* Fw is under p2p powersaving mode, driver should stop dynamic mechanism. */ - /* modifed by thomas. 2011.06.11. */ - if (Adapter->wdinfo.p2p_ps_mode) - bFwPSAwake = _FALSE; -#endif /* CONFIG_P2P_PS */ - - if ((rtw_is_hw_init_completed(Adapter)) - && ((!bFwCurrentInPSMode) && bFwPSAwake)) { - - rtw_hal_check_rxfifo_full(Adapter); - /* */ - /* Dynamically switch RTS/CTS protection. */ - /* */ - /* dm_CheckProtection(Adapter); */ - -#ifdef CONFIG_PCI_HCI - /* 20100630 Joseph: Disable Interrupt Migration mechanism temporarily because it degrades Rx throughput. */ - /* Tx Migration settings. */ - /* dm_InterruptMigration(Adapter); */ - - /* if(Adapter->HalFunc.TxCheckStuckHandler(Adapter)) */ - /* PlatformScheduleWorkItem(&(GET_HAL_DATA(Adapter)->HalResetWorkItem)); */ -#endif - - } - -#ifdef CONFIG_DISABLE_ODM - goto skip_dm; -#endif -#ifdef CONFIG_LPS - if (pwrpriv->bLeisurePs && bFwCurrentInPSMode && pwrpriv->pwr_mode != PS_MODE_ACTIVE) - in_lps = _TRUE; -#endif - rtw_phydm_watchdog(Adapter, in_lps); - -skip_dm: - -#ifdef CONFIG_SUPPORT_HW_WPS_PBC - /* Check GPIO to determine current Pbc status. */ - dm_CheckPbcGPIO(Adapter); -#endif - - return; -} - -void rtl8814_init_dm_priv(IN PADAPTER Adapter) -{ - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - struct dm_struct *podmpriv = &pHalData->odmpriv; - - /* _rtw_spinlock_init(&(pHalData->odm_stainfo_lock)); */ - -#ifndef CONFIG_IQK_PA_OFF /* FW has no IQK PA OFF option yet, don't offload */ - #ifdef CONFIG_BT_COEXIST - /* firmware size issue, btcoex fw doesn't support IQK offload */ - if (pHalData->EEPROMBluetoothCoexist == _FALSE) - #endif - { - pHalData->RegIQKFWOffload = 1; - rtw_sctx_init(&pHalData->iqk_sctx, 0); - } -#endif - - Init_ODM_ComInfo_8814(Adapter); - odm_init_all_timers(podmpriv ); - //PHYDM_InitDebugSetting(podmpriv); - - pHalData->CurrentTxPwrIdx = 20; - -} - -void rtl8814_deinit_dm_priv(IN PADAPTER Adapter) -{ - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - struct dm_struct *podmpriv = &pHalData->odmpriv; - /* _rtw_spinlock_free(&pHalData->odm_stainfo_lock); */ - odm_cancel_all_timers(podmpriv); -} - - -#ifdef CONFIG_ANTENNA_DIVERSITY -// Add new function to reset the state of antenna diversity before link. -// -// Compare RSSI for deciding antenna -void AntDivCompare8814(PADAPTER Adapter, WLAN_BSSID_EX *dst, WLAN_BSSID_EX *src) -{ - //PADAPTER Adapter = pDM_Odm->Adapter ; - - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - if (0 != pHalData->AntDivCfg) { - //DBG_8192C("update_network=> orgRSSI(%d)(%d),newRSSI(%d)(%d)\n",dst->Rssi,query_rx_pwr_percentage(dst->Rssi), - // src->Rssi,query_rx_pwr_percentage(src->Rssi)); - //select optimum_antenna for before linked =>For antenna diversity - if (dst->Rssi >= src->Rssi )//keep org parameter - { - src->Rssi = dst->Rssi; - src->PhyInfo.Optimum_antenna = dst->PhyInfo.Optimum_antenna; - } - } -} - -// Add new function to reset the state of antenna diversity before link. -u8 AntDivBeforeLink8814(PADAPTER Adapter ) -{ - - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct dm_struct * pDM_Odm =&pHalData->odmpriv; - SWAT_T *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table; - struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); - - // Condition that does not need to use antenna diversity. - if (pHalData->AntDivCfg==0) { - //DBG_8192C("odm_AntDivBeforeLink8192C(): No AntDiv Mechanism.\n"); - return _FALSE; - } - - if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) { - return _FALSE; - } - - - if (pDM_SWAT_Table->SWAS_NoLink_State == 0) { - //switch channel - pDM_SWAT_Table->SWAS_NoLink_State = 1; - pDM_SWAT_Table->CurAntenna = (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?AUX_ANT:MAIN_ANT; - - //PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300, pDM_SWAT_Table->CurAntenna); - rtw_antenna_select_cmd(Adapter, pDM_SWAT_Table->CurAntenna, _FALSE); - //DBG_8192C("%s change antenna to ANT_( %s ).....\n",__FUNCTION__, (pDM_SWAT_Table->CurAntenna==MAIN_ANT)?"MAIN":"AUX"); - return _TRUE; - } else { - pDM_SWAT_Table->SWAS_NoLink_State = 0; - return _FALSE; - } - -} -#endif //CONFIG_ANTENNA_DIVERSITY - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/rtl8814a_hal_init.c b/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/rtl8814a_hal_init.c deleted file mode 100644 index f1a903d68b94fd..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/rtl8814a_hal_init.c +++ /dev/null @@ -1,6769 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#define _RTL8814A_HAL_INIT_C_ - -//#include -#include -#include "phydm_antdiv.h" - -#define REG_BCN_INTERVAL 0x0554 - -extern u32 array_length_mp_8814a_fw_ap; -extern u8 array_mp_8814a_fw_ap[]; -extern u32 array_length_mp_8814a_fw_nic; -extern u8 array_mp_8814a_fw_nic[]; - -enum { - VOLTAGE_V25 = 0x03, - LDOE25_SHIFT = 28 , -}; - -//------------------------------------------------------------------------- -// -// LLT R/W/Init function -// -//------------------------------------------------------------------------- -VOID -Hal_InitEfuseVars_8814A( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - PEFUSE_HAL pEfuseHal = &(pHalData->EfuseHal); - pu2Byte ptr; - - #define INIT_EFUSE(var,value) ptr = (pu2Byte)&var; *ptr = value - - RTW_INFO("====> %s \n", __func__); - //2 Common - INIT_EFUSE(pEfuseHal->WordUnit , EFUSE_MAX_WORD_UNIT); - RTW_INFO("====>pEfuseHal->WordUnit %d \n", pEfuseHal->WordUnit); - INIT_EFUSE(pEfuseHal->BankSize , 512); - INIT_EFUSE(pEfuseHal->OOBProtectBytes, EFUSE_OOB_PROTECT_BYTES); - RTW_INFO("====>pEfuseHal->OOBProtectBytes %d \n", pEfuseHal->OOBProtectBytes); - INIT_EFUSE(pEfuseHal->ProtectBytes , EFUSE_PROTECT_BYTES_BANK_8814A); - RTW_INFO("====>pEfuseHal->ProtectBytes %d \n", pEfuseHal->ProtectBytes); - INIT_EFUSE(pEfuseHal->BankAvailBytes , (pEfuseHal->BankSize - pEfuseHal->OOBProtectBytes)); - INIT_EFUSE(pEfuseHal->TotalBankNum , EFUSE_MAX_BANK_8814A); - INIT_EFUSE(pEfuseHal->HeaderRetry , 0); - INIT_EFUSE(pEfuseHal->DataRetry , 0); - - //2 Wi-Fi - INIT_EFUSE(pEfuseHal->MaxSecNum_WiFi , EFUSE_MAX_SECTION_8814A); - RTW_INFO("====>pEfuseHal->MaxSecNum_WiFi %d \n", pEfuseHal->MaxSecNum_WiFi); - INIT_EFUSE(pEfuseHal->PhysicalLen_WiFi , EFUSE_REAL_CONTENT_LEN_8814A); - RTW_INFO("====>pEfuseHal->PhysicalLen_WiFi %d \n", pEfuseHal->PhysicalLen_WiFi); - INIT_EFUSE(pEfuseHal->LogicalLen_WiFi , EFUSE_MAP_LEN_8814A); - RTW_INFO("====>pEfuseHal->LogicalLen_WiFi %d \n", pEfuseHal->LogicalLen_WiFi); - INIT_EFUSE(pEfuseHal->BankNum_WiFi , pEfuseHal->PhysicalLen_WiFi/pEfuseHal->BankSize); - INIT_EFUSE(pEfuseHal->TotalAvailBytes_WiFi, (pEfuseHal->PhysicalLen_WiFi - (pEfuseHal->TotalBankNum * pEfuseHal->OOBProtectBytes))); - - //2 BT - INIT_EFUSE(pEfuseHal->MaxSecNum_BT , 0); - INIT_EFUSE(pEfuseHal->PhysicalLen_BT , 0); - INIT_EFUSE(pEfuseHal->LogicalLen_BT , 0); - INIT_EFUSE(pEfuseHal->BankNum_BT , 0); - INIT_EFUSE(pEfuseHal->TotalAvailBytes_BT, 0); - - RTW_INFO("%s <====\n", __func__); -} - - -s32 InitLLTTable8814A( - IN PADAPTER Adapter - ) -{ - // Auto-init LLT table ( Set REG:0x208[BIT0] ) - //Write 1 to enable HW init LLT, driver need polling to 0 meaning init success - u8 tmp1byte=0, testcnt=0; - s32 Status = _SUCCESS; - - tmp1byte = rtw_read8(Adapter, REG_AUTO_LLT_8814A); - rtw_write8(Adapter, REG_AUTO_LLT_8814A, tmp1byte|BIT0); - while(tmp1byte & BIT0) - { - tmp1byte = rtw_read8(Adapter, REG_AUTO_LLT_8814A); - rtw_mdelay_os(100); - testcnt++; - if(testcnt > 100) - { - Status = _FAIL; - break; - } - } - return Status; -} - -#ifdef CONFIG_WOWLAN -void hal_DetectWoWMode(PADAPTER pAdapter) -{ - adapter_to_pwrctl(pAdapter)->bSupportRemoteWakeup = _TRUE; -} -#endif - - -VOID -_FWDownloadEnable_8814A( - IN PADAPTER Adapter, - IN BOOLEAN enable - ) -{ - u8 tmp; - u16 u2Tmp = 0; - - if(enable) - { - // MCU firmware download enable. - u2Tmp = rtw_read16(Adapter, REG_8051FW_CTRL_8814A); - u2Tmp &= 0x3000; - u2Tmp &= (~BIT12); - u2Tmp |= BIT13; - u2Tmp |= BIT0; - rtw_write16(Adapter, REG_8051FW_CTRL_8814A, u2Tmp); - - // Clear Rom DL enable - // tmp = rtw_read8(Adapter, REG_8051FW_CTRL_8814A+2); //modify by gw 20130826(advice by hw) - // rtw_write8(Adapter, REG_8051FW_CTRL_8814A+2, tmp&0xf7);//clear bit3 - } - else - { - // MCU firmware download enable. - tmp = rtw_read8(Adapter, REG_8051FW_CTRL_8814A); - rtw_write8(Adapter, REG_8051FW_CTRL_8814A, tmp&0xfe); - } -} - -#define MAX_REG_BOLCK_SIZE 196 - -VOID -_BlockWrite_8814A( - IN PADAPTER Adapter, - IN PVOID buffer, - IN u32 buffSize - ) -{ - u32 blockSize_p1 = 4; // (Default) Phase #1 : PCI muse use 4-byte write to download FW - u32 blockSize_p2 = 8; // Phase #2 : Use 8-byte, if Phase#1 use big size to write FW. - u32 blockSize_p3 = 1; // Phase #3 : Use 1-byte, the remnant of FW image. - u32 blockCount_p1 = 0, blockCount_p2 = 0, blockCount_p3 = 0; - u32 remainSize_p1 = 0, remainSize_p2 = 0; - u8* bufferPtr = (u8*)buffer; - u32 i=0, offset=0; - -#ifdef CONFIG_USB_HCI - blockSize_p1 = MAX_REG_BOLCK_SIZE; // Use 196-byte write to download FW - // Small block size will increase USB init speed. But prevent FW download fail - // use 4-Byte instead of 196-Byte to write FW. -#endif - - //3 Phase #1 - blockCount_p1 = buffSize / blockSize_p1; - remainSize_p1 = buffSize % blockSize_p1; - - for(i = 0 ; i < blockCount_p1 ; i++){ - #if (DEV_BUS_TYPE == RT_USB_INTERFACE) - rtw_writeN(Adapter, (FW_START_ADDRESS + i * blockSize_p1), blockSize_p1,(bufferPtr + i * blockSize_p1)); - #else - rtw_write32(Adapter, (FW_START_ADDRESS + i * blockSize_p1), *((pu4Byte)(bufferPtr + i * blockSize_p1))); - #endif - } - - //3 Phase #2 - if(remainSize_p1){ - offset = blockCount_p1 * blockSize_p1; - - blockCount_p2=remainSize_p1/blockSize_p2; - remainSize_p2=remainSize_p1%blockSize_p2; - - #if (DEV_BUS_TYPE == RT_USB_INTERFACE) - for(i = 0 ; i < blockCount_p2 ; i++){ - rtw_writeN(Adapter, (FW_START_ADDRESS + offset+i*blockSize_p2), blockSize_p2,(bufferPtr + offset+i*blockSize_p2)); - } - #endif - } - - //3 Phase #3 - if(remainSize_p2) - { - offset=(blockCount_p1 * blockSize_p1)+(blockCount_p2*blockSize_p2); - - blockCount_p3 = remainSize_p2 /blockSize_p3; - - for(i = 0 ; i < blockCount_p3 ; i++){ - rtw_write8(Adapter, (FW_START_ADDRESS + offset + i), *(bufferPtr +offset+ i)); - } - } -} - -VOID -_PageWrite_8814A( - IN PADAPTER Adapter, - IN u32 page, - IN PVOID buffer, - IN u32 size - ) -{ - u8 value8; - u8 u8Page = (u8) (page & 0x07) ; - - value8 = (rtw_read8(Adapter, REG_8051FW_CTRL_8814A+2)& 0xF8 ) | u8Page ; - rtw_write8(Adapter,REG_8051FW_CTRL_8814A+2,value8); - - _BlockWrite_8814A(Adapter,buffer,size); -} - -VOID -_FillDummy_8814A( - u8* pFwBuf, - pu4Byte pFwLen - ) -{ - u32 FwLen = *pFwLen; - u8 remain = (u8)(FwLen%4); - remain = (remain==0)?0:(4-remain); - - while(remain>0) - { - pFwBuf[FwLen] = 0; - FwLen++; - remain--; - } - - *pFwLen = FwLen; -} - -VOID -_WriteFW_8814A( - IN PADAPTER Adapter, - IN PVOID buffer, - IN u32 size - ) -{ - u32 pageNums,remainSize ; - u32 page,offset; - u8* bufferPtr = (u8*)buffer; - -#ifdef CONFIG_PCI_HCI - // 20100120 Joseph: Add for 88CE normal chip. - // Fill in zero to make firmware image to dword alignment. - _FillDummy_8814A(bufferPtr, &size); -#endif //CONFIG_PCI_HCI - - pageNums = size / MAX_PAGE_SIZE ; - - //RT_ASSERT((pageNums <= 8), ("Page numbers should not greater then 8 \n")); - - remainSize = size % MAX_PAGE_SIZE; - - for(page = 0; page < pageNums; page++){ - offset = page *MAX_PAGE_SIZE; - _PageWrite_8814A(Adapter,page, (bufferPtr+offset),MAX_PAGE_SIZE); - rtw_udelay_os(2); - } - if(remainSize){ - offset = pageNums *MAX_PAGE_SIZE; - page = pageNums; - _PageWrite_8814A(Adapter,page, (bufferPtr+offset),remainSize); - } -} - -VOID -_3081Disable8814A( - IN PADAPTER Adapter - ) -{ - u8 u1bTmp; - u1bTmp = rtw_read8(Adapter, REG_SYS_FUNC_EN_8814A+1); - rtw_write8(Adapter, REG_SYS_FUNC_EN_8814A+1, u1bTmp&(~BIT2)); - - -} - -VOID -_3081Enable8814A( - IN PADAPTER Adapter - ) -{ - u8 u1bTmp; - u1bTmp = rtw_read8(Adapter, REG_SYS_FUNC_EN_8814A+1); - rtw_write8(Adapter, REG_SYS_FUNC_EN_8814A+1, u1bTmp|BIT2); -} - - -//add by ylb 20130814 for 3081 download FW -static -BOOLEAN -IDDMADownLoadFW_3081( - IN PADAPTER Adapter, - IN u32 source, - IN u32 dest, - IN u32 length, - IN BOOLEAN fs, - IN BOOLEAN ls - ) - { - u32 ch0ctrl = (DDMA_CHKSUM_EN|DDMA_CH_OWN); - u32 cnt; - u1Byte tmp; - //check if ddma ch0 is idle - cnt=20; - while(rtw_read32(Adapter, REG_DDMA_CH0CTRL)&DDMA_CH_OWN) - { - rtw_udelay_os(1000); - cnt--; - if(cnt==0) - { - RTW_INFO("IDDMADownLoadFW_3081, line%d: CNT fail\n", __LINE__); - return _FALSE; - } - } - ch0ctrl |= length & DDMA_LEN_MASK; - - //check if chksum continuous - if(fs == _FALSE){ - ch0ctrl |= DDMA_CH_CHKSUM_CNT; - } - rtw_write32(Adapter,REG_DDMA_CH0SA, source); - rtw_write32(Adapter,REG_DDMA_CH0DA, dest); - rtw_write32(Adapter,REG_DDMA_CH0CTRL, ch0ctrl); - - cnt=20; - while(rtw_read32(Adapter, REG_DDMA_CH0CTRL)&DDMA_CH_OWN) - { - rtw_udelay_os(1000); - cnt--; - if(cnt==0) - { - RTW_INFO("IDDMADownLoadFW_3081, line%d: CNT fail\n", __LINE__); - return _FALSE; - } - } - - //check checksum - if(ls == _TRUE) - { - tmp = rtw_read8(Adapter,REG_8051FW_CTRL_8814A); - if(0==(rtw_read32(Adapter,REG_DDMA_CH0CTRL)&DDMA_CHKSUM_FAIL)) - {//chksum ok - RTW_INFO("Check sum OK\n"); - //imem - if(dest < OCPBASE_DMEM_3081) - { - tmp |= IMEM_DL_RDY; - rtw_write8(Adapter,REG_8051FW_CTRL_8814A, tmp|IMEM_CHKSUM_OK); - RTW_INFO("imem check sum tmp %d\n",tmp); - } - //dmem - else - { - tmp |= DMEM_DL_RDY; - rtw_write8(Adapter,REG_8051FW_CTRL_8814A, tmp|DMEM_CHKSUM_OK); - RTW_INFO("dmem check sum tmp %d\n",tmp); - } - } - else - {//chksum fail - RTW_INFO("Check sum fail\n"); - ch0ctrl=rtw_read32(Adapter,REG_DDMA_CH0CTRL); - rtw_write32(Adapter, REG_DDMA_CH0CTRL,ch0ctrl|DDMA_RST_CHKSUM_STS); - - //imem - if(dest < OCPBASE_DMEM_3081) - { - tmp &= (~IMEM_DL_RDY); - rtw_write8(Adapter,REG_8051FW_CTRL_8814A, tmp&~IMEM_CHKSUM_OK); - } - //dmem - else - { - tmp &= (~DMEM_DL_RDY); - rtw_write8(Adapter,REG_8051FW_CTRL_8814A, tmp&~DMEM_CHKSUM_OK); - } - return _FALSE; - } - } - return _TRUE; -} - - -//add by ylb 20130814 for 3081 download FW -static -BOOLEAN -WaitDownLoadRSVDPageOK_3081( - IN PADAPTER Adapter - ) -{ - u8 BcnValidReg=0,TxBcReg=0; - u8 count=0, DLBcnCount=0; - BOOLEAN bRetValue = _FALSE; - -#if defined(CONFIG_PCI_HCI) - //Polling Beacon Queue to send Beacon - TxBcReg = rtw_read8(Adapter, REG_MGQ_TXBD_NUM_8814A+3); - count=0; - while(( count <20) && (TxBcReg & BIT4)) - { - count++; - rtw_udelay_os(10); - TxBcReg = rtw_read8(Adapter, REG_MGQ_TXBD_NUM_8814A+3); - } - - rtw_write8(Adapter, REG_MGQ_TXBD_NUM_8814A+3, TxBcReg|BIT4); -#endif //#if defined(CONFIG_PCI_HCI) - // check rsvd page download OK. - BcnValidReg = rtw_read8(Adapter, REG_FIFOPAGE_CTRL_2_8814A+1); - count=0; - while(!(BcnValidReg & BIT7) && count <20) - { - count++; - rtw_udelay_os(50); - BcnValidReg = rtw_read8(Adapter, REG_FIFOPAGE_CTRL_2_8814A+1); - } - - //Set 1 to Clear BIT7 by SW - if(BcnValidReg & BIT7) - { - rtw_write8(Adapter, REG_FIFOPAGE_CTRL_2_8814A+1, (BcnValidReg|BIT7)); - bRetValue = _TRUE; - } - else - { - RTW_INFO("WaitDownLoadRSVDPageOK_3081(): Download RSVD page failed!\n"); - bRetValue = _FALSE; - } - - return bRetValue; -} - - -VOID -SetDownLoadFwRsvdPagePkt_8814A( - IN PADAPTER Adapter, - IN PVOID buffer, - IN u32 len - ) -{ - PHAL_DATA_TYPE pHalData; - struct xmit_frame *pcmdframe; - struct xmit_priv *pxmitpriv; - struct pkt_attrib *pattrib; - //The desc lengh in Tx packet buffer of 8814A is 40 bytes. - u16 BufIndex=0, TxDescOffset = TXDESC_OFFSET; - u32 TotalPacketLen = len; - BOOLEAN bDLOK = FALSE; - u8 *ReservedPagePacket; - - pHalData = GET_HAL_DATA(Adapter); - pxmitpriv = &Adapter->xmitpriv; - -#ifdef CONFIG_BCN_ICF - pcmdframe = rtw_alloc_cmdxmitframe(pxmitpriv); -#else - pcmdframe = alloc_mgtxmitframe(pxmitpriv); -#endif - if (pcmdframe == NULL) { - return; - } - - ReservedPagePacket = pcmdframe->buf_addr; - - BufIndex = TxDescOffset; - - TotalPacketLen = len + BufIndex; - - _rtw_memcpy(&ReservedPagePacket[BufIndex], buffer, len); - //RTW_INFO("SetFwRsvdPagePkt_8814A(): HW_VAR_SET_TX_CMD: BCN, %p, %d\n", &ReservedPagePacket[BufIndex], len); - - //RTW_INFO("SetFwRsvdPagePkt(): TotalPacketLen=%d \n", TotalPacketLen); - - // update attribute - pattrib = &pcmdframe->attrib; - update_mgntframe_attrib(Adapter, pattrib); - pattrib->qsel = QSLT_BEACON; - pattrib->pktlen = pattrib->last_txcmdsz = TotalPacketLen - TxDescOffset; - - dump_mgntframe(Adapter, pcmdframe); - - //ReturnGenTempBuffer(pAdapter, pGenBufReservedPagePacket); -} - -/* ************************************************************************************ - * - * 20100209 Joseph: - * This function is used only for 92C to set REG_BCN_CTRL(0x550) register. - * We just reserve the value of the register in variable pHalData->RegBcnCtrlVal and then operate - * the value of the register via atomic operation. - * This prevents from race condition when setting this register. - * The value of pHalData->RegBcnCtrlVal is initialized in HwConfigureRTL8192CE() function. - * */ -static void SetBcnCtrlReg( - PADAPTER padapter, - u8 SetBits, - u8 ClearBits) -{ - PHAL_DATA_TYPE pHalData; - u8 RegBcnCtrlVal = 0; - - pHalData = GET_HAL_DATA(padapter); - RegBcnCtrlVal = rtw_read8(padapter, REG_BCN_CTRL); - - RegBcnCtrlVal |= SetBits; - RegBcnCtrlVal &= ~ClearBits; - -#if 0 - /* #ifdef CONFIG_SDIO_HCI */ - if (pHalData->sdio_himr & (SDIO_HIMR_TXBCNOK_MSK | SDIO_HIMR_TXBCNERR_MSK)) - RegBcnCtrlVal |= EN_TXBCN_RPT; -#endif - rtw_write8(padapter, REG_BCN_CTRL, RegBcnCtrlVal); -} - -VOID -HalROMDownloadFWRSVDPage8814A( - IN PADAPTER Adapter, - IN PVOID buffer, - IN u32 Len -) -{ - u8 u1bTmp=0, tmpReg422=0; - u8 BcnValidReg=0,TxBcReg=0; - BOOLEAN bSendBeacon=_FALSE, bDownLoadRSVDPageOK = _FALSE; - u8* pbuffer = buffer; - - BOOLEAN fs = _TRUE, ls = _FALSE; - u8 FWHeaderSize = 64, PageSize = 128 ; - u16 RsvdPageNum = 0; - u32 dmem_pkt_size = 0, iram_pkt_size = 0 ,MaxRsvdPageBufSize = 0; - u32 last_block_size = 0, filesize_ram_block = 0, pkt_offset = 0; - u32 txpktbuf_bndy = 0; - u32 BeaconHeaderInTxPacketBuf = 0, MEMOffsetInTxPacketBuf = 0; - - //Set REG_CR bit 8. DMA beacon by SW. - u1bTmp = rtw_read8(Adapter, REG_CR_8814A+1); - rtw_write8(Adapter, REG_CR_8814A+1, (u1bTmp|BIT0)); - /*RTW_INFO("%s-%d: enable SW BCN, REG_CR=0x%x\n", __func__, __LINE__, rtw_read32(Adapter, REG_CR));*/ - - // Disable Hw protection for a time which revserd for Hw sending beacon. - // Fix download reserved page packet fail that access collision with the protection time. - // 2010.05.11. Added by tynli. - SetBcnCtrlReg(Adapter, 0, BIT3); - SetBcnCtrlReg(Adapter, BIT4, 0); - - // Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame. - tmpReg422 = rtw_read8(Adapter, REG_FWHW_TXQ_CTRL_8814A+2); - rtw_write8(Adapter, REG_FWHW_TXQ_CTRL_8814A+2, tmpReg422&(~BIT6)); - - if(tmpReg422&BIT6) - { - RTW_INFO("HalROMDownloadFWRSVDPage8814A(): There is an Adapter is sending beacon.\n"); - bSendBeacon = _TRUE; - } - - //Set The head page of packet of Bcnq - rtw_hal_get_def_var(Adapter, HAL_DEF_TX_PAGE_BOUNDARY, (u16*)&txpktbuf_bndy); - rtw_write16(Adapter,REG_FIFOPAGE_CTRL_2_8814A, txpktbuf_bndy); - - /* RTW_INFO("HalROMDownloadFWRSVDPage8814A: txpktbuf_bndy=%d\n", txpktbuf_bndy); */ - - // Clear beacon valid check bit. - BcnValidReg = rtw_read8(Adapter, REG_FIFOPAGE_CTRL_2_8814A+1); - rtw_write8(Adapter, REG_FIFOPAGE_CTRL_2_8814A+1, (BcnValidReg|BIT7)); - - // Return Beacon TCB. - //ReturnBeaconQueueTcb_8814A(Adapter); - - dmem_pkt_size = (u32)GET_FIRMWARE_HDR_TOTAL_DMEM_SZ_3081(pbuffer); - iram_pkt_size = (u32)GET_FIRMWARE_HDR_IRAM_SZ_3081(pbuffer); - dmem_pkt_size += (u32)FW_CHKSUM_DUMMY_SZ; - iram_pkt_size += (u32)FW_CHKSUM_DUMMY_SZ; - - if(dmem_pkt_size + iram_pkt_size + FWHeaderSize != Len) - { - RTW_INFO("ERROR: Fw Hdr size do not match the real fw size!!\n"); - RTW_INFO("dmem_pkt_size = %d, iram_pkt_size = %d,FWHeaderSize = %d, Len = %d!!\n",dmem_pkt_size,iram_pkt_size,FWHeaderSize,Len); - return; - } - RTW_INFO("dmem_pkt_size = %d, iram_pkt_size = %d,FWHeaderSize = %d, Len = %d!!\n",dmem_pkt_size,iram_pkt_size,FWHeaderSize,Len); - - // download rsvd page. - //RsvdPageNum = GetTxBufferRsvdPageNum8814A(Adapter, _FALSE); -#ifdef CONFIG_BCN_IC - /* TODO: check tx buffer and DMA size */ - MaxRsvdPageBufSize = MAX_CMDBUF_SZ-TXDESC_OFFSET; -#else - MaxRsvdPageBufSize = MAX_XMIT_EXTBUF_SZ-TXDESC_OFFSET;//RsvdPageNum*PageSize - 40 -16 /*modified for usb*/;//TX_INFO_SIZE_8814AE; -#endif - RTW_INFO("MaxRsvdPageBufSize %d, Total len %d\n",MaxRsvdPageBufSize,Len); - - BeaconHeaderInTxPacketBuf = txpktbuf_bndy * PageSize; - MEMOffsetInTxPacketBuf = OCPBASE_TXBUF_3081 + BeaconHeaderInTxPacketBuf + 40;//TX_INFO_SIZE_8814AE; - //download DMEM - while(dmem_pkt_size > 0) - { - if(dmem_pkt_size > MaxRsvdPageBufSize) - { - filesize_ram_block = MaxRsvdPageBufSize; - ls = _FALSE; - - last_block_size = dmem_pkt_size -MaxRsvdPageBufSize; - if(last_block_size < MaxRsvdPageBufSize) - { - if(((last_block_size + 40) & 0x3F) == 0) // Multiples of 64 - filesize_ram_block -=4; - } - } - else - { - filesize_ram_block = dmem_pkt_size; - ls = _TRUE; - } - fs = (pkt_offset == 0 ? _TRUE: _FALSE); - // Return Beacon TCB. - //ReturnBeaconQueueTcb_8814A(Adapter); - //RTW_INFO("%d packet offset %d dmem_pkt_size %d\n", __LINE__,pkt_offset, dmem_pkt_size); - SetDownLoadFwRsvdPagePkt_8814A(Adapter, pbuffer+FWHeaderSize+pkt_offset, filesize_ram_block); - bDownLoadRSVDPageOK = WaitDownLoadRSVDPageOK_3081(Adapter); - if(!bDownLoadRSVDPageOK) - { - RTW_INFO("ERROR: DMEM bDownLoadRSVDPageOK is false!!\n"); - return; - } - - IDDMADownLoadFW_3081(Adapter,MEMOffsetInTxPacketBuf,OCPBASE_DMEM_3081+pkt_offset,filesize_ram_block,fs,ls); - dmem_pkt_size -= filesize_ram_block; - pkt_offset += filesize_ram_block; - } - - //download IRAM - pkt_offset = 0; - while(iram_pkt_size > 0) - { - if(iram_pkt_size > MaxRsvdPageBufSize) - { - filesize_ram_block = MaxRsvdPageBufSize; - ls = _FALSE; - - last_block_size = iram_pkt_size -MaxRsvdPageBufSize; - if(last_block_size < MaxRsvdPageBufSize) - { - if(((last_block_size + 40) & 0x3F) == 0) // Multiples of 64 - filesize_ram_block -=4; - } - } - else - { - filesize_ram_block = iram_pkt_size; - ls = _TRUE; - } - - fs = (pkt_offset == 0 ? _TRUE: _FALSE); - // Return Beacon TCB. - //ReturnBeaconQueueTcb_8814A(Adapter); - //RTW_INFO("%d packet offset %d iram_pkt_size %d\n", __LINE__,pkt_offset, iram_pkt_size); - SetDownLoadFwRsvdPagePkt_8814A(Adapter, pbuffer+Len-iram_pkt_size, filesize_ram_block); - - bDownLoadRSVDPageOK = WaitDownLoadRSVDPageOK_3081(Adapter); - if(!bDownLoadRSVDPageOK) - { - RTW_INFO("ERROR: IRAM bDownLoadRSVDPageOK is false!!\n"); - return; - } - - IDDMADownLoadFW_3081(Adapter,MEMOffsetInTxPacketBuf,OCPBASE_IMEM_3081+pkt_offset,filesize_ram_block,fs,ls); - - iram_pkt_size -= filesize_ram_block; - pkt_offset += filesize_ram_block; - } - - // Enable Bcn - SetBcnCtrlReg(Adapter, BIT3, 0); - SetBcnCtrlReg(Adapter, 0, BIT4); - - // To make sure that if there exists an adapter which would like to send beacon. - // If exists, the origianl value of 0x422[6] will be 1, we should check this to - // prevent from setting 0x422[6] to 0 after download reserved page, or it will cause - // the beacon cannot be sent by HW. - // 2010.06.23. Added by tynli. - if(bSendBeacon) - { - rtw_write8(Adapter, REG_FWHW_TXQ_CTRL_8814A+2, tmpReg422); - } - - // Do not enable HW DMA BCN or it will cause Pcie interface hang by timing issue. 2011.11.24. by tynli. - //if(!Adapter->bEnterPnpSleep) - { - // Clear CR[8] or beacon packet will not be send to TxBuf anymore. - u1bTmp = rtw_read8(Adapter, REG_CR_8814A+1); - rtw_write8(Adapter, REG_CR_8814A+1, (u1bTmp&(~BIT0))); - } - - u1bTmp=rtw_read8(Adapter, REG_8051FW_CTRL_8814A); //add by gw for flags to show the fw download ok 20130826 - if( u1bTmp&DMEM_CHKSUM_OK) - { - if(u1bTmp&IMEM_CHKSUM_OK) - { - u1Byte tem; - tem=rtw_read8(Adapter, REG_8051FW_CTRL_8814A+1); - rtw_write8(Adapter, REG_8051FW_CTRL_8814A+1,(tem|BIT6)); - } - } -} - -s32 -_FWFreeToGo8814A( - IN PADAPTER Adapter - ) -{ - u32 counter = 0; - u32 value32; - - // polling CheckSum report - do{ - rtw_mdelay_os(50); - value32 = rtw_read32(Adapter, REG_8051FW_CTRL_8814A); - - } while ((counter++ < 100) && (!(value32 & CPU_DL_READY))); - - if (counter >= 100) { - RTW_ERR("_FWFreeToGo8814A:: FW init fail ! REG_8051FW_CTRL_8814A:0x%08x .\n", value32); - return _FAIL; - } - RTW_INFO("_FWFreeToGo8814A:: FW init ok ! REG_8051FW_CTRL_8814A:0x%08x .\n", value32); - - - return _SUCCESS; -} - - -#ifdef CONFIG_FILE_FWIMG -extern char *rtw_fw_file_path; -u8 FwBuffer8814[FW_SIZE]; -#ifdef CONFIG_MP_INCLUDED -extern char *rtw_fw_mp_bt_file_path; -#endif // CONFIG_MP_INCLUDED -u8 FwBuffer[FW_SIZE]; -#endif //CONFIG_FILE_FWIMG - -s32 -FirmwareDownload8814A( - IN PADAPTER Adapter, - IN BOOLEAN bUsedWoWLANFw -) -{ - s32 rtStatus = _SUCCESS; - u8 write_fw = 0; - u32 fwdl_start_time; - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - - u8 *pFwImageFileName; - u8 *pucMappedFile = NULL; - PRT_FIRMWARE_8814 pFirmware = NULL; - u8 *pFwHdr = NULL; - u8 *pFirmwareBuf; - u32 FirmwareLen; - - - pFirmware = (PRT_FIRMWARE_8814)rtw_zmalloc(sizeof(RT_FIRMWARE_8814)); - if(!pFirmware) - { - rtStatus = _FAIL; - goto exit; - } - - #ifdef CONFIG_FILE_FWIMG - if(rtw_is_file_readable(rtw_fw_file_path) == _TRUE) - { - RTW_INFO("%s accquire FW from file:%s\n", __FUNCTION__, rtw_fw_file_path); - pFirmware->eFWSource = FW_SOURCE_IMG_FILE; - } - else - #endif //CONFIG_FILE_FWIMG - { - RTW_INFO("%s fw source from Header\n", __FUNCTION__); - pFirmware->eFWSource = FW_SOURCE_HEADER_FILE; - } - - switch(pFirmware->eFWSource) - { - case FW_SOURCE_IMG_FILE: - #ifdef CONFIG_FILE_FWIMG - rtStatus = rtw_retrieve_from_file(rtw_fw_file_path, FwBuffer8814, FW_SIZE); - pFirmware->ulFwLength = rtStatus>=0?rtStatus:0; - pFirmware->szFwBuffer = FwBuffer8814; - #endif //CONFIG_FILE_FWIMG - break; - case FW_SOURCE_HEADER_FILE: - #ifdef CONFIG_WOWLAN - if (bUsedWoWLANFw) { - pFirmware->szFwBuffer = array_mp_8814a_fw_wowlan; - pFirmware->ulFwLength = array_length_mp_8814a_fw_wowlan; - RTW_INFO("%s fw:%s, size: %d\n", __FUNCTION__, "WoWLAN", pFirmware->ulFwLength); - } else - #endif /* CONFIG_WOWLAN */ - #ifdef CONFIG_BT_COEXIST - if (pHalData->EEPROMBluetoothCoexist == _TRUE) { - pFirmware->szFwBuffer = array_mp_8814a_fw_nic_bt; - pFirmware->ulFwLength = array_length_mp_8814a_fw_nic_bt; - RTW_INFO("%s fw:%s, size: %d\n", __FUNCTION__, "NIC-BTCOEX", pFirmware->ulFwLength); - } else - #endif /* CONFIG_BT_COEXIST */ - { - //ODM_CmnInfoInit(pDM_OutSrc, ODM_CMNINFO_IC_TYPE, ODM_RTL8814A); - pFirmware->szFwBuffer = array_mp_8814a_fw_nic; - pFirmware->ulFwLength = array_length_mp_8814a_fw_nic; - RTW_INFO("%s fw:%s, size: %d\n", __FUNCTION__, "NIC", pFirmware->ulFwLength); - } - break; - } - - if (pFirmware->ulFwLength > FW_SIZE) { - rtStatus = _FAIL; - RTW_ERR("Firmware size:%u exceed %u\n", pFirmware->ulFwLength, FW_SIZE); - goto exit; - } - - pFirmwareBuf = pFirmware->szFwBuffer; - FirmwareLen = pFirmware->ulFwLength; - pFwHdr = (u8 *)pFirmware->szFwBuffer; - - pHalData->firmware_version = (u16)GET_FIRMWARE_HDR_VERSION_3081(pFwHdr); - pHalData->firmware_sub_version = (u16)GET_FIRMWARE_HDR_SUB_VER_3081(pFwHdr); - pHalData->FirmwareSignature = (u16)GET_FIRMWARE_HDR_SIGNATURE_3081(pFwHdr); - - RTW_INFO ("%s: fw_ver=%d fw_subver=%d sig=0x%x\n", - __FUNCTION__, pHalData->firmware_version, pHalData->firmware_sub_version, pHalData->FirmwareSignature); - fwdl_start_time = rtw_get_current_time(); - - _FWDownloadEnable_8814A(Adapter, _TRUE); - - _3081Disable8814A(Adapter);//add by gw 2013026 for disable mcu core - - HalROMDownloadFWRSVDPage8814A(Adapter,pFirmwareBuf,FirmwareLen); - - _3081Enable8814A(Adapter);//add by gw 2013026 for Enable mcu core - - _FWDownloadEnable_8814A(Adapter, _FALSE); - - rtStatus = _FWFreeToGo8814A(Adapter); - if (_SUCCESS != rtStatus) - goto fwdl_stat; - -fwdl_stat: - RTW_INFO("FWDL %s. write_fw:%u, %dms\n" - , (rtStatus == _SUCCESS)?"success":"fail" - , write_fw - , rtw_get_passing_time_ms(fwdl_start_time) - ); - -exit: - if (pFirmware) - rtw_mfree((u8*)pFirmware, sizeof(RT_FIRMWARE_8814)); - -#ifdef CONFIG_WOWLAN - if (adapter_to_pwrctl(Adapter)->wowlan_mode) - InitializeFirmwareVars8814(Adapter); - else - RTW_ERR("%s: wowland_mode:%d wowlan_wake_reason:%d\n", - __func__, adapter_to_pwrctl(Adapter)->wowlan_mode, - adapter_to_pwrctl(Adapter)->wowlan_wake_reason); -#endif - - return rtStatus; -} - - - -void InitializeFirmwareVars8814(PADAPTER padapter) -{ - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); - struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter); - - // Init Fw LPS related. - pwrpriv->bFwCurrentInPSMode = _FALSE; - - /* Init H2C cmd.*/ - rtw_write8(padapter, REG_HMETFR_8814A, 0x0f); - - // Init H2C counter. by tynli. 2009.12.09. - pHalData->LastHMEBoxNum = 0; -} - -/* -// -// Description: Determine the contents of H2C BT_FW_PATCH Command sent to FW. -// 2013.01.23 by tynli -// Porting from 8723B. 2013.04.01 -// -VOID -SetFwBTFwPatchCmd( - IN PADAPTER Adapter, - IN u16 FwSize - ) -{ - u8 u1BTFwPatchParm[6]={0}; - - RTW_INFO("SetFwBTFwPatchCmd_8821(): FwSize = %d\n", FwSize); - - //SET_8812_H2CCMD_BT_FW_PATCH_ENABLE(u1BTFwPatchParm, 1); - SET_H2CCMD_BT_FW_PATCH_SIZE(u1BTFwPatchParm, FwSize); - SET_H2CCMD_BT_FW_PATCH_ADDR0(u1BTFwPatchParm, 0); - SET_H2CCMD_BT_FW_PATCH_ADDR1(u1BTFwPatchParm, 0xa0); - SET_H2CCMD_BT_FW_PATCH_ADDR2(u1BTFwPatchParm, 0x10); - SET_H2CCMD_BT_FW_PATCH_ADDR3(u1BTFwPatchParm, 0x80); - - FillH2CCmd_8812(Adapter, H2C_BT_FW_PATCH, 6 , u1BTFwPatchParm); -} - - -int _CheckWLANFwPatchBTFwReady_8821A( PADAPTER Adapter ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u32 count=0; - u8 u1bTmp; - int ret = _FAIL; - -#if (DEV_BUS_TYPE == RT_SDIO_INTERFACE) - u32 txpktbuf_bndy; -#endif - - //--------------------------------------------------------- - // Check if BT FW patch procedure is ready. - //--------------------------------------------------------- - do{ - u1bTmp = rtw_read8(Adapter, REG_FW_DRV_MSG_8812); - if((u1bTmp&BIT6) || (u1bTmp&BIT7)) - { - ret = _SUCCESS; - break; - } - count++; - RT_TRACE(_module_mp_, _drv_info_,("0x81=%x, wait for 50 ms (%d) times.\n", - u1bTmp, count)); - rtw_msleep_os(50); // 50ms - }while(!((u1bTmp&BIT6) || (u1bTmp&BIT7)) && count < 50); - - RT_TRACE(_module_mp_, _drv_notice_,("_CheckWLANFwPatchBTFwReady():" - " Polling ready bit 0x88[6:7] for %d times.\n", count)); - - if(count >= 50) - { - RTW_INFO("_CheckWLANFwPatchBTFwReady():" - " Polling ready bit 0x88[6:7] FAIL!!\n"); - } - - //--------------------------------------------------------- - // Reset beacon setting to the initial value. - //--------------------------------------------------------- -#if (DEV_BUS_TYPE == RT_SDIO_INTERFACE) -#if 0 - if(!Adapter->MgntInfo.bWiFiConfg) - { - txpktbuf_bndy = TX_PAGE_BOUNDARY_8821; - } - else -#endif - {// for WMM - txpktbuf_bndy = WMM_NORMAL_TX_PAGE_BOUNDARY_8821; - } - - ret = InitLLTTable8812A(Adapter, txpktbuf_bndy); - if(_SUCCESS != ret){ - RTW_INFO("_CheckWLANFwPatchBTFwReady_8821A(): Failed to init LLT!\n"); - } - - // Init Tx boundary. - rtw_write8(Adapter, REG_TDECTRL+1, (u8)txpktbuf_bndy); -#endif - - SetBcnCtrlReg(Adapter, BIT3, 0); - SetBcnCtrlReg(Adapter, 0, BIT4); - - rtw_write8(Adapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl|BIT6)); - pHalData->RegFwHwTxQCtrl |= BIT6; - - u1bTmp = rtw_read8(Adapter, REG_CR+1); - rtw_write8(Adapter, REG_CR+1, (u1bTmp&(~BIT0))); - - return ret; -} - - -int _WriteBTFWtoTxPktBuf8812( - PADAPTER Adapter, - PVOID buffer, - u32 FwBufLen, - u8 times - ) -{ - int rtStatus = _SUCCESS; - //u32 value32; - //u8 numHQ, numLQ, numPubQ;//, txpktbuf_bndy; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - //PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - u8 BcnValidReg; - u8 count=0, DLBcnCount=0; - u8* FwbufferPtr = (u8*)buffer; - //PRT_TCB pTcb, ptempTcb; - //PRT_TX_LOCAL_BUFFER pBuf; - BOOLEAN bRecover=_FALSE; - u8* ReservedPagePacket = NULL; - u8* pGenBufReservedPagePacket = NULL; - u32 TotalPktLen,txpktbuf_bndy; - //u8 tmpReg422; - //u8 u1bTmp; - u8 *pframe; - struct xmit_priv *pxmitpriv = &(Adapter->xmitpriv); - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - u8 txdesc_offset = TXDESC_OFFSET; - u8 val8; - -#if 1//(DEV_BUS_TYPE == RT_PCI_INTERFACE) - TotalPktLen = FwBufLen; -#else - TotalPktLen = FwBufLen+pHalData->HWDescHeadLength; -#endif - if((TotalPktLen+TXDESC_OFFSET) > MAX_CMDBUF_SZ) - { - RTW_INFO(" WARNING %s => Total packet len = %d over MAX_CMDBUF_SZ:%d \n" - ,__FUNCTION__,(TotalPktLen+TXDESC_OFFSET),MAX_CMDBUF_SZ); - return _FAIL; - } - pGenBufReservedPagePacket = rtw_zmalloc(TotalPktLen);//GetGenTempBuffer (Adapter, TotalPktLen); - if (!pGenBufReservedPagePacket) - return _FAIL; - - ReservedPagePacket = (u8 *)pGenBufReservedPagePacket; - - _rtw_memset(ReservedPagePacket, 0, TotalPktLen); - -#if 1//(DEV_BUS_TYPE == RT_PCI_INTERFACE) - _rtw_memcpy(ReservedPagePacket, FwbufferPtr, FwBufLen); - -#else - PlatformMoveMemory(ReservedPagePacket+Adapter->HWDescHeadLength , FwbufferPtr, FwBufLen); -#endif - - //--------------------------------------------------------- - // 1. Pause BCN - //--------------------------------------------------------- - //Set REG_CR bit 8. DMA beacon by SW. -#if 0//(DEV_BUS_TYPE == RT_PCI_INTERFACE) - u1bTmp = rtw_read8(Adapter, REG_CR+1); - rtw_write8(Adapter, REG_CR+1, (u1bTmp|BIT0)); -#else - // Remove for temparaily because of the code on v2002 is not sync to MERGE_TMEP for USB/SDIO. - // De not remove this part on MERGE_TEMP. by tynli. - //pHalData->RegCR_1 |= (BIT0); - //rtw_write8(Adapter, REG_CR+1, pHalData->RegCR_1); -#endif - - // Disable Hw protection for a time which revserd for Hw sending beacon. - // Fix download reserved page packet fail that access collision with the protection time. - // 2010.05.11. Added by tynli. - val8 = rtw_read8(Adapter, REG_BCN_CTRL); - val8 &= ~BIT(3); - val8 |= BIT(4); - rtw_write8(Adapter, REG_BCN_CTRL, val8); - -#if 0//(DEV_BUS_TYPE == RT_PCI_INTERFACE) - tmpReg422 = rtw_read8(Adapter, REG_FWHW_TXQ_CTRL+2); - if( tmpReg422&BIT6) - bRecover = _TRUE; - rtw_write8(Adapter, REG_FWHW_TXQ_CTRL+2, tmpReg422&(~BIT6)); -#else - // Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame. - if(pHalData->RegFwHwTxQCtrl & BIT(6)) - bRecover=_TRUE; - rtw_write8(Adapter, REG_FWHW_TXQ_CTRL+2, (pHalData->RegFwHwTxQCtrl&(~BIT(6)))); - pHalData->RegFwHwTxQCtrl &= (~ BIT(6)); -#endif - - //--------------------------------------------------------- - // 2. Adjust LLT table to an even boundary. - //--------------------------------------------------------- -#if 0//(DEV_BUS_TYPE == RT_SDIO_INTERFACE) - txpktbuf_bndy = 10; // rsvd page start address should be an even value. - rtStatus = InitLLTTable8723BS(Adapter, txpktbuf_bndy); - if(_SUCCESS != rtStatus){ - RTW_INFO("_CheckWLANFwPatchBTFwReady_8723B(): Failed to init LLT!\n"); - return _FAIL; - } - - // Init Tx boundary. - rtw_write8(Adapter, REG_DWBCN0_CTRL_8723B+1, (u8)txpktbuf_bndy); -#endif - - - //--------------------------------------------------------- - // 3. Write Fw to Tx packet buffer by reseverd page. - //--------------------------------------------------------- - do - { - // download rsvd page. - // Clear beacon valid check bit. - BcnValidReg = rtw_read8(Adapter, REG_TDECTRL+2); - rtw_write8(Adapter, REG_TDECTRL+2, BcnValidReg&(~BIT(0))); - - //BT patch is big, we should set 0x209 < 0x40 suggested from Gimmy - RT_TRACE(_module_mp_, _drv_info_,("0x209:%x\n", - rtw_read8(Adapter, REG_TDECTRL+1)));//209 < 0x40 - - rtw_write8(Adapter, REG_TDECTRL+1, (0x90-0x20*(times-1))); - RTW_INFO("0x209:0x%x\n", rtw_read8(Adapter, REG_TDECTRL+1)); - RT_TRACE(_module_mp_, _drv_info_,("0x209:%x\n", - rtw_read8(Adapter, REG_TDECTRL+1))); - -#if 0 - // Acquice TX spin lock before GetFwBuf and send the packet to prevent system deadlock. - // Advertised by Roger. Added by tynli. 2010.02.22. - PlatformAcquireSpinLock(Adapter, RT_TX_SPINLOCK); - if(MgntGetFWBuffer(Adapter, &pTcb, &pBuf)) - { - PlatformMoveMemory(pBuf->Buffer.VirtualAddress, ReservedPagePacket, TotalPktLen); - CmdSendPacket(Adapter, pTcb, pBuf, TotalPktLen, DESC_PACKET_TYPE_NORMAL, _FALSE); - } - else - dbgdump("SetFwRsvdPagePkt(): MgntGetFWBuffer FAIL!!!!!!!!.\n"); - PlatformReleaseSpinLock(Adapter, RT_TX_SPINLOCK); -#else - //--------------------------------------------------------- - //tx reserved_page_packet - //---------------------------------------------------------- - if ((pmgntframe = rtw_alloc_cmdxmitframe(pxmitpriv)) == NULL) { - rtStatus = _FAIL; - goto exit; - } - //update attribute - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib(Adapter, pattrib); - - pattrib->qsel = QSLT_BEACON; - pattrib->pktlen = pattrib->last_txcmdsz = FwBufLen ; - - //_rtw_memset(pmgntframe->buf_addr, 0, TotalPktLen+txdesc_size); - //pmgntframe->buf_addr = ReservedPagePacket ; - - _rtw_memcpy( (u8*) (pmgntframe->buf_addr + txdesc_offset), ReservedPagePacket, FwBufLen); - RTW_INFO("[%d]===>TotalPktLen + TXDESC_OFFSET TotalPacketLen:%d \n", DLBcnCount, (FwBufLen + txdesc_offset)); - -#ifdef CONFIG_PCI_HCI - dump_mgntframe(Adapter, pmgntframe); -#else - dump_mgntframe_and_wait(Adapter, pmgntframe, 100); -#endif - -#endif -#if 1 - // check rsvd page download OK. - BcnValidReg = rtw_read8(Adapter, REG_TDECTRL+2); - while(!(BcnValidReg & BIT(0)) && count <200) - { - count++; - //PlatformSleepUs(10); - rtw_msleep_os(1); - BcnValidReg = rtw_read8(Adapter, REG_TDECTRL+2); - RT_TRACE(_module_mp_, _drv_notice_,("Poll 0x20A = %x\n", BcnValidReg)); - } - DLBcnCount++; - //RTW_INFO("##0x208:%08x,0x210=%08x\n",rtw_read32(Adapter, REG_TDECTRL),rtw_read32(Adapter, 0x210)); - - rtw_write8(Adapter, REG_TDECTRL+2,BcnValidReg); - - }while((!(BcnValidReg&BIT(0))) && DLBcnCount<5); - - -#endif - if(DLBcnCount >=5){ - RTW_INFO(" check rsvd page download OK DLBcnCount =%d \n",DLBcnCount); - rtStatus = _FAIL; - goto exit; - } - - if(!(BcnValidReg&BIT(0))) - { - RTW_INFO("_WriteFWtoTxPktBuf(): 1 Download RSVD page failed!\n"); - rtStatus = _FAIL; - goto exit; - } - - //--------------------------------------------------------- - // 4. Set Tx boundary to the initial value - //--------------------------------------------------------- - - - //--------------------------------------------------------- - // 5. Reset beacon setting to the initial value. - // After _CheckWLANFwPatchBTFwReady(). - //--------------------------------------------------------- - -exit: - - if(pGenBufReservedPagePacket) - { - RTW_INFO("_WriteBTFWtoTxPktBuf8723B => rtw_mfree pGenBufReservedPagePacket!\n"); - rtw_mfree((u8*)pGenBufReservedPagePacket, TotalPktLen); - } - return rtStatus; -} - -int ReservedPage_Compare(PADAPTER Adapter,PRT_MP_FIRMWARE pFirmware,u32 BTPatchSize) -{ - u8 temp,ret,lastBTsz; - u32 u1bTmp=0,address_start=0,count=0,i=0; - u8 *myBTFwBuffer = NULL; - - myBTFwBuffer = rtw_zmalloc(BTPatchSize); - if (myBTFwBuffer == NULL) - { - RTW_INFO("%s can't be executed due to the failed malloc.\n", __FUNCTION__); - Adapter->mppriv.bTxBufCkFail=_TRUE; - return _FALSE; - } - - temp=rtw_read8(Adapter,0x209); - - address_start=(temp*128)/8; - - rtw_write32(Adapter,0x140,0x00000000); - rtw_write32(Adapter,0x144,0x00000000); - rtw_write32(Adapter,0x148,0x00000000); - - rtw_write8(Adapter,0x106,0x69); - - - for(i=0;i<(BTPatchSize/8);i++) - { - rtw_write32(Adapter,0x140,address_start+5+i) ; - - //polling until reg 0x140[23]=1; - do{ - u1bTmp = rtw_read32(Adapter, 0x140); - if(u1bTmp&BIT(23)) - { - ret = _SUCCESS; - break; - } - count++; - RTW_INFO("0x140=%x, wait for 10 ms (%d) times.\n",u1bTmp, count); - rtw_msleep_os(10); // 10ms - }while(!(u1bTmp&BIT(23)) && count < 50); - - myBTFwBuffer[i*8+0]=rtw_read8(Adapter, 0x144); - myBTFwBuffer[i*8+1]=rtw_read8(Adapter, 0x145); - myBTFwBuffer[i*8+2]=rtw_read8(Adapter, 0x146); - myBTFwBuffer[i*8+3]=rtw_read8(Adapter, 0x147); - myBTFwBuffer[i*8+4]=rtw_read8(Adapter, 0x148); - myBTFwBuffer[i*8+5]=rtw_read8(Adapter, 0x149); - myBTFwBuffer[i*8+6]=rtw_read8(Adapter, 0x14a); - myBTFwBuffer[i*8+7]=rtw_read8(Adapter, 0x14b); - } - - rtw_write32(Adapter,0x140,address_start+5+BTPatchSize/8) ; - - lastBTsz=BTPatchSize%8; - - //polling until reg 0x140[23]=1; - u1bTmp=0; - count=0; - do{ - u1bTmp = rtw_read32(Adapter, 0x140); - if(u1bTmp&BIT(23)) - { - ret = _SUCCESS; - break; - } - count++; - RTW_INFO("0x140=%x, wait for 10 ms (%d) times.\n",u1bTmp, count); - rtw_msleep_os(10); // 10ms - }while(!(u1bTmp&BIT(23)) && count < 50); - - for(i=0;iszFwBuffer[i]) - { - RTW_INFO(" In direct myBTFwBuffer[%d]=%x , pFirmware->szFwBuffer=%x\n",i, myBTFwBuffer[i],pFirmware->szFwBuffer[i]); - Adapter->mppriv.bTxBufCkFail=_TRUE; - break; - } - } - - if (myBTFwBuffer != NULL) - { - rtw_mfree(myBTFwBuffer, BTPatchSize); - } - - return _TRUE; -} - -#ifdef CONFIG_RTL8821A -s32 FirmwareDownloadBT(PADAPTER padapter, PRT_MP_FIRMWARE pFirmware) -{ - s32 rtStatus; - u8 *pBTFirmwareBuf; - u32 BTFirmwareLen; - u8 download_time; - s8 i; - - - rtStatus = _SUCCESS; - pBTFirmwareBuf = NULL; - BTFirmwareLen = 0; - - // - // Patch BT Fw. Download BT RAM code to Tx packet buffer. - // - if (padapter->bBTFWReady) { - RTW_INFO("%s: BT Firmware is ready!!\n", __FUNCTION__); - return _FAIL; - } - -#ifdef CONFIG_FILE_FWIMG - if (rtw_is_file_readable(rtw_fw_mp_bt_file_path) == _TRUE) - { - RTW_INFO("%s: accquire MP BT FW from file:%s\n", __FUNCTION__, rtw_fw_mp_bt_file_path); - - rtStatus = rtw_retrieve_from_file(rtw_fw_mp_bt_file_path, FwBuffer, 0x8000); - BTFirmwareLen = rtStatus>=0?rtStatus:0; - pBTFirmwareBuf = FwBuffer; - } - else -#endif // CONFIG_FILE_FWIMG - { -#ifdef CONFIG_EMBEDDED_FWIMG - RTW_INFO("%s: Download MP BT FW from header\n", __FUNCTION__); - - pBTFirmwareBuf = (u8*)Rtl8821A_BT_MP_Patch_FW; - BTFirmwareLen = Rtl8812BFwBTImgArrayLength; - pFirmware->szFwBuffer = pBTFirmwareBuf; - pFirmware->ulFwLength = BTFirmwareLen; -#endif // CONFIG_EMBEDDED_FWIMG - } - - RTW_INFO("%s: MP BT Firmware size=%d\n", __FUNCTION__, BTFirmwareLen); - - // for h2c cam here should be set to true - padapter->bFWReady = _TRUE; - - download_time = (BTFirmwareLen + 4095) / 4096; - RTW_INFO("%s: download_time is %d\n", __FUNCTION__, download_time); - - // Download BT patch Fw. - for (i = (download_time-1); i >= 0; i--) - { - if (i == (download_time - 1)) - { - rtStatus = _WriteBTFWtoTxPktBuf8812(padapter, pBTFirmwareBuf+(4096*i), (BTFirmwareLen-(4096*i)), 1); - RTW_INFO("%s: start %d, len %d, time 1\n", __FUNCTION__, 4096*i, BTFirmwareLen-(4096*i)); - } - else - { - rtStatus = _WriteBTFWtoTxPktBuf8812(padapter, pBTFirmwareBuf+(4096*i), 4096, (download_time-i)); - RTW_INFO("%s: start %d, len 4096, time %d\n", __FUNCTION__, 4096*i, download_time-i); - } - - if (rtStatus != _SUCCESS) - { - RTW_INFO("%s: BT Firmware download to Tx packet buffer fail!\n", __FUNCTION__); - padapter->bBTFWReady = _FALSE; - return rtStatus; - } - } - - ReservedPage_Compare(padapter,pFirmware,BTFirmwareLen); - - padapter->bBTFWReady = _TRUE; - SetFwBTFwPatchCmd_8821(padapter, (u16)BTFirmwareLen); - rtStatus = _CheckWLANFwPatchBTFwReady_8821A(padapter); - - RTW_INFO("<===%s: return %s!\n", __FUNCTION__, rtStatus==_SUCCESS?"SUCCESS":"FAIL"); - return rtStatus; -} -#endif //CONFIG_RTL8821A*/ - -#ifdef CONFIG_WOWLAN -//=========================================== -// -// Description: Prepare some information to Fw for WoWLAN. -// (1) Download wowlan Fw. -// (2) Download RSVD page packets. -// (3) Enable AP offload if needed. -// -// 2011.04.12 by tynli. -// -VOID -SetFwRelatedForWoWLAN8812( - IN PADAPTER padapter, - IN u8 bHostIsGoingtoSleep -) -{ - int status=_FAIL; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - u8 bRecover = _FALSE; - // - // 1. Before WoWLAN we need to re-download WoWLAN Fw. - // - status = FirmwareDownload8812(padapter, bHostIsGoingtoSleep); - if(status != _SUCCESS) { - RTW_INFO("SetFwRelatedForWoWLAN8812(): Re-Download Firmware failed!!\n"); - return; - } else { - RTW_INFO("SetFwRelatedForWoWLAN8812(): Re-Download Firmware Success !!\n"); - } - // - // 2. Re-Init the variables about Fw related setting. - // - InitializeFirmwareVars8812(padapter); -} -#endif //CONFIG_WOWLAN - -//=========================================================== -// Efuse related code -//=========================================================== -BOOLEAN -hal_GetChnlGroup8814A( - IN u8 Channel, - OUT u8* pGroup - ) -{ - BOOLEAN bIn24G=_TRUE; - - if(Channel <= 14) - { - bIn24G=_TRUE; - - if (1 <= Channel && Channel <= 2 ) *pGroup = 0; - else if (3 <= Channel && Channel <= 5 ) *pGroup = 1; - else if (6 <= Channel && Channel <= 8 ) *pGroup = 2; - else if (9 <= Channel && Channel <= 11) *pGroup = 3; - else if (12 <= Channel && Channel <= 14) *pGroup = 4; - else - { - RT_DISP(FPHY, PHY_TXPWR_EFUSE, ("==>hal_GetChnlGroupJaguar in 2.4 G, but Channel %d in Group not found \n", Channel)); - } - } - else - { - bIn24G=_FALSE; - - if (36 <= Channel && Channel <= 42) *pGroup = 0; // 36 38 40 - else if (44 <= Channel && Channel <= 48) *pGroup = 1; // 44 46 48 - else if (50 <= Channel && Channel <= 58) *pGroup = 2; // 52 54 56 - else if (60 <= Channel && Channel <= 64) *pGroup = 3; // 60 62 64 - else if (100 <= Channel && Channel <= 106) *pGroup = 4; // 100 102 104 - else if (108 <= Channel && Channel <= 114) *pGroup = 5; // 108 110 112 - else if (116 <= Channel && Channel <= 122) *pGroup = 6; // 116 118 120 - else if (124 <= Channel && Channel <= 130) *pGroup = 7; // 124 126 128 - else if (132 <= Channel && Channel <= 138) *pGroup = 8; // 132 134 136 - else if (140 <= Channel && Channel <= 144) *pGroup = 9; // 140 142 144 - else if (149 <= Channel && Channel <= 155) *pGroup = 10; // 149 151 153 - else if (157 <= Channel && Channel <= 161) *pGroup = 11; // 157 159 161 - else if (165 <= Channel && Channel <= 171) *pGroup = 12; // 165 167 169 - else if (173 <= Channel && Channel <= 177) *pGroup = 13; // 173 175 177 - else - { - RT_DISP(FPHY, PHY_TXPWR_EFUSE, ("==>hal_GetChnlGroupJaguar in 5G, but Channel %d in Group not found \n",Channel)); - } - - } - - return bIn24G; -} - -#if 0 -static void -hal_ReadPowerValueFromPROM8814A( - IN PADAPTER Adapter, - IN PTxPowerInfo24G pwrInfo24G, - IN PTxPowerInfo5G pwrInfo5G, - IN u8* PROMContent, - IN BOOLEAN AutoLoadFail - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u32 rfPath, eeAddr=EEPROM_TX_PWR_INX_8814, group,TxCount=0; - - _rtw_memset(pwrInfo24G, 0, sizeof(TxPowerInfo24G)); - _rtw_memset(pwrInfo5G, 0, sizeof(TxPowerInfo5G)); - - /* RTW_INFO("hal_ReadPowerValueFromPROM8814A(): PROMContent[0x%x]=0x%x\n", (eeAddr+1), PROMContent[eeAddr+1]); */ - if(0xFF == PROMContent[eeAddr+1]) //YJ,add,120316 - AutoLoadFail = _TRUE; - - if(AutoLoadFail) - { - RTW_INFO("hal_ReadPowerValueFromPROM8814A(): Use Default value!\n"); - for(rfPath = 0 ; rfPath < MAX_RF_PATH ; rfPath++) - { - // 2.4G default value - for(group = 0 ; group < MAX_CHNL_GROUP_24G; group++) - { - pwrInfo24G->IndexCCK_Base[rfPath][group] = EEPROM_DEFAULT_24G_INDEX; - pwrInfo24G->IndexBW40_Base[rfPath][group] = EEPROM_DEFAULT_24G_INDEX; - } - for(TxCount=0;TxCountBW20_Diff[rfPath][0] = EEPROM_DEFAULT_24G_HT20_DIFF; - pwrInfo24G->OFDM_Diff[rfPath][0] = EEPROM_DEFAULT_24G_OFDM_DIFF; - } - else - { - pwrInfo24G->BW20_Diff[rfPath][TxCount] = EEPROM_DEFAULT_DIFF; - pwrInfo24G->BW40_Diff[rfPath][TxCount] = EEPROM_DEFAULT_DIFF; - pwrInfo24G->CCK_Diff[rfPath][TxCount] = EEPROM_DEFAULT_DIFF; - pwrInfo24G->OFDM_Diff[rfPath][TxCount] = EEPROM_DEFAULT_DIFF; - } - } - - // 5G default value - for(group = 0 ; group < MAX_CHNL_GROUP_5G; group++) - { - pwrInfo5G->IndexBW40_Base[rfPath][group] = EEPROM_DEFAULT_5G_INDEX; - } - - for(TxCount=0;TxCountOFDM_Diff[rfPath][0] = EEPROM_DEFAULT_5G_OFDM_DIFF; - pwrInfo5G->BW20_Diff[rfPath][0] = EEPROM_DEFAULT_5G_HT20_DIFF; - pwrInfo5G->BW80_Diff[rfPath][0] = EEPROM_DEFAULT_DIFF; - pwrInfo5G->BW160_Diff[rfPath][0] = EEPROM_DEFAULT_DIFF; - } - else - { - pwrInfo5G->OFDM_Diff[rfPath][TxCount] = EEPROM_DEFAULT_DIFF; - pwrInfo5G->BW20_Diff[rfPath][TxCount] = EEPROM_DEFAULT_DIFF; - pwrInfo5G->BW40_Diff[rfPath][TxCount]= EEPROM_DEFAULT_DIFF; - pwrInfo5G->BW80_Diff[rfPath][TxCount]= EEPROM_DEFAULT_DIFF; - pwrInfo5G->BW160_Diff[rfPath][TxCount] = EEPROM_DEFAULT_DIFF; - - } - } - - } - - //pHalData->bNOPG = _TRUE; - return; - } - - for(rfPath = 0 ; rfPath < MAX_RF_PATH ; rfPath++) - { - // 2.4G default value - for(group = 0 ; group < MAX_CHNL_GROUP_24G; group++) - { - pwrInfo24G->IndexCCK_Base[rfPath][group] = PROMContent[eeAddr++]; - if(pwrInfo24G->IndexCCK_Base[rfPath][group] == 0xFF) - { - pwrInfo24G->IndexCCK_Base[rfPath][group] = EEPROM_DEFAULT_24G_INDEX; - } - /* RTW_INFO("8814-2G RF-%d-G-%d CCK-Addr-%x BASE=%x\n", - rfPath, group, eeAddr-1, pwrInfo24G->IndexCCK_Base[rfPath][group]); */ - } - for(group = 0 ; group < MAX_CHNL_GROUP_24G-1; group++) - { - pwrInfo24G->IndexBW40_Base[rfPath][group] = PROMContent[eeAddr++]; - if(pwrInfo24G->IndexBW40_Base[rfPath][group] == 0xFF) - pwrInfo24G->IndexBW40_Base[rfPath][group] = EEPROM_DEFAULT_24G_INDEX; - /* RTW_INFO("8814-2G RF-%d-G-%d BW40-Addr-%x BASE=%x\n", - rfPath, group, eeAddr-1, pwrInfo24G->IndexBW40_Base[rfPath][group]); */ - } - for(TxCount=0;TxCountBW40_Diff[rfPath][TxCount] = 0; - - { - pwrInfo24G->BW20_Diff[rfPath][TxCount] = (PROMContent[eeAddr]&0xf0)>>4; - if(pwrInfo24G->BW20_Diff[rfPath][TxCount] & BIT3) //4bit sign number to 8 bit sign number - pwrInfo24G->BW20_Diff[rfPath][TxCount] |= 0xF0; - } - /* RTW_INFO("8814-2G RF-%d-SS-%d BW20-Addr-%x DIFF=%d\n", - rfPath, TxCount, eeAddr, pwrInfo24G->BW20_Diff[rfPath][TxCount]); */ - - { - pwrInfo24G->OFDM_Diff[rfPath][TxCount] = (PROMContent[eeAddr]&0x0f); - if(pwrInfo24G->OFDM_Diff[rfPath][TxCount] & BIT3) //4bit sign number to 8 bit sign number - pwrInfo24G->OFDM_Diff[rfPath][TxCount] |= 0xF0; - } - /* RTW_INFO("8814-2G RF-%d-SS-%d LGOD-Addr-%x DIFF=%d\n", - rfPath, TxCount, eeAddr, pwrInfo24G->OFDM_Diff[rfPath][TxCount]); */ - - pwrInfo24G->CCK_Diff[rfPath][TxCount] = 0; - eeAddr++; - } - else - { - - { - pwrInfo24G->BW40_Diff[rfPath][TxCount] = (PROMContent[eeAddr]&0xf0)>>4; - if(pwrInfo24G->BW40_Diff[rfPath][TxCount] & BIT3) //4bit sign number to 8 bit sign number - pwrInfo24G->BW40_Diff[rfPath][TxCount] |= 0xF0; - } - /* RTW_INFO("8814-2G RF-%d-SS-%d BW40-Addr-%x DIFF=%d\n", - rfPath, TxCount, eeAddr, pwrInfo24G->BW40_Diff[rfPath][TxCount]); */ - - - { - pwrInfo24G->BW20_Diff[rfPath][TxCount] = (PROMContent[eeAddr]&0x0f); - if(pwrInfo24G->BW20_Diff[rfPath][TxCount] & BIT3) //4bit sign number to 8 bit sign number - pwrInfo24G->BW20_Diff[rfPath][TxCount] |= 0xF0; - } - /* RTW_INFO("8814-2G RF-%d-SS-%d BW20-Addr-%x DIFF=%d\n", - rfPath, TxCount, eeAddr, pwrInfo24G->BW20_Diff[rfPath][TxCount]); */ - - eeAddr++; - - - { - pwrInfo24G->OFDM_Diff[rfPath][TxCount] = (PROMContent[eeAddr]&0xf0)>>4; - if(pwrInfo24G->OFDM_Diff[rfPath][TxCount] & BIT3) //4bit sign number to 8 bit sign number - pwrInfo24G->OFDM_Diff[rfPath][TxCount] |= 0xF0; - } - /* RTW_INFO("8814-2G RF-%d-SS-%d LGOD-Addr-%x DIFF=%d\n", - rfPath, TxCount, eeAddr, pwrInfo24G->BW20_Diff[rfPath][TxCount]); */ - - - { - pwrInfo24G->CCK_Diff[rfPath][TxCount] = (PROMContent[eeAddr]&0x0f); - if(pwrInfo24G->CCK_Diff[rfPath][TxCount] & BIT3) //4bit sign number to 8 bit sign number - pwrInfo24G->CCK_Diff[rfPath][TxCount] |= 0xF0; - } - /* RTW_INFO("8814-2G RF-%d-SS-%d CCK-Addr-%x DIFF=%d\n", - rfPath, TxCount, eeAddr, pwrInfo24G->CCK_Diff[rfPath][TxCount]); */ - - eeAddr++; - } - } - - //5G default value - for(group = 0 ; group < MAX_CHNL_GROUP_5G; group++) - { - pwrInfo5G->IndexBW40_Base[rfPath][group] = PROMContent[eeAddr++]; - if(pwrInfo5G->IndexBW40_Base[rfPath][group] == 0xFF) - pwrInfo5G->IndexBW40_Base[rfPath][group] = EEPROM_DEFAULT_DIFF; - - /* RTW_INFO("8814-5G RF-%d-G-%d BW40-Addr-%x BASE=%x\n", - rfPath, TxCount, eeAddr-1, pwrInfo5G->IndexBW40_Base[rfPath][group]); */ - } - - for(TxCount=0;TxCountBW40_Diff[rfPath][TxCount]= 0; - - - { - pwrInfo5G->BW20_Diff[rfPath][0] = (PROMContent[eeAddr]&0xf0)>>4; - if(pwrInfo5G->BW20_Diff[rfPath][TxCount] & BIT3) //4bit sign number to 8 bit sign number - pwrInfo5G->BW20_Diff[rfPath][TxCount] |= 0xF0; - } - /* RTW_INFO("8814-5G RF-%d-SS-%d BW20-Addr-%x DIFF=%d\n", - rfPath, TxCount, eeAddr, pwrInfo5G->BW20_Diff[rfPath][TxCount]); */ - - - { - pwrInfo5G->OFDM_Diff[rfPath][0] = (PROMContent[eeAddr]&0x0f); - if(pwrInfo5G->OFDM_Diff[rfPath][TxCount] & BIT3) //4bit sign number to 8 bit sign number - pwrInfo5G->OFDM_Diff[rfPath][TxCount] |= 0xF0; - } - /* RTW_INFO("8814-5G RF-%d-SS-%d LGOD-Addr-%x DIFF=%d\n", - rfPath, TxCount, eeAddr, pwrInfo5G->OFDM_Diff[rfPath][TxCount]); */ - - eeAddr++; - } - else - { - - { - pwrInfo5G->BW40_Diff[rfPath][TxCount]= (PROMContent[eeAddr]&0xf0)>>4; - if(pwrInfo5G->BW40_Diff[rfPath][TxCount] & BIT3) //4bit sign number to 8 bit sign number - pwrInfo5G->BW40_Diff[rfPath][TxCount] |= 0xF0; - } - /* RTW_INFO("8814-5G RF-%d-SS-%d BW40-Addr-%x DIFF=%d\n", - rfPath, TxCount, eeAddr, pwrInfo5G->BW40_Diff[rfPath][TxCount]); */ - - - { - pwrInfo5G->BW20_Diff[rfPath][TxCount] = (PROMContent[eeAddr]&0x0f); - if(pwrInfo5G->BW20_Diff[rfPath][TxCount] & BIT3) //4bit sign number to 8 bit sign number - pwrInfo5G->BW20_Diff[rfPath][TxCount] |= 0xF0; - } - /* RTW_INFO("8814-5G RF-%d-SS-%d BW20-Addr-%x DIFF=%d\n", - rfPath, TxCount, eeAddr, pwrInfo5G->BW20_Diff[rfPath][TxCount]); */ - - eeAddr++; - } - } - - - { - pwrInfo5G->OFDM_Diff[rfPath][1] = (PROMContent[eeAddr]&0xf0)>>4; - pwrInfo5G->OFDM_Diff[rfPath][2] = (PROMContent[eeAddr]&0x0f); - } - /* RTW_INFO("8814-5G RF-%d-SS-%d LGOD-Addr-%x DIFF=%d\n", - rfPath, 2, eeAddr, pwrInfo5G->OFDM_Diff[rfPath][2]); */ - eeAddr++; - - - pwrInfo5G->OFDM_Diff[rfPath][3] = (PROMContent[eeAddr]&0x0f); - - /* RTW_INFO("8814-5G RF-%d-SS-%d LGOD-Addr-%x DIFF=%d\n", - rfPath, 3, eeAddr, pwrInfo5G->OFDM_Diff[rfPath][3]); */ - eeAddr++; - - for(TxCount=1;TxCountOFDM_Diff[rfPath][TxCount] & BIT3) //4bit sign number to 8 bit sign number - pwrInfo5G->OFDM_Diff[rfPath][TxCount] |= 0xF0; - - /* RTW_INFO("8814-5G RF-%d-SS-%d LGOD-Addr-%x DIFF=%d\n", - rfPath, TxCount, eeAddr, pwrInfo5G->OFDM_Diff[rfPath][TxCount]); */ - } - - for(TxCount=0;TxCountBW80_Diff[rfPath][TxCount] = (PROMContent[eeAddr]&0xf0)>>4; - if(pwrInfo5G->BW80_Diff[rfPath][TxCount] & BIT3) //4bit sign number to 8 bit sign number - pwrInfo5G->BW80_Diff[rfPath][TxCount] |= 0xF0; - } - /* RTW_INFO("8814-5G RF-%d-SS-%d BW80-Addr-%x DIFF=%d\n", - rfPath, TxCount, eeAddr, pwrInfo5G->BW80_Diff[rfPath][TxCount]); */ - - - { - pwrInfo5G->BW160_Diff[rfPath][TxCount]= (PROMContent[eeAddr]&0x0f); - if(pwrInfo5G->BW160_Diff[rfPath][TxCount] & BIT3) //4bit sign number to 8 bit sign number - pwrInfo5G->BW160_Diff[rfPath][TxCount] |= 0xF0; - } - /* RTW_INFO("8814-5G RF-%d-SS-%d BW160-Addr-%x DIFF=%d\n", - rfPath, TxCount, eeAddr, pwrInfo5G->BW160_Diff[rfPath][TxCount]); */ - eeAddr++; - } - } - -} -#endif - -VOID -HALBT_InitHalVars( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); -#ifdef CONFIG_BT_COEXIST -#if (MP_DRIVER == 1) - pHalData->bt_coexist.bBtExist = 0; -#else - pHalData->bt_coexist.bBtExist = pHalData->EEPROMBluetoothCoexist; -#endif - pHalData->bt_coexist.btTotalAntNum = pHalData->EEPROMBluetoothAntNum; - pHalData->bt_coexist.btChipType = pHalData->EEPROMBluetoothType; -#endif //CONFIG_BT_COEXIST -} - - -VOID -BT_InitHalVars( - IN PADAPTER Adapter - ) -{ - u8 antNum=2, chipType; - BOOLEAN bBtExist=_FALSE; - - // HALBT_InitHalVars() must be called first - HALBT_InitHalVars(Adapter); -#if 0 - // called after HALBT_InitHalVars() - bBtExist = HALBT_GetBtExist(Adapter); - EXhalbtcoutsrc_SetBtExist(bBtExist); - chipType = HALBT_GetBtChipType(Adapter); - EXhalbtcoutsrc_SetChipType(chipType); - antNum = HALBT_GetPgAntNum(Adapter); - EXhalbtcoutsrc_SetAntNum(BT_COEX_ANT_TYPE_PG, antNum); -#endif -} - - -VOID -hal_EfuseParseBTCoexistInfo8814A( - IN PADAPTER Adapter, - IN u8* hwinfo, - IN BOOLEAN AutoLoadFail - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 tempval=0x0; - - if(!AutoLoadFail) - { - tempval = hwinfo[EEPROM_RF_BOARD_OPTION_8814]; - if( ((tempval & 0xe0)>>5) == 0x1)// [7:5] - pHalData->EEPROMBluetoothCoexist = 1; - else - pHalData->EEPROMBluetoothCoexist = 0; - pHalData->EEPROMBluetoothType = BT_RTL8814A; - - tempval = hwinfo[EEPROM_RF_BT_SETTING_8814]; - pHalData->EEPROMBluetoothAntNum = Ant_x1; - } - else - { - pHalData->EEPROMBluetoothCoexist = 0; - pHalData->EEPROMBluetoothType = BT_RTL8814A; - pHalData->EEPROMBluetoothAntNum = Ant_x1; - } - - BT_InitHalVars(Adapter); -} - -VOID -hal_ReadPROMVersion8814A( - IN PADAPTER Adapter, - IN u8* PROMContent, - IN BOOLEAN AutoloadFail - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - if(AutoloadFail){ - pHalData->EEPROMVersion = EEPROM_Default_Version; - } - else{ - pHalData->EEPROMVersion = *(u8 *)&PROMContent[EEPROM_VERSION_8814]; - if(pHalData->EEPROMVersion == 0xFF) - pHalData->EEPROMVersion = EEPROM_Default_Version; - } -} -#if 0 -void -hal_ReadTxPowerInfo8814A( - IN PADAPTER Adapter, - IN u8* PROMContent, - IN BOOLEAN AutoLoadFail - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - TxPowerInfo24G pwrInfo24G; - TxPowerInfo5G pwrInfo5G; - u8 rfPath, ch, group, TxCount; - - hal_ReadPowerValueFromPROM8814A(Adapter, &pwrInfo24G,&pwrInfo5G, PROMContent, AutoLoadFail); - - //if(!AutoLoadFail) - // pHalData->bTXPowerDataReadFromEEPORM = _TRUE; - - for(rfPath = 0 ; rfPath < MAX_RF_PATH ; rfPath++) - { - for (ch = 0 ; ch < CENTER_CH_2G_NUM ; ch++) { - hal_GetChnlGroup8814A(ch+1, &group); - - if(ch == 14-1) - { - pHalData->Index24G_CCK_Base[rfPath][ch] = pwrInfo24G.IndexCCK_Base[rfPath][5]; - pHalData->Index24G_BW40_Base[rfPath][ch] = pwrInfo24G.IndexBW40_Base[rfPath][group]; - } - else - { - pHalData->Index24G_CCK_Base[rfPath][ch] = pwrInfo24G.IndexCCK_Base[rfPath][group]; - pHalData->Index24G_BW40_Base[rfPath][ch] = pwrInfo24G.IndexBW40_Base[rfPath][group]; - } - //RTW_INFO("======= Path %d, ChannelIndex %d, Group %d=======\n",rfPath,ch, group); - //RTW_INFO("Index24G_CCK_Base[%d][%d] = 0x%x\n",rfPath,ch ,pHalData->Index24G_CCK_Base[rfPath][ch]); - //RTW_INFO("Index24G_BW40_Base[%d][%d] = 0x%x\n",rfPath,ch,pHalData->Index24G_BW40_Base[rfPath][ch]); - } - - for (ch = 0 ; ch < CENTER_CH_5G_ALL_NUM; ch++) { - hal_GetChnlGroup8814A(center_ch_5g_all[ch], &group); - - pHalData->Index5G_BW40_Base[rfPath][ch] = pwrInfo5G.IndexBW40_Base[rfPath][group]; - //RTW_INFO("======= Path %d, ChannelIndex %d, Group %d=======\n",rfPath,ch, group); - //RTW_INFO("Index5G_BW40_Base[%d][%d] = 0x%x\n",rfPath,ch,pHalData->Index5G_BW40_Base[rfPath][ch]); - } - for (ch = 0 ; ch < CENTER_CH_5G_80M_NUM; ch++) { - u8 upper, lower; - - hal_GetChnlGroup8814A(center_ch_5g_80m[ch], &group); - upper = pwrInfo5G.IndexBW40_Base[rfPath][group]; - lower = pwrInfo5G.IndexBW40_Base[rfPath][group+1]; - - pHalData->Index5G_BW80_Base[rfPath][ch] = (upper + lower) / 2; - - //RTW_INFO("======= Path %d, ChannelIndex %d, Group %d=======\n",rfPath,ch, group); - //RTW_INFO("Index5G_BW80_Base[%d][%d] = 0x%x\n",rfPath,ch,pHalData->Index5G_BW80_Base[rfPath][ch]); - } - - for(TxCount=0;TxCountCCK_24G_Diff[rfPath][TxCount]=pwrInfo24G.CCK_Diff[rfPath][TxCount]; - pHalData->OFDM_24G_Diff[rfPath][TxCount]=pwrInfo24G.OFDM_Diff[rfPath][TxCount]; - pHalData->BW20_24G_Diff[rfPath][TxCount]=pwrInfo24G.BW20_Diff[rfPath][TxCount]; - pHalData->BW40_24G_Diff[rfPath][TxCount]=pwrInfo24G.BW40_Diff[rfPath][TxCount]; - - pHalData->OFDM_5G_Diff[rfPath][TxCount]=pwrInfo5G.OFDM_Diff[rfPath][TxCount]; - pHalData->BW20_5G_Diff[rfPath][TxCount]=pwrInfo5G.BW20_Diff[rfPath][TxCount]; - pHalData->BW40_5G_Diff[rfPath][TxCount]=pwrInfo5G.BW40_Diff[rfPath][TxCount]; - pHalData->BW80_5G_Diff[rfPath][TxCount]=pwrInfo5G.BW80_Diff[rfPath][TxCount]; -//#if DBG -#if 0 - RTW_INFO("--------------------------------------- 2.4G ---------------------------------------\n"); - RTW_INFO("CCK_24G_Diff[%d][%d]= %d\n",rfPath,TxCount,pHalData->CCK_24G_Diff[rfPath][TxCount]); - RTW_INFO("OFDM_24G_Diff[%d][%d]= %d\n",rfPath,TxCount,pHalData->OFDM_24G_Diff[rfPath][TxCount]); - RTW_INFO("BW20_24G_Diff[%d][%d]= %d\n",rfPath,TxCount,pHalData->BW20_24G_Diff[rfPath][TxCount]); - RTW_INFO("BW40_24G_Diff[%d][%d]= %d\n",rfPath,TxCount,pHalData->BW40_24G_Diff[rfPath][TxCount]); - RTW_INFO("---------------------------------------- 5G ----------------------------------------\n"); - RTW_INFO("OFDM_5G_Diff[%d][%d]= %d\n",rfPath,TxCount,pHalData->OFDM_5G_Diff[rfPath][TxCount]); - RTW_INFO("BW20_5G_Diff[%d][%d]= %d\n",rfPath,TxCount,pHalData->BW20_5G_Diff[rfPath][TxCount]); - RTW_INFO("BW40_5G_Diff[%d][%d]= %d\n",rfPath,TxCount,pHalData->BW40_5G_Diff[rfPath][TxCount]); - RTW_INFO("BW80_5G_Diff[%d][%d]= %d\n",rfPath,TxCount,pHalData->BW80_5G_Diff[rfPath][TxCount]); -#endif - } - } - - - // 2010/10/19 MH Add Regulator recognize for CU. - if(!AutoLoadFail) - { - struct registry_priv *registry_par = &Adapter->registrypriv; - - pHalData->EEPROMRegulatory = (PROMContent[EEPROM_RF_BOARD_OPTION_8814]&0x7); //bit0~2 - if(PROMContent[EEPROM_RF_BOARD_OPTION_8814] == 0xFF) - pHalData->EEPROMRegulatory = (EEPROM_DEFAULT_BOARD_OPTION&0x7); //bit0~2 - } - else - { - pHalData->EEPROMRegulatory = 0; - - } - RTW_INFO("EEPROMRegulatory = 0x%x\n", pHalData->EEPROMRegulatory); - -} -#else -void -hal_ReadTxPowerInfo8814A( - IN PADAPTER Adapter, - IN u8 *PROMContent, - IN BOOLEAN AutoLoadFail -) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - TxPowerInfo24G pwrInfo24G; - TxPowerInfo5G pwrInfo5G; - - hal_load_txpwr_info(Adapter, &pwrInfo24G, &pwrInfo5G, PROMContent); - - /* 2010/10/19 MH Add Regulator recognize for CU. */ - if (!AutoLoadFail) { - struct registry_priv *registry_par = &Adapter->registrypriv; - - - if (PROMContent[EEPROM_RF_BOARD_OPTION_8814] == 0xFF) - pHalData->EEPROMRegulatory = (EEPROM_DEFAULT_BOARD_OPTION & 0x7); /* bit0~2 */ - else - pHalData->EEPROMRegulatory = (PROMContent[EEPROM_RF_BOARD_OPTION_8814] & 0x7); /* bit0~2 */ - - } else - pHalData->EEPROMRegulatory = 0; - RTW_INFO("EEPROMRegulatory = 0x%x\n", pHalData->EEPROMRegulatory); - -} -#endif - -VOID -hal_ReadBoardType8814A( - IN PADAPTER Adapter, - IN u8* PROMContent, - IN BOOLEAN AutoloadFail - ) -{ - - - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - if(!AutoloadFail) - { - pHalData->InterfaceSel = (PROMContent[EEPROM_RF_BOARD_OPTION_8814]&0xE0)>>5; - if(PROMContent[EEPROM_RF_BOARD_OPTION_8814] == 0xFF) - pHalData->InterfaceSel = (EEPROM_DEFAULT_BOARD_OPTION&0xE0)>>5; - } - else - { - pHalData->InterfaceSel = 0; - } - RTW_INFO("Board Type: 0x%2x\n", pHalData->InterfaceSel); -} - -VOID -hal_Read_TRX_antenna_8814A( - IN PADAPTER Adapter, - IN u8 *PROMContent, - IN BOOLEAN AutoloadFail - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 trx_antenna = RF_2T4R; - - if (!AutoloadFail) { - u8 trx_antenna_option = PROMContent[EEPROM_TRX_ANTENNA_OPTION_8814]; - - if (trx_antenna_option == 0xff) { - trx_antenna = RF_4T4R; - RTW_INFO("EEPROM RF set 4T4R\n"); - } else if (trx_antenna_option == 0xee) { - trx_antenna = RF_3T3R; - RTW_INFO("EEPROM RF set 3T3R\n"); - } else if (trx_antenna_option == 0x66) { - trx_antenna = RF_2T2R; - RTW_INFO("EEPROM RF set 2T2R\n"); - } else if (trx_antenna_option == 0x6f) { - trx_antenna = RF_2T4R; - RTW_INFO("EEPROM RF set 2T4R\n"); - } else { - trx_antenna = RF_2T4R; - RTW_INFO("unknown EEPROM RF set, default to 2T4R\n"); - } - } else { - trx_antenna = RF_2T4R; - RTW_INFO("AutoloadFail, default to 2T4R\n"); - } - - /* if driver doesn't set rf_config, use the value of EEPROM */ - if (Adapter->registrypriv.rf_config == RF_TYPE_MAX) { - - if (trx_antenna == RF_4T4R -#ifdef CONFIG_USB_HCI - && IS_SUPER_SPEED_USB(Adapter) -#endif /* CONFIG_USB_HCI */ - ) - Adapter->registrypriv.rf_config = RF_3T3R; - else if (trx_antenna == RF_2T4R) - Adapter->registrypriv.rf_config = RF_2T4R; - else { - Adapter->registrypriv.rf_config = RF_2T4R; - RTW_INFO("default rf type: %d\n", Adapter->registrypriv.rf_config); - } - } else { -#ifdef CONFIG_USB_HCI - if (!IS_SUPER_SPEED_USB(Adapter)) - Adapter->registrypriv.rf_config = RF_2T4R; -#endif /* CONFIG_USB_HCI */ - } - - RTW_INFO("Final rf_config: %d\n", Adapter->registrypriv.rf_config); -} - - -VOID -hal_ReadThermalMeter_8814A( - IN PADAPTER Adapter, - IN u8* PROMContent, - IN BOOLEAN AutoloadFail - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - pHalData->eeprom_thermal_meter = 0xff; - - if(!AutoloadFail) - pHalData->eeprom_thermal_meter = PROMContent[EEPROM_THERMAL_METER_8814]; - -#if 0 /* ToDo: check with RF */ - else - pHalData->eeprom_thermal_meter = EEPROM_Default_ThermalMeter_8814A; - - if ((pHalData->eeprom_thermal_meter == 0xff) || (_TRUE == AutoloadFail)) { - pHalData->odmpriv.rf_calibrate_info.bAPKThermalMeterIgnore = _TRUE; - pHalData->eeprom_thermal_meter = EEPROM_Default_ThermalMeter_8814A; - } -#endif - - //pHalData->ThermalMeter[0] = pHalData->eeprom_thermal_meter; - RTW_INFO("ThermalMeter = 0x%x\n", pHalData->eeprom_thermal_meter); -} - - -void hal_ReadRemoteWakeup_8814A( - PADAPTER padapter, - IN u8* hwinfo, - IN BOOLEAN AutoLoadFail - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(padapter); - u8 tmpvalue; - - if(AutoLoadFail){ - pwrctl->bHWPowerdown = _FALSE; - pwrctl->bSupportRemoteWakeup = _FALSE; - } - else - { - // decide hw if support remote wakeup function - // if hw supported, 8051 (SIE) will generate WeakUP signal( D+/D- toggle) when autoresume -/* todo: wowlan should check the efuse again -#ifdef CONFIG_USB_HCI - if(IS_HARDWARE_TYPE_8821U(padapter)) - pwrctl->bSupportRemoteWakeup = (hwinfo[EEPROM_USB_OPTIONAL_FUNCTION0_8811AU] & BIT1)?_TRUE :_FALSE; - else - pwrctl->bSupportRemoteWakeup = (hwinfo[EEPROM_USB_OPTIONAL_FUNCTION0] & BIT1)?_TRUE :_FALSE; -#endif //CONFIG_USB_HCI -*/ - RTW_INFO("%s...bSupportRemoteWakeup(%x)\n",__FUNCTION__, pwrctl->bSupportRemoteWakeup); - } -} - -VOID -hal_ReadChannelPlan8814A( - IN PADAPTER padapter, - IN u8* hwinfo, - IN BOOLEAN AutoLoadFail - ) -{ - struct rf_ctl_t *rfctl = adapter_to_rfctl(padapter); - hal_com_config_channel_plan( - padapter - , hwinfo ? &hwinfo[EEPROM_COUNTRY_CODE_8814] : NULL - , hwinfo ? hwinfo[EEPROM_ChannelPlan_8814] : 0xFF - , padapter->registrypriv.alpha2 - , padapter->registrypriv.channel_plan - , RTW_CHPLAN_REALTEK_DEFINE - , AutoLoadFail - ); -/* - padapter->mlmepriv.ChannelPlan = hal_com_config_channel_plan( - padapter - , hwinfo?hwinfo[EEPROM_ChannelPlan_8814]:0xFF - , padapter->registrypriv.channel_plan - , RTW_CHPLAN_REALTEK_DEFINE - , AutoLoadFail - ); -*/ - RTW_INFO("rfctl->ChannelPlan = 0x%02x\n", rfctl->ChannelPlan); -} - -void hal_GetRxGainOffset_8814A( - PADAPTER Adapter, - pu1Byte PROMContent, - BOOLEAN AutoloadFail - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct registry_priv *pregistrypriv = &Adapter->registrypriv; - - pHalData->RxGainOffset[0] = 0; - pHalData->RxGainOffset[1] = 0; - pHalData->RxGainOffset[2] = 0; - pHalData->RxGainOffset[3] = 0; - - if ((pregistrypriv->reg_rxgain_offset_2g != 0 && pregistrypriv->reg_rxgain_offset_5gl != 0) && - (pregistrypriv->reg_rxgain_offset_5gm != 0 && pregistrypriv->reg_rxgain_offset_5gh != 0)) { - pHalData->RxGainOffset[0] = pregistrypriv->reg_rxgain_offset_2g; - pHalData->RxGainOffset[1] = pregistrypriv->reg_rxgain_offset_5gl; - pHalData->RxGainOffset[2] = pregistrypriv->reg_rxgain_offset_5gm; - pHalData->RxGainOffset[3] = pregistrypriv->reg_rxgain_offset_5gh; - RTW_INFO("%s():Use registrypriv 0x%x 0x%x 0x%x 0x%x !!\n", __func__, pregistrypriv->reg_rxgain_offset_2g, pregistrypriv->reg_rxgain_offset_5gl, pregistrypriv->reg_rxgain_offset_5gm, pregistrypriv->reg_rxgain_offset_5gh); - - } else { - RTW_INFO("%s(): AutoloadFail = %d!!\n", __func__, AutoloadFail); - pHalData->RxGainOffset[0] = PROMContent[EEPROM_IG_OFFSET_4_CD_2G_8814A]; - pHalData->RxGainOffset[0] |= (PROMContent[EEPROM_IG_OFFSET_4_AB_2G_8814A]) << 8; - pHalData->RxGainOffset[1] = PROMContent[EEPROM_IG_OFFSET_4_CD_5GL_8814A]; - pHalData->RxGainOffset[1] |= (PROMContent[EEPROM_IG_OFFSET_4_AB_5GL_8814A]) << 8; - pHalData->RxGainOffset[2] = PROMContent[EEPROM_IG_OFFSET_4_CD_5GM_8814A]; - pHalData->RxGainOffset[2] |= (PROMContent[EEPROM_IG_OFFSET_4_AB_5GM_8814A]) << 8; - pHalData->RxGainOffset[3] = PROMContent[EEPROM_IG_OFFSET_4_CD_5GH_8814A]; - pHalData->RxGainOffset[3] |= (PROMContent[EEPROM_IG_OFFSET_4_AB_5GH_8814A]) << 8; - } - RTW_INFO("hal_GetRxGainOffset_8814A(): RegRxGainOffset_2G = 0x%x!!\n", pHalData->RxGainOffset[0]); - RTW_INFO("hal_GetRxGainOffset_8814A(): RegRxGainOffset_5GL = 0x%x!!\n", pHalData->RxGainOffset[1]); - RTW_INFO("hal_GetRxGainOffset_8814A(): RegRxGainOffset_5GM = 0x%x!!\n", pHalData->RxGainOffset[2]); - RTW_INFO("hal_GetRxGainOffset_8814A(): RegRxGainOffset_5GH = 0x%x!!\n", pHalData->RxGainOffset[3]); -} - - -void Hal_EfuseParseKFreeData_8814A( - IN PADAPTER Adapter, - IN u8 *PROMContent, - IN BOOLEAN AutoloadFail) -{ -#ifdef CONFIG_RF_GAIN_OFFSET - - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct kfree_data_t *kfree_data = &pHalData->kfree_data; - u8 kfreePhydata[KFREE_GAIN_DATA_LENGTH_8814A]; - u32 i = 0, j = 2, chidx = 0, efuseaddr = 0; - u8 rfpath = 0; - - if (GET_PG_KFREE_ON_8814A(PROMContent) && PROMContent[0xc8] != 0xff) - kfree_data->flag |= KFREE_FLAG_ON; - if (GET_PG_KFREE_THERMAL_K_ON_8814A(PROMContent) && PROMContent[0xc8] != 0xff) - kfree_data->flag |= KFREE_FLAG_THERMAL_K_ON; - - if (Adapter->registrypriv.RegRfKFreeEnable == 1) { - kfree_data->flag |= KFREE_FLAG_ON; - kfree_data->flag |= KFREE_FLAG_THERMAL_K_ON; - } - - _rtw_memset(kfree_data->bb_gain, 0xff, BB_GAIN_NUM * RF_PATH_MAX); - - if (kfree_data->flag & KFREE_FLAG_ON) { - - for (i = 0; i < KFREE_GAIN_DATA_LENGTH_8814A; i++) { - efuseaddr = PPG_BB_GAIN_2G_TXBA_OFFSET_8814A - i; - - if (efuseaddr <= PPG_BB_GAIN_2G_TXBA_OFFSET_8814A) { - kfreePhydata[i] = EFUSE_Read1Byte(Adapter, efuseaddr); - RTW_INFO("%s,kfreePhydata[%d] = %x\n", __func__, i, kfreePhydata[i]); - } - } - kfree_data->bb_gain[0][RF_PATH_A] - = (kfreePhydata[0] & PPG_BB_GAIN_2G_TX_OFFSET_MASK); - kfree_data->bb_gain[0][RF_PATH_B] - = (kfreePhydata[0] & PPG_BB_GAIN_2G_TXB_OFFSET_MASK) >> 4; - kfree_data->bb_gain[0][RF_PATH_C] - = (kfreePhydata[1] & PPG_BB_GAIN_2G_TX_OFFSET_MASK); - kfree_data->bb_gain[0][RF_PATH_D] - = (kfreePhydata[1] & PPG_BB_GAIN_2G_TXB_OFFSET_MASK) >> 4; - - for (chidx = 1; chidx <= BB_GAIN_5GHB; chidx++) { - for (rfpath = RF_PATH_A; rfpath < RF_PATH_MAX; rfpath++) - kfree_data->bb_gain[chidx][rfpath] = kfreePhydata[j + rfpath] & PPG_BB_GAIN_5G_TX_OFFSET_MASK; - - j = j + RF_PATH_MAX; - } - } - - if (kfree_data->flag & KFREE_FLAG_THERMAL_K_ON) - pHalData->eeprom_thermal_meter += kfree_data->thermal; - - RTW_INFO("registrypriv.RegRfKFreeEnable = %d\n", Adapter->registrypriv.RegRfKFreeEnable); - - RTW_INFO("kfree flag:%u\n", kfree_data->flag); - if (Adapter->registrypriv.RegRfKFreeEnable == 1 || kfree_data->flag & KFREE_FLAG_ON) { - for (chidx = 0 ; chidx <= BB_GAIN_5GHB; chidx++) { - for (rfpath = RF_PATH_A; rfpath < RF_PATH_MAX; rfpath++) - RTW_INFO("bb_gain[%d][%d]= %x\n", chidx, rfpath, kfree_data->bb_gain[chidx][rfpath]); - } - } - -#endif /*CONFIG_RF_GAIN_OFFSET */ -} - - -VOID -hal_EfuseParseXtal_8814A( - IN PADAPTER pAdapter, - IN u8* hwinfo, - IN BOOLEAN AutoLoadFail - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - - if(!AutoLoadFail) - { - pHalData->crystal_cap = hwinfo[EEPROM_XTAL_8814]; - if(pHalData->crystal_cap == 0xFF) - pHalData->crystal_cap = EEPROM_Default_CrystalCap_8814; /* what value should 8814 set? */ - } - else - { - pHalData->crystal_cap = EEPROM_Default_CrystalCap_8814; - } - RTW_INFO("crystal_cap: 0x%2x\n", pHalData->crystal_cap); -} - -VOID -hal_ReadAntennaDiversity8814A( - IN PADAPTER pAdapter, - IN u8* PROMContent, - IN BOOLEAN AutoLoadFail - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - - pHalData->TRxAntDivType = NO_ANTDIV; - pHalData->AntDivCfg = 0; - - RTW_INFO("SWAS: bHwAntDiv = %x, TRxAntDivType = %x\n", - pHalData->AntDivCfg, pHalData->TRxAntDivType); -} - -VOID -hal_ReadPAType_8814A( - IN PADAPTER Adapter, - IN u8* PROMContent, - IN BOOLEAN AutoloadFail, - OUT u8* pPAType, - OUT u8* pLNAType - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 LNAType_AB, LNAType_CD; - - if( ! AutoloadFail ) - { - u8 rfe_type = PROMContent[EEPROM_RFE_OPTION_8814]; - - if (GetRegAmplifierType2G(Adapter) == 0) // AUTO - { - *pPAType = EF1Byte( *(u8*)&PROMContent[EEPROM_PA_TYPE_8814] ); - - LNAType_AB = EF1Byte( *(u8*)&PROMContent[EEPROM_LNA_TYPE_AB_2G_8814] ); - LNAType_CD = EF1Byte( *(u8*)&PROMContent[EEPROM_LNA_TYPE_CD_2G_8814] ); - - if (*pPAType == 0xFF && rfe_type == 0xFF) - pHalData->ExternalPA_2G = (GetRegAmplifierType2G(Adapter)&ODM_BOARD_EXT_PA) ? 1 : 0; - else - pHalData->ExternalPA_2G = (*pPAType & BIT4) ? 1 : 0; - - if (LNAType_AB == 0xFF) - pHalData->ExternalLNA_2G = (GetRegAmplifierType2G(Adapter)&ODM_BOARD_EXT_LNA) ? 1 : 0; - else - pHalData->ExternalLNA_2G = (LNAType_AB & BIT3) ? 1 : 0; - - *pLNAType = (LNAType_AB & BIT3) << 1 | (LNAType_AB & BIT7) >> 2 | - (LNAType_CD & BIT3) << 3 | (LNAType_CD & BIT7); - } - else - { - pHalData->ExternalPA_2G = (GetRegAmplifierType2G(Adapter)&ODM_BOARD_EXT_PA) ? 1 : 0; - pHalData->ExternalLNA_2G = (GetRegAmplifierType2G(Adapter)&ODM_BOARD_EXT_LNA) ? 1 : 0; - } - - if (GetRegAmplifierType5G(Adapter) == 0) // AUTO - { - LNAType_AB = EF1Byte( *(u8*)&PROMContent[EEPROM_LNA_TYPE_AB_5G_8814] ); - LNAType_CD = EF1Byte( *(u8*)&PROMContent[EEPROM_LNA_TYPE_CD_5G_8814] ); - - if (*pPAType == 0xFF && rfe_type == 0xFF) - pHalData->external_pa_5g = (GetRegAmplifierType5G(Adapter)&ODM_BOARD_EXT_PA) ? 1 : 0; - else - pHalData->external_pa_5g = (*pPAType & BIT0) ? 1 : 0; - - if (LNAType_AB == 0xFF) - pHalData->external_lna_5g = (GetRegAmplifierType5G(Adapter)&ODM_BOARD_EXT_LNA) ? 1 : 0; - else - pHalData->external_lna_5g = (LNAType_AB & BIT3) ? 1 : 0; - - (*pLNAType) |= ((LNAType_AB & BIT3) >> 3 | (LNAType_AB & BIT7) >> 6 | - (LNAType_CD & BIT3) >> 1 | (LNAType_CD & BIT7) >> 4); - } - else - { - pHalData->external_pa_5g = (GetRegAmplifierType5G(Adapter)&ODM_BOARD_EXT_PA_5G) ? 1 : 0; - pHalData->external_lna_5g = (GetRegAmplifierType5G(Adapter)&ODM_BOARD_EXT_LNA_5G) ? 1 : 0; - } - } - else - { - pHalData->ExternalPA_2G = EEPROM_Default_PAType; - pHalData->external_pa_5g = 0xFF; - pHalData->ExternalLNA_2G = EEPROM_Default_LNAType; - pHalData->external_lna_5g = 0xFF; - - if (GetRegAmplifierType2G(Adapter) == 0) - { - pHalData->ExternalPA_2G = 0; - pHalData->ExternalLNA_2G = 0; - } - else - { - pHalData->ExternalPA_2G = (GetRegAmplifierType2G(Adapter)&ODM_BOARD_EXT_PA) ? 1 : 0; - pHalData->ExternalLNA_2G = (GetRegAmplifierType2G(Adapter)&ODM_BOARD_EXT_LNA) ? 1 : 0; - } - if (GetRegAmplifierType5G(Adapter) == 0) - { - pHalData->external_pa_5g = 0; - pHalData->external_lna_5g = 0; - } - else - { - pHalData->external_pa_5g = (GetRegAmplifierType5G(Adapter)&ODM_BOARD_EXT_PA_5G) ? 1 : 0; - pHalData->external_lna_5g = (GetRegAmplifierType5G(Adapter)&ODM_BOARD_EXT_LNA_5G) ? 1 : 0; - } - } - RTW_INFO("PAType is 0x%x, LNAType is 0x%x\n", *pPAType, *pLNAType); - RTW_INFO("pHalData->ExternalPA_2G = %d, pHalData->external_pa_5g = %d\n", pHalData->ExternalPA_2G, pHalData->external_pa_5g); - RTW_INFO("pHalData->ExternalLNA_2G = %d, pHalData->external_lna_5g = %d\n", pHalData->ExternalLNA_2G, pHalData->external_lna_5g); -} - -VOID hal_ReadAmplifierType_8814A( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - switch(pHalData->rfe_type) - { - case 1: /* 8814AU */ - pHalData->external_pa_5g = pHalData->external_lna_5g = _TRUE; - pHalData->TypeAPA = pHalData->TypeALNA = 0;/* APA and ALNA is 0 */ - break; - case 2: /* socket board 8814AR and 8194AR */ - pHalData->ExternalPA_2G = pHalData->external_pa_5g = _TRUE; - pHalData->ExternalLNA_2G = pHalData->external_lna_5g = _TRUE; - pHalData->TypeAPA = pHalData->TypeALNA = 0x55;/* APA and ALNA is 1 */ - pHalData->TypeGPA = pHalData->TypeGLNA = 0x55;/* GPA and GLNA is 1 */ - break; - case 3: /* high power on-board 8814AR and 8194AR */ - pHalData->ExternalPA_2G = pHalData->external_pa_5g = _TRUE; - pHalData->ExternalLNA_2G = pHalData->external_lna_5g = _TRUE; - pHalData->TypeAPA = pHalData->TypeALNA = 0xaa;/* APA and ALNA is 2 */ - pHalData->TypeGPA = pHalData->TypeGLNA = 0xaa;/* GPA and GLNA is 2 */ - break; - case 4: /* on-board 8814AR and 8194AR */ - pHalData->ExternalPA_2G = pHalData->external_pa_5g = _TRUE; - pHalData->ExternalLNA_2G = pHalData->external_lna_5g = _TRUE; - pHalData->TypeAPA = 0x55;/* APA is 1 */ - pHalData->TypeALNA = 0xff; /* ALNA is 3 */ - pHalData->TypeGPA = pHalData->TypeGLNA = 0x55;/* GPA and GLNA is 1 */ - break; - case 5: - pHalData->ExternalPA_2G = pHalData->external_pa_5g = _TRUE; - pHalData->ExternalLNA_2G = pHalData->external_lna_5g = _TRUE; - pHalData->TypeAPA = 0xaa; /* APA2 */ - pHalData->TypeALNA = 0x5500; /* ALNA4 */ - pHalData->TypeGPA = pHalData->TypeGLNA = 0xaa; /* GPA2,GLNA2 */ - break; - case 6: - pHalData->external_lna_5g = _TRUE; - pHalData->TypeALNA = 0; /* ALNA0 */ - break; - case 0: - default: /* 8814AE */ - break; - } - - RTW_INFO("pHalData->ExternalPA_2G = %d, pHalData->external_pa_5g = %d\n", pHalData->ExternalPA_2G, pHalData->external_pa_5g); - RTW_INFO("pHalData->ExternalLNA_2G = %d, pHalData->external_lna_5g = %d\n", pHalData->ExternalLNA_2G, pHalData->external_lna_5g); - RTW_INFO("pHalData->TypeGPA = 0x%X, pHalData->TypeAPA = 0x%X\n", pHalData->TypeGPA, pHalData->TypeAPA); - RTW_INFO("pHalData->TypeGLNA = 0x%X, pHalData->TypeALNA = 0x%X\n", pHalData->TypeGLNA, pHalData->TypeALNA); -} - - -VOID -hal_ReadRFEType_8814A( - IN PADAPTER Adapter, - IN u8* PROMContent, - IN BOOLEAN AutoloadFail - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - if(!AutoloadFail) - { - if ((GetRegRFEType(Adapter) != 64) || 0xFF == PROMContent[EEPROM_RFE_OPTION_8814] || PROMContent[EEPROM_RFE_OPTION_8814] & BIT7) { - if(GetRegRFEType(Adapter) != 64) - pHalData->rfe_type = GetRegRFEType(Adapter); - else if(IS_HARDWARE_TYPE_8814AE(Adapter)) - pHalData->rfe_type = 0; - else if(IS_HARDWARE_TYPE_8814AU(Adapter)) - pHalData->rfe_type = 1; - hal_ReadAmplifierType_8814A(Adapter); - - } else { - /* bit7==0 means RFE type defined by 0xCA[6:0] */ - pHalData->rfe_type = PROMContent[EEPROM_RFE_OPTION_8814] & 0x7F; - hal_ReadAmplifierType_8814A(Adapter); - } - } - else - { - if(GetRegRFEType(Adapter) != 64) - pHalData->rfe_type = GetRegRFEType(Adapter); - else if(IS_HARDWARE_TYPE_8814AE(Adapter)) - pHalData->rfe_type = 0; - else if(IS_HARDWARE_TYPE_8814AU(Adapter)) - pHalData->rfe_type = 1; - - hal_ReadAmplifierType_8814A(Adapter); - } - RTW_INFO("RFE Type: 0x%2x\n", pHalData->rfe_type); -} - -static VOID -hal_EfusePowerSwitch8814A( - IN PADAPTER pAdapter, - IN u8 bWrite, - IN u8 PwrState) -{ - u8 tempval; - u16 tmpV16; - u8 EFUSE_ACCESS_ON_8814A = 0x69; - u8 EFUSE_ACCESS_OFF_8814A = 0x00; - - if (PwrState == _TRUE) - { - rtw_write8(pAdapter, REG_EFUSE_ACCESS, EFUSE_ACCESS_ON_8814A); - - // Reset: 0x0000h[28], default valid - tmpV16 = PlatformEFIORead2Byte(pAdapter,REG_SYS_FUNC_EN); - if( !(tmpV16 & FEN_ELDR) ){ - tmpV16 |= FEN_ELDR ; - rtw_write16(pAdapter,REG_SYS_FUNC_EN,tmpV16); - } - - // Clock: Gated(0x0008h[5]) 8M(0x0008h[1]) clock from ANA, default valid - tmpV16 = PlatformEFIORead2Byte(pAdapter,REG_SYS_CLKR); - if( (!(tmpV16 & LOADER_CLK_EN) ) ||(!(tmpV16 & ANA8M) ) ) - { - tmpV16 |= (LOADER_CLK_EN |ANA8M ) ; - rtw_write16(pAdapter,REG_SYS_CLKR,tmpV16); - } - - if(bWrite == _TRUE) - { - // Enable LDO 2.5V before read/write action - tempval = rtw_read8(pAdapter, EFUSE_TEST+3); - tempval &= 0x0F; - tempval |= (VOLTAGE_V25 << 4); - rtw_write8(pAdapter, EFUSE_TEST+3, (tempval | 0x80)); - } - } - else - { - rtw_write8(pAdapter, REG_EFUSE_ACCESS, EFUSE_ACCESS_OFF_8814A); - - if(bWrite == _TRUE){ - // Disable LDO 2.5V after read/write action - tempval = rtw_read8(pAdapter, EFUSE_TEST+3); - rtw_write8(pAdapter, EFUSE_TEST+3, (tempval & 0x7F)); - } - } -} - -static VOID -rtl8814_EfusePowerSwitch( - IN PADAPTER pAdapter, - IN u8 bWrite, - IN u8 PwrState) -{ - hal_EfusePowerSwitch8814A(pAdapter, bWrite, PwrState); -} - -static VOID -hal_EfuseReadEFuse8814A( - PADAPTER Adapter, - u16 _offset, - u16 _size_byte, - u8 *pbuf, - IN BOOLEAN bPseudoTest - ) -{ - u8 *efuseTbl = NULL; - u16 eFuse_Addr = 0; - u8 offset=0, wden=0; - u16 i, j; - u16 **eFuseWord = NULL; - u16 efuse_utilized = 0; - u8 efuse_usage = 0; - u8 offset_2_0=0; - u8 efuseHeader=0, efuseExtHdr=0, efuseData=0; - - // - // Do NOT excess total size of EFuse table. Added by Roger, 2008.11.10. - // - if((_offset + _size_byte)>EFUSE_MAP_LEN_8814A) - {// total E-Fuse table is 512bytes - RTW_INFO("Hal_EfuseReadEFuse8814A(): Invalid offset(%#x) with read bytes(%#x)!!\n", _offset, _size_byte); - goto exit; - } - - efuseTbl = (u8*)rtw_zmalloc(EFUSE_MAP_LEN_8814A); - if(efuseTbl == NULL) - { - RTW_INFO("%s: alloc efuseTbl fail!\n", __FUNCTION__); - goto exit; - } - - eFuseWord= (u16 **)rtw_malloc2d(EFUSE_MAX_SECTION_8814A, EFUSE_MAX_WORD_UNIT_8814A, 2); - if(eFuseWord == NULL) - { - RTW_INFO("%s: alloc eFuseWord fail!\n", __FUNCTION__); - goto exit; - } - - // 0. Refresh efuse init map as all oxFF. - for (i = 0; i < EFUSE_MAX_SECTION_8814A; i++) - for (j = 0; j < EFUSE_MAX_WORD_UNIT_8814A; j++) - eFuseWord[i][j] = 0xFFFF; - - // - // 1. Read the first byte to check if efuse is empty!!! - // - // - efuse_OneByteRead(Adapter, eFuse_Addr++, &efuseHeader, bPseudoTest); - - if(efuseHeader != 0xFF) - { - efuse_utilized++; - } - else - { - RTW_INFO("EFUSE is empty\n"); - efuse_utilized = 0; - goto exit; - } - /* RT_DISP(FEEPROM, EFUSE_READ_ALL, ("Hal_EfuseReadEFuse8814A(): efuse_utilized: %d\n", efuse_utilized)); */ - - // - // 2. Read real efuse content. Filter PG header and every section data. - // - while((efuseHeader != 0xFF) && AVAILABLE_EFUSE_ADDR_8814A(eFuse_Addr)) - { - //RTPRINT(FEEPROM, EFUSE_READ_ALL, ("efuse_Addr-%d efuse_data=%x\n", eFuse_Addr-1, *rtemp8)); - - // Check PG header for section num. - if(EXT_HEADER(efuseHeader)) //extended header - { - offset_2_0 = GET_HDR_OFFSET_2_0(efuseHeader); - //RT_DISP(FEEPROM, EFUSE_READ_ALL, ("extended header offset_2_0=%X\n", offset_2_0)); - - efuse_OneByteRead(Adapter, eFuse_Addr++, &efuseExtHdr, bPseudoTest); - - //RT_DISP(FEEPROM, EFUSE_READ_ALL, ("efuse[%X]=%X\n", eFuse_Addr-1, efuseExtHdr)); - - if(efuseExtHdr != 0xff) - { - efuse_utilized++; - if(ALL_WORDS_DISABLED(efuseExtHdr)) - { - efuse_OneByteRead(Adapter, eFuse_Addr++, &efuseHeader, bPseudoTest); - if(efuseHeader != 0xff) - { - efuse_utilized++; - } - break; - } - else - { - offset = ((efuseExtHdr & 0xF0) >> 1) | offset_2_0; - wden = (efuseExtHdr & 0x0F); - } - } - else - { - RTW_INFO("Error condition, extended = 0xff\n"); - // We should handle this condition. - break; - } - } - else - { - offset = ((efuseHeader >> 4) & 0x0f); - wden = (efuseHeader & 0x0f); - } - - if(offset < EFUSE_MAX_SECTION_8814A) - { - // Get word enable value from PG header - //RT_DISP(FEEPROM, EFUSE_READ_ALL, ("Offset-%X Worden=%X\n", offset, wden)); - - for(i=0; i> 8) & 0xff); - } - } - - /* RT_DISP(FEEPROM, EFUSE_READ_ALL, ("Hal_EfuseReadEFuse8814A(): efuse_utilized: %d\n", efuse_utilized)); */ - - // - // 4. Copy from Efuse map to output pointer memory!!! - // - for(i=0; i<_size_byte; i++) - { - pbuf[i] = efuseTbl[_offset+i]; - } - - // - // 5. Calculate Efuse utilization. - // - efuse_usage = (u1Byte)((eFuse_Addr*100)/EFUSE_REAL_CONTENT_LEN_8814A); - rtw_hal_set_hwreg(Adapter, HW_VAR_EFUSE_BYTES, (u8 *)&eFuse_Addr); - -exit: - if(efuseTbl) - rtw_mfree(efuseTbl, EFUSE_MAP_LEN_8814A); - - if(eFuseWord) - rtw_mfree2d((void *)eFuseWord, EFUSE_MAX_SECTION_8814A, EFUSE_MAX_WORD_UNIT_8814A, sizeof(u16)); -} - -static VOID -rtl8814_ReadEFuse( - PADAPTER Adapter, - u8 efuseType, - u16 _offset, - u16 _size_byte, - u8 *pbuf, - IN BOOLEAN bPseudoTest - ) -{ - hal_EfuseReadEFuse8814A(Adapter, _offset, _size_byte, pbuf, bPseudoTest); -} - -//Do not support BT -VOID -hal_EFUSEGetEfuseDefinition8814A( - IN PADAPTER pAdapter, - IN u8 efuseType, - IN u8 type, - OUT PVOID pOut - ) -{ - switch(type) - { - case TYPE_EFUSE_MAX_SECTION: - { - u8* pMax_section; - pMax_section = (u8*)pOut; - *pMax_section = EFUSE_MAX_SECTION_8814A; - } - break; - case TYPE_EFUSE_REAL_CONTENT_LEN: - { - u16* pu2Tmp; - pu2Tmp = (u16*)pOut; - *pu2Tmp = EFUSE_REAL_CONTENT_LEN_8814A; - } - break; - case TYPE_EFUSE_CONTENT_LEN_BANK: - { - u16* pu2Tmp; - pu2Tmp = (u16*)pOut; - *pu2Tmp = EFUSE_REAL_CONTENT_LEN_8814A; - } - break; - case TYPE_AVAILABLE_EFUSE_BYTES_BANK: - { - u16* pu2Tmp; - pu2Tmp = (u16*)pOut; - *pu2Tmp = (u16)(EFUSE_REAL_CONTENT_LEN_8814A-EFUSE_OOB_PROTECT_BYTES); - } - break; - case TYPE_AVAILABLE_EFUSE_BYTES_TOTAL: - { - u16* pu2Tmp; - pu2Tmp = (u16*)pOut; - *pu2Tmp = (u16)(EFUSE_REAL_CONTENT_LEN_8814A-EFUSE_OOB_PROTECT_BYTES); - } - break; - case TYPE_EFUSE_MAP_LEN: - { - u16* pu2Tmp; - pu2Tmp = (u16*)pOut; - *pu2Tmp = (u16)EFUSE_MAP_LEN_8814A; - } - break; - case TYPE_EFUSE_PROTECT_BYTES_BANK: - { - u8* pu1Tmp; - pu1Tmp = (u8*)pOut; - *pu1Tmp = (u8)(EFUSE_OOB_PROTECT_BYTES); - } - break; - default: - { - u8* pu1Tmp; - pu1Tmp = (u8*)pOut; - *pu1Tmp = 0; - } - break; - } -} - -static VOID -rtl8814_EFUSE_GetEfuseDefinition( - IN PADAPTER pAdapter, - IN u8 efuseType, - IN u8 type, - OUT void *pOut, - IN BOOLEAN bPseudoTest - ) -{ - hal_EFUSEGetEfuseDefinition8814A(pAdapter, efuseType, type, pOut); -} - -static u8 -hal_EfuseWordEnableDataWrite8814A( IN PADAPTER pAdapter, - IN u16 efuse_addr, - IN u8 word_en, - IN u8 *data, - IN BOOLEAN bPseudoTest) -{ - u16 readbackAddr = 0; - u16 start_addr = efuse_addr; - u8 badworden = 0x0F; - u8 readbackData[PGPKT_DATA_SIZE]; - - _rtw_memset((PVOID)readbackData, 0xff, PGPKT_DATA_SIZE); - - RTW_INFO("word_en = %x efuse_addr=%x\n", word_en, efuse_addr); - - if ( ! (word_en&BIT0)) - { - readbackAddr = start_addr; - efuse_OneByteWrite(pAdapter,start_addr++, data[0], bPseudoTest); - efuse_OneByteWrite(pAdapter,start_addr++, data[1], bPseudoTest); - - if (IS_HARDWARE_TYPE_8723B(pAdapter) || IS_HARDWARE_TYPE_8188E(pAdapter) || - IS_HARDWARE_TYPE_8192E(pAdapter) || IS_HARDWARE_TYPE_8703B(pAdapter) || IS_HARDWARE_TYPE_8188F(pAdapter)) - phy_set_mac_reg(pAdapter, EFUSE_TEST, BIT26, 0); // Use 10K Read, Suggested by Morris & Victor - - efuse_OneByteRead(pAdapter,readbackAddr, &readbackData[0], bPseudoTest); - efuse_OneByteRead(pAdapter,readbackAddr+1, &readbackData[1], bPseudoTest); - - if (IS_HARDWARE_TYPE_8723B(pAdapter) || IS_HARDWARE_TYPE_8188E(pAdapter) || - IS_HARDWARE_TYPE_8192E(pAdapter) || IS_HARDWARE_TYPE_8703B(pAdapter) || IS_HARDWARE_TYPE_8188F(pAdapter)) - phy_set_mac_reg(pAdapter, EFUSE_TEST, BIT26, 1); // Restored to 1.5K Read, Suggested by Morris & Victor - - if((data[0]!=readbackData[0])||(data[1]!=readbackData[1])){ - badworden &= (~BIT0); - } - } - if ( ! (word_en&BIT1)) - { - readbackAddr = start_addr; - efuse_OneByteWrite(pAdapter,start_addr++, data[2], bPseudoTest); - efuse_OneByteWrite(pAdapter,start_addr++, data[3], bPseudoTest); - - if (IS_HARDWARE_TYPE_8723B(pAdapter) || IS_HARDWARE_TYPE_8188E(pAdapter) || - IS_HARDWARE_TYPE_8192E(pAdapter) || IS_HARDWARE_TYPE_8703B(pAdapter) || IS_HARDWARE_TYPE_8188F(pAdapter)) - phy_set_mac_reg(pAdapter, EFUSE_TEST, BIT26, 0); // Use 10K Read, Suggested by Morris & Victor - - efuse_OneByteRead(pAdapter,readbackAddr , &readbackData[2], bPseudoTest); - efuse_OneByteRead(pAdapter,readbackAddr+1, &readbackData[3], bPseudoTest); - - if (IS_HARDWARE_TYPE_8723B(pAdapter) || IS_HARDWARE_TYPE_8188E(pAdapter) || - IS_HARDWARE_TYPE_8192E(pAdapter) || IS_HARDWARE_TYPE_8703B(pAdapter) || IS_HARDWARE_TYPE_8188F(pAdapter)) - phy_set_mac_reg(pAdapter, EFUSE_TEST, BIT26, 1); // Restored to 1.5K Read, Suggested by Morris & Victor - - if((data[2]!=readbackData[2])||(data[3]!=readbackData[3])){ - badworden &=( ~BIT1); - } - } - if ( ! (word_en&BIT2)) - { - readbackAddr = start_addr; - efuse_OneByteWrite(pAdapter,start_addr++, data[4], bPseudoTest); - efuse_OneByteWrite(pAdapter,start_addr++, data[5], bPseudoTest); - - if (IS_HARDWARE_TYPE_8723B(pAdapter) || IS_HARDWARE_TYPE_8188E(pAdapter) || - IS_HARDWARE_TYPE_8192E(pAdapter) || IS_HARDWARE_TYPE_8703B(pAdapter) || IS_HARDWARE_TYPE_8188F(pAdapter)) - phy_set_mac_reg(pAdapter, EFUSE_TEST, BIT26, 0); // Use 10K Read, Suggested by Morris & Victor - - efuse_OneByteRead(pAdapter,readbackAddr, &readbackData[4], bPseudoTest); - efuse_OneByteRead(pAdapter,readbackAddr+1, &readbackData[5], bPseudoTest); - - if (IS_HARDWARE_TYPE_8723B(pAdapter) || IS_HARDWARE_TYPE_8188E(pAdapter) || - IS_HARDWARE_TYPE_8192E(pAdapter) || IS_HARDWARE_TYPE_8703B(pAdapter) || IS_HARDWARE_TYPE_8188F(pAdapter)) - phy_set_mac_reg(pAdapter, EFUSE_TEST, BIT26, 1); // Restored to 1.5K Read, Suggested by Morris & Victor - - if((data[4]!=readbackData[4])||(data[5]!=readbackData[5])){ - badworden &=( ~BIT2); - } - } - if ( ! (word_en&BIT3)) - { - readbackAddr = start_addr; - efuse_OneByteWrite(pAdapter,start_addr++, data[6], bPseudoTest); - efuse_OneByteWrite(pAdapter,start_addr++, data[7], bPseudoTest); - - if (IS_HARDWARE_TYPE_8723B(pAdapter) || IS_HARDWARE_TYPE_8188E(pAdapter) || - IS_HARDWARE_TYPE_8192E(pAdapter) || IS_HARDWARE_TYPE_8703B(pAdapter) || IS_HARDWARE_TYPE_8188F(pAdapter)) - phy_set_mac_reg(pAdapter, EFUSE_TEST, BIT26, 0); // Use 10K Read, Suggested by Morris & Victor - - efuse_OneByteRead(pAdapter,readbackAddr, &readbackData[6], bPseudoTest); - efuse_OneByteRead(pAdapter,readbackAddr+1, &readbackData[7], bPseudoTest); - - if (IS_HARDWARE_TYPE_8723B(pAdapter) || IS_HARDWARE_TYPE_8188E(pAdapter) || - IS_HARDWARE_TYPE_8192E(pAdapter) || IS_HARDWARE_TYPE_8703B(pAdapter) || IS_HARDWARE_TYPE_8188F(pAdapter)) - phy_set_mac_reg(pAdapter, EFUSE_TEST, BIT26, 1); // Restored to 1.5K Read, Suggested by Morris & Victor - - if((data[6]!=readbackData[6])||(data[7]!=readbackData[7])){ - badworden &=( ~BIT3); - } - } - return badworden; -} - -static u8 -rtl8814_Efuse_WordEnableDataWrite( IN PADAPTER pAdapter, - IN u16 efuse_addr, - IN u8 word_en, - IN u8 *data, - IN BOOLEAN bPseudoTest) -{ - u8 ret=0; - - ret = hal_EfuseWordEnableDataWrite8814A(pAdapter, efuse_addr, word_en, data, bPseudoTest); - - return ret; -} - - -static u16 hal_EfuseGetCurrentSize_8814A( PADAPTER pAdapter, BOOLEAN bPseudoTest) -{ - int bContinual = _TRUE; - - u16 efuse_addr = 0; - u8 hoffset=0, hworden=0; - u8 efuse_data, word_cnts=0; - - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - PEFUSE_HAL pEfuseHal = &(pHalData->EfuseHal); - - RTW_INFO("=======> %s() \n", __func__); - - if(bPseudoTest) - { - efuse_addr = (u16)(fakeEfuseUsedBytes); - } - else - { - rtw_hal_get_hwreg(pAdapter, HW_VAR_EFUSE_BYTES, (u8 *)&efuse_addr); - } - //RTPRINT(FEEPROM, EFUSE_PG, ("hal_EfuseGetCurrentSize_8723A(), start_efuse_addr = %d\n", efuse_addr)); - - while ( bContinual && - efuse_OneByteRead(pAdapter, efuse_addr , &efuse_data, bPseudoTest) && - (efuse_addr < EFUSE_REAL_CONTENT_LEN_8814A)) - { - if (efuse_data != 0xFF) - { - if ((efuse_data&0x1F) == 0x0F) //extended header - { - hoffset = efuse_data; - efuse_addr++; - efuse_OneByteRead(pAdapter, efuse_addr, &efuse_data, bPseudoTest); - if((efuse_data & 0x0F) == 0x0F) - { - efuse_addr++; - continue; - } else { - hoffset = ((hoffset & 0xE0) >> 5) | ((efuse_data & 0xF0) >> 1); - hworden = efuse_data & 0x0F; - } - } else { - hoffset = (efuse_data>>4) & 0x0F; - hworden = efuse_data & 0x0F; - } - word_cnts = Efuse_CalculateWordCnts(hworden); - //read next header - efuse_addr = efuse_addr + (word_cnts*2)+1; - } - else - { - bContinual = _FALSE ; - } - } - - if(bPseudoTest) - { - fakeEfuseUsedBytes = efuse_addr; - pEfuseHal->fakeEfuseUsedBytes = efuse_addr; - RTW_INFO ("%s(), return %d \n", __func__, pEfuseHal->fakeEfuseUsedBytes ); - } - else - { - pEfuseHal->EfuseUsedBytes = efuse_addr; - pEfuseHal->EfuseUsedPercentage = (u1Byte)((pEfuseHal->EfuseUsedBytes*100)/pEfuseHal->PhysicalLen_WiFi); - rtw_hal_set_hwreg(pAdapter, HW_VAR_EFUSE_BYTES, (u8 *)&efuse_addr); - rtw_hal_set_hwreg(pAdapter, HW_VAR_EFUSE_USAGE, (u8 *)&(pEfuseHal->EfuseUsedPercentage)); - RTW_INFO("%s(), return %d\n", __func__, efuse_addr); - } - - return efuse_addr; - -} - -static u16 -rtl8814_EfuseGetCurrentSize( - IN PADAPTER pAdapter, - IN u8 efuseType, - IN BOOLEAN bPseudoTest) -{ - u16 ret=0; - - ret = hal_EfuseGetCurrentSize_8814A(pAdapter, bPseudoTest); - - return ret; -} - - -static int -hal_EfusePgPacketRead_8814A( - IN PADAPTER pAdapter, - IN u8 offset, - IN u8 *data, - IN BOOLEAN bPseudoTest) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - PEFUSE_HAL pEfuseHal = &(pHalData->EfuseHal); - u8 ReadState = PG_STATE_HEADER; - - int bContinual = _TRUE; - int bDataEmpty = _TRUE ; - - u8 efuse_data,word_cnts=0; - u16 efuse_addr = 0; - u8 hoffset=0,hworden=0; - u8 tmpidx=0; - u8 tmpdata[8]; - u8 tmp_header = 0; - - if(data==NULL) return _FALSE; - if(offset>=EFUSE_MAX_SECTION_JAGUAR) return _FALSE; - - _rtw_memset((PVOID)data, 0xff, sizeof(u8)*PGPKT_DATA_SIZE); - _rtw_memset((PVOID)tmpdata, 0xff, sizeof(u8)*PGPKT_DATA_SIZE); - - // - // Efuse has been pre-programmed dummy 5Bytes at the end of Efuse by CP. - // Skip dummy parts to prevent unexpected data read from Efuse. - // By pass right now. 2009.02.19. - // - while(bContinual && (efuse_addr < pEfuseHal->PhysicalLen_WiFi) ) - { - //------- Header Read ------------- - if(ReadState & PG_STATE_HEADER) - { - if(efuse_OneByteRead(pAdapter, efuse_addr ,&efuse_data, bPseudoTest)&&(efuse_data!=0xFF)) - { - if(ALL_WORDS_DISABLED(efuse_data)) - { - tmp_header = efuse_data; - efuse_addr++; - efuse_OneByteRead(pAdapter, efuse_addr ,&efuse_data, bPseudoTest); - if((efuse_data & 0x0F) != 0x0F) - { - hoffset = ((tmp_header & 0xE0) >> 5) | ((efuse_data & 0xF0) >> 1); - hworden = efuse_data & 0x0F; - } - else - { - efuse_addr++; - break; - } - - } - else - { - hoffset = (efuse_data>>4) & 0x0F; - hworden = efuse_data & 0x0F; - } - word_cnts = Efuse_CalculateWordCnts(hworden); - bDataEmpty = _TRUE ; - - if(hoffset==offset){ - for(tmpidx = 0;tmpidx< word_cnts*2 ;tmpidx++){ - if(efuse_OneByteRead(pAdapter, efuse_addr+1+tmpidx ,&efuse_data, bPseudoTest) ){ - tmpdata[tmpidx] = efuse_data; - if(efuse_data!=0xff){ - bDataEmpty = _FALSE; - } - } - } - if(bDataEmpty==_FALSE){ - ReadState = PG_STATE_DATA; - }else{//read next header - efuse_addr = efuse_addr + (word_cnts*2)+1; - ReadState = PG_STATE_HEADER; - } - } - else{//read next header - efuse_addr = efuse_addr + (word_cnts*2)+1; - ReadState = PG_STATE_HEADER; - } - - } - else{ - bContinual = _FALSE ; - } - } - //------- Data section Read ------------- - else if(ReadState & PG_STATE_DATA) - { - efuse_WordEnableDataRead(hworden,tmpdata,data); - efuse_addr = efuse_addr + (word_cnts*2)+1; - ReadState = PG_STATE_HEADER; - } - - } - - if( (data[0]==0xff) &&(data[1]==0xff) && (data[2]==0xff) && (data[3]==0xff) && - (data[4]==0xff) &&(data[5]==0xff) && (data[6]==0xff) && (data[7]==0xff)) - return _FALSE; - else - return _TRUE; -} - -static int -rtl8814_Efuse_PgPacketRead( IN PADAPTER pAdapter, - IN u8 offset, - IN u8 *data, - IN BOOLEAN bPseudoTest) -{ - int ret=0; - - ret = hal_EfusePgPacketRead_8814A(pAdapter, offset, data, bPseudoTest); - - return ret; -} - -static BOOLEAN efuse_PgPacketCheck( - PADAPTER pAdapter, - u8 efuseType, - BOOLEAN bPseudoTest -) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - - if (Efuse_GetCurrentSize(pAdapter, efuseType, bPseudoTest) >= (EFUSE_REAL_CONTENT_LEN_8814A-EFUSE_PROTECT_BYTES_BANK_8814A)) - { - RTW_INFO("%s()error: %x >= %x\n", __func__, Efuse_GetCurrentSize(pAdapter, efuseType, bPseudoTest), (EFUSE_REAL_CONTENT_LEN_8814A-EFUSE_PROTECT_BYTES_BANK_8814A)); - return _FALSE; - } - - return _TRUE; -} - -static VOID -efuse_PgPacketConstruct( - IN u8 offset, - IN u8 word_en, - IN u8* pData, - IN OUT PPGPKT_STRUCT pTargetPkt - ) -{ - _rtw_memset((PVOID)pTargetPkt->data, 0xFF, sizeof(u8)*8); - pTargetPkt->offset = offset; - pTargetPkt->word_en= word_en; - efuse_WordEnableDataRead(word_en, pData, pTargetPkt->data); - pTargetPkt->word_cnts = Efuse_CalculateWordCnts(pTargetPkt->word_en); - - RTW_INFO("efuse_PgPacketConstruct(), targetPkt, offset=%d, word_en=0x%x, word_cnts=%d\n", pTargetPkt->offset, pTargetPkt->word_en, pTargetPkt->word_cnts); -} - - -u16 -efuse_PgPacketExceptionHandle( - IN PADAPTER pAdapter, - IN u16 ErrOffset - ) -{ - RTW_INFO("===> efuse_PgPacketExceptionHandle(), ErrOffset = 0x%X\n", ErrOffset); - - // ErrOffset is the offset of bad (extension) header. - //if (IS_HARDWARE_TYPE_8812AU(pAdapter)) - //ErrOffset = Hal_EfusePgPacketExceptionHandle_8812A(pAdapter, ErrOffset); - - RTW_INFO("<=== efuse_PgPacketExceptionHandle(), recovered! Jump to Offset = 0x%X\n", ErrOffset); - - return ErrOffset; -} - - -static BOOLEAN -hal_EfuseCheckIfDatafollowed( - IN PADAPTER pAdapter, - IN u8 word_cnts, - IN u16 startAddr, - IN BOOLEAN bPseudoTest - ) -{ - BOOLEAN bRet=FALSE; - u8 i, efuse_data; - - for(i=0; i<(word_cnts*2) ; i++) - { - if(efuse_OneByteRead(pAdapter, (startAddr+i) ,&efuse_data, bPseudoTest)&&(efuse_data != 0xFF)) - bRet = TRUE; - } - - return bRet; -} - -static BOOLEAN -hal_EfuseWordEnMatched( - IN PPGPKT_STRUCT pTargetPkt, - IN PPGPKT_STRUCT pCurPkt, - IN u8* pWden -) -{ - u8 match_word_en = 0x0F; // default all words are disabled - - // check if the same words are enabled both target and current PG packet - if( ((pTargetPkt->word_en & BIT0) == 0) && - ((pCurPkt->word_en & BIT0) == 0) ) - { - match_word_en &= ~BIT0; // enable word 0 - } - if( ((pTargetPkt->word_en & BIT1) == 0) && - ((pCurPkt->word_en & BIT1) == 0) ) - { - match_word_en &= ~BIT1; // enable word 1 - } - if( ((pTargetPkt->word_en & BIT2) == 0) && - ((pCurPkt->word_en & BIT2) == 0) ) - { - match_word_en &= ~BIT2; // enable word 2 - } - if( ((pTargetPkt->word_en & BIT3) == 0) && - ((pCurPkt->word_en & BIT3) == 0) ) - { - match_word_en &= ~BIT3; // enable word 3 - } - - *pWden = match_word_en; - - if(match_word_en != 0xf) - return TRUE; - else - return FALSE; -} - - -static BOOLEAN -efuse_PgPacketPartialWrite( - IN PADAPTER pAdapter, - IN u8 efuseType, - IN OUT u16* pAddr, - IN PPGPKT_STRUCT pTargetPkt, - IN BOOLEAN bPseudoTest - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - PEFUSE_HAL pEfuseHal=&(pHalData->EfuseHal); - BOOLEAN bRet=_FALSE; - u8 i, efuse_data=0, cur_header=0; - u8 matched_wden=0, badworden=0; - u16 startAddr=0; - PGPKT_STRUCT curPkt; - u16 max_sec_num = (efuseType == EFUSE_WIFI) ? pEfuseHal->MaxSecNum_WiFi : pEfuseHal->MaxSecNum_BT; - u16 efuse_max = pEfuseHal->BankSize; - u16 efuse_max_available_len = - (efuseType == EFUSE_WIFI) ? pEfuseHal->TotalAvailBytes_WiFi : pEfuseHal->TotalAvailBytes_BT; - - if (bPseudoTest) { - pEfuseHal->fakeEfuseBank = (efuseType == EFUSE_WIFI) ? 0 : pEfuseHal->fakeEfuseBank; - Efuse_GetCurrentSize(pAdapter, efuseType, _TRUE); - } - - //EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_AVAILABLE_EFUSE_BYTES_TOTAL, &efuse_max_available_len, bPseudoTest); - //EFUSE_GetEfuseDefinition(pAdapter, efuseType, TYPE_EFUSE_CONTENT_LEN_BANK, &efuse_max, bPseudoTest); - - if(efuseType == EFUSE_WIFI) - { - if(bPseudoTest) - { -#ifdef HAL_EFUSE_MEMORY - startAddr = (u16)pEfuseHal->fakeEfuseUsedBytes; -#else - startAddr = (u16)fakeEfuseUsedBytes; -#endif - - } - else - { - rtw_hal_get_hwreg(pAdapter, HW_VAR_EFUSE_BYTES, (u8*)&startAddr); - } - } - else - { - if(bPseudoTest) - { -#ifdef HAL_EFUSE_MEMORY - startAddr = (u16)pEfuseHal->fakeBTEfuseUsedBytes; -#else - startAddr = (u16)fakeBTEfuseUsedBytes; -#endif - - } - else - { - rtw_hal_get_hwreg(pAdapter, HW_VAR_EFUSE_BT_BYTES, (u8*)&startAddr); - } - } - - startAddr %= efuse_max; - RTW_INFO("%s: startAddr=%#X\n", __FUNCTION__, startAddr); - RTW_INFO("efuse_PgPacketPartialWrite(), startAddr = 0x%X\n", startAddr); - - while(1) - { - if(startAddr >= efuse_max_available_len) - { - bRet = _FALSE; - RTW_INFO("startAddr(%d) >= efuse_max_available_len(%d)\n", - startAddr, efuse_max_available_len); - break; - } - - if (efuse_OneByteRead(pAdapter, startAddr, &efuse_data, bPseudoTest) && (efuse_data!=0xFF)) - { - if(EXT_HEADER(efuse_data)) - { - cur_header = efuse_data; - startAddr++; - efuse_OneByteRead(pAdapter, startAddr, &efuse_data, bPseudoTest); - if (ALL_WORDS_DISABLED(efuse_data)) - { - u16 recoveredAddr = startAddr; - recoveredAddr = efuse_PgPacketExceptionHandle(pAdapter, startAddr-1); - - if (recoveredAddr == (startAddr-1)) { - RTW_INFO("Error! All words disabled and the recovery failed, (Addr, Data) = (0x%X, 0x%X)\n", - startAddr, efuse_data); - pAdapter->LastError = ERR_INVALID_DATA; - break; - } else { - startAddr = recoveredAddr; - RTW_INFO("Bad extension header but recovered => Keep going.\n"); - continue; - } - } - else - { - curPkt.offset = ((cur_header & 0xE0) >> 5) | ((efuse_data & 0xF0) >> 1); - curPkt.word_en = efuse_data & 0x0F; - } - } - else - { - if (ALL_WORDS_DISABLED(efuse_data)) { - u16 recoveredAddr = startAddr; - recoveredAddr = efuse_PgPacketExceptionHandle(pAdapter, startAddr); - if (recoveredAddr != startAddr) { - efuse_OneByteRead(pAdapter, startAddr, &efuse_data, bPseudoTest); - RTW_INFO("Bad header but recovered => Read header again.\n"); - } - } - - cur_header = efuse_data; - curPkt.offset = (cur_header>>4) & 0x0F; - curPkt.word_en = cur_header & 0x0F; - } - - if (curPkt.offset > max_sec_num) { - pAdapter->LastError = ERR_OUT_OF_RANGE; - pEfuseHal->Status = ERR_OUT_OF_RANGE; - bRet = _FALSE; - break; - } - - curPkt.word_cnts = Efuse_CalculateWordCnts(curPkt.word_en); - // if same header is found but no data followed - // write some part of data followed by the header. - if( (curPkt.offset == pTargetPkt->offset) && - (!hal_EfuseCheckIfDatafollowed(pAdapter, curPkt.word_cnts, startAddr+1, bPseudoTest)) && - hal_EfuseWordEnMatched(pTargetPkt, &curPkt, &matched_wden) ) - { - RTW_INFO("Need to partial write data by the previous wrote header\n"); - //RT_ASSERT(_FALSE, ("Error, Need to partial write data by the previous wrote header!!\n")); - // Here to write partial data - badworden = Efuse_WordEnableDataWrite(pAdapter, startAddr+1, matched_wden, pTargetPkt->data, bPseudoTest); - if(badworden != 0x0F) - { - u32 PgWriteSuccess=0; - // if write fail on some words, write these bad words again - - PgWriteSuccess = Efuse_PgPacketWrite(pAdapter, pTargetPkt->offset, badworden, pTargetPkt->data, bPseudoTest); - - if(!PgWriteSuccess) - { - bRet = _FALSE; // write fail, return - break; - } - } - // partial write ok, update the target packet for later use - for(i=0; i<4; i++) - { - if((matched_wden & (0x1<word_en |= (0x1<word_cnts = Efuse_CalculateWordCnts(pTargetPkt->word_en); - } - // read from next header - startAddr = startAddr + (curPkt.word_cnts*2) +1; - } - else - { - // not used header, 0xff - *pAddr = startAddr; - RTW_INFO("Started from unused header offset=%d\n", startAddr); - bRet = _TRUE; - break; - } - } - return bRet; -} - - -static BOOLEAN -hal_EfuseFixHeaderProcess( - IN PADAPTER pAdapter, - IN u8 efuseType, - IN PPGPKT_STRUCT pFixPkt, - IN u16* pAddr, - IN BOOLEAN bPseudoTest -) -{ - u8 originaldata[8], badworden=0; - u16 efuse_addr=*pAddr; - u32 PgWriteSuccess=0; - - _rtw_memset((PVOID)originaldata, 0xff, 8); - - if(Efuse_PgPacketRead(pAdapter, pFixPkt->offset, originaldata, bPseudoTest)) - { //check if data exist - badworden = Efuse_WordEnableDataWrite(pAdapter, efuse_addr+1, pFixPkt->word_en, originaldata, bPseudoTest); - - if(badworden != 0xf) // write fail - { - PgWriteSuccess = Efuse_PgPacketWrite(pAdapter, pFixPkt->offset, badworden, originaldata, bPseudoTest); - if(!PgWriteSuccess) - return _FALSE; - else - efuse_addr = Efuse_GetCurrentSize(pAdapter, efuseType, bPseudoTest); - } - else - { - efuse_addr = efuse_addr + (pFixPkt->word_cnts*2) +1; - } - } - else - { - efuse_addr = efuse_addr + (pFixPkt->word_cnts*2) +1; - } - *pAddr = efuse_addr; - return _TRUE; -} - - -BOOLEAN -efuse_PgPacketWrite2ByteHeader( - IN PADAPTER pAdapter, - IN u8 efuseType, - IN OUT u16* pAddr, - IN PPGPKT_STRUCT pTargetPkt, - IN BOOLEAN bPseudoTest) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - PEFUSE_HAL pEfuseHal = &(pHalData->EfuseHal); - BOOLEAN bRet=_FALSE; - u16 efuse_addr=*pAddr; - u8 pg_header=0, tmp_header=0, pg_header_temp=0; - u8 repeatcnt=0; - u16 efuse_max_available_len = - (efuseType == EFUSE_WIFI) ? pEfuseHal->TotalAvailBytes_WiFi : pEfuseHal->TotalAvailBytes_BT; - - RTW_INFO("Wirte 2byte header\n"); - - - while(efuse_addr < efuse_max_available_len) - { - pg_header = ((pTargetPkt->offset & 0x07) << 5) | 0x0F; - RTW_INFO("pg_header = 0x%x\n", pg_header); - efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest); - efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest); - - while(tmp_header == 0xFF || pg_header != tmp_header) - { - if(repeatcnt++ > pEfuseHal->DataRetry) - { - RTW_INFO("Repeat over limit for pg_header!!\n"); - return _FALSE; - } - - efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest); - efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest); - } - - //to write ext_header - if(tmp_header == pg_header) - { - efuse_addr++; - pg_header_temp = pg_header; - pg_header = ((pTargetPkt->offset & 0x78) << 1) | pTargetPkt->word_en; - - efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest); - efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest); - - while(tmp_header == 0xFF || pg_header != tmp_header) - { - if(repeatcnt++ > pEfuseHal->DataRetry) - { - RTW_INFO("Repeat over limit for ext_header!!\n"); - return _FALSE; - } - - efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest); - efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest); - } - - if((tmp_header & 0x0F) == 0x0F) //word_en PG fail - { - if(repeatcnt++ > pEfuseHal->DataRetry) - { - RTW_INFO("Repeat over limit for word_en!!\n"); - return _FALSE; - } - else - { - efuse_addr++; - continue; - } - } - else if(pg_header != tmp_header) //offset PG fail - { - PGPKT_STRUCT fixPkt; - //RT_ASSERT(_FALSE, ("Error, efuse_PgPacketWrite2ByteHeader(), offset PG fail, need to cover the existed data!!\n")); - RTW_INFO("Error condition for offset PG fail, need to cover the existed data\n"); - fixPkt.offset = ((pg_header_temp & 0xE0) >> 5) | ((tmp_header & 0xF0) >> 1); - fixPkt.word_en = tmp_header & 0x0F; - fixPkt.word_cnts = Efuse_CalculateWordCnts(fixPkt.word_en); - if(!hal_EfuseFixHeaderProcess(pAdapter, efuseType, &fixPkt, &efuse_addr, bPseudoTest)) - return _FALSE; - } - else - { - bRet = _TRUE; - break; - } - } - else if ((tmp_header & 0x1F) == 0x0F) //wrong extended header - { - efuse_addr+=2; - continue; - } - } - - *pAddr = efuse_addr; - return bRet; -} - - -BOOLEAN -efuse_PgPacketWrite1ByteHeader( - IN PADAPTER pAdapter, - IN u8 efuseType, - IN OUT u16* pAddr, - IN PPGPKT_STRUCT pTargetPkt, - IN BOOLEAN bPseudoTest) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - PEFUSE_HAL pEfuseHal=&(pHalData->EfuseHal); - BOOLEAN bRet=_FALSE; - u8 pg_header=0, tmp_header=0; - u16 efuse_addr=*pAddr; - u8 repeatcnt=0; - - RTW_INFO("Wirte 1byte header\n"); - pg_header = ((pTargetPkt->offset << 4) & 0xf0) |pTargetPkt->word_en; - - if (IS_HARDWARE_TYPE_8723BE(pAdapter)) - efuse_OneByteWrite(pAdapter, 0x1FF, 00, _FALSE); // increase current - - - efuse_OneByteWrite(pAdapter, efuse_addr, pg_header, bPseudoTest); - - if (IS_HARDWARE_TYPE_8723B(pAdapter) || IS_HARDWARE_TYPE_8188E(pAdapter) || - IS_HARDWARE_TYPE_8192E(pAdapter) || IS_HARDWARE_TYPE_8703B(pAdapter) || IS_HARDWARE_TYPE_8188F(pAdapter)) - phy_set_mac_reg(pAdapter, EFUSE_TEST, BIT26, 0); // Use 10K Read, Suggested by Morris & Victor - - efuse_OneByteRead(pAdapter, efuse_addr, &tmp_header, bPseudoTest); - - if (IS_HARDWARE_TYPE_8723B(pAdapter) || IS_HARDWARE_TYPE_8188E(pAdapter) || - IS_HARDWARE_TYPE_8192E(pAdapter) || IS_HARDWARE_TYPE_8703B(pAdapter) || IS_HARDWARE_TYPE_8188F(pAdapter)) - phy_set_mac_reg(pAdapter, EFUSE_TEST, BIT26, 1); // Restored to 1.5K Read, Suggested by Morris & Victor - - - while(tmp_header == 0xFF || pg_header != tmp_header) - { - if(repeatcnt++ > pEfuseHal->HeaderRetry) - { - RTW_INFO("retry %d times fail!!\n", repeatcnt); - return _FALSE; - } - efuse_OneByteWrite(pAdapter,efuse_addr, pg_header, bPseudoTest); - efuse_OneByteRead(pAdapter,efuse_addr, &tmp_header, bPseudoTest); - RTW_INFO("===> efuse_PgPacketWrite1ByteHeader: Keep %d-th retrying, tmp_header = 0x%X\n", repeatcnt, tmp_header); - } - - if(pg_header == tmp_header) - { - bRet = _TRUE; - } - else - { - PGPKT_STRUCT fixPkt; - //RT_ASSERT(_FALSE, ("Error, efuse_PgPacketWrite1ByteHeader(), offset PG fail, need to cover the existed data!!\n")); - RTW_INFO(" pg_header(0x%X) != tmp_header(0x%X)\n", pg_header, tmp_header); - RTW_INFO("Error condition for fixed PG packet, need to cover the existed data: (Addr, Data) = (0x%X, 0x%X)\n", - efuse_addr, tmp_header); - fixPkt.offset = (tmp_header>>4) & 0x0F; - fixPkt.word_en = tmp_header & 0x0F; - fixPkt.word_cnts = Efuse_CalculateWordCnts(fixPkt.word_en); - if(!hal_EfuseFixHeaderProcess(pAdapter, efuseType, &fixPkt, &efuse_addr, bPseudoTest)) - return _FALSE; - } - - *pAddr = efuse_addr; - return bRet; -} - - - -static BOOLEAN -efuse_PgPacketWriteHeader( - IN PADAPTER pAdapter, - IN u8 efuseType, - IN OUT u16* pAddr, - IN PPGPKT_STRUCT pTargetPkt, - IN BOOLEAN bPseudoTest) -{ - BOOLEAN bRet=_FALSE; - - if(pTargetPkt->offset >= EFUSE_MAX_SECTION_BASE) - { - bRet = efuse_PgPacketWrite2ByteHeader(pAdapter, efuseType, pAddr, pTargetPkt, bPseudoTest); - } - else - { - bRet = efuse_PgPacketWrite1ByteHeader(pAdapter, efuseType, pAddr, pTargetPkt, bPseudoTest); - } - - return bRet; -} - -BOOLEAN -efuse_PgPacketWriteData( - IN PADAPTER pAdapter, - IN u8 efuseType, - IN u16* pAddr, - IN PPGPKT_STRUCT pTargetPkt, - IN BOOLEAN bPseudoTest) -{ - BOOLEAN bRet=_FALSE; - u16 efuse_addr=*pAddr; - u8 badworden=0; - u32 PgWriteSuccess=0; - - badworden = 0x0f; - badworden = Efuse_WordEnableDataWrite(pAdapter, efuse_addr+1, pTargetPkt->word_en, pTargetPkt->data, bPseudoTest); - if(badworden == 0x0F) - { - RTW_INFO("efuse_PgPacketWriteData ok!!\n"); - return _TRUE; - } - else - { // Reorganize other pg packet - //RT_ASSERT(_FALSE, ("Error, efuse_PgPacketWriteData(), wirte data fail!!\n")); - RTW_INFO("efuse_PgPacketWriteData Fail!!\n"); - - PgWriteSuccess = Efuse_PgPacketWrite(pAdapter, pTargetPkt->offset, badworden, pTargetPkt->data, bPseudoTest); - if(!PgWriteSuccess) - return _FALSE; - else - return _TRUE; - } - - return bRet; -} - - -int -hal_EfusePgPacketWrite_8814A(IN PADAPTER pAdapter, - IN u8 offset, - IN u8 word_en, - IN u8 *pData, - IN BOOLEAN bPseudoTest) -{ - u8 efuseType = EFUSE_WIFI; - PGPKT_STRUCT targetPkt; - u16 startAddr = 0; - - RTW_INFO("===> efuse_PgPacketWrite[%s], offset: 0x%X\n", (efuseType == EFUSE_WIFI) ? "WIFI" : "BT", offset); - - //4 [1] Check if the remaining space is available to write. - if(!efuse_PgPacketCheck(pAdapter, efuseType, bPseudoTest)) - { - pAdapter->LastError = ERR_WRITE_PROTECT; - RTW_INFO("efuse_PgPacketCheck(), fail!!\n"); - return _FALSE; - } - - //4 [2] Construct a packet to write: (Data, Offset, and WordEnable) - efuse_PgPacketConstruct(offset, word_en, pData, &targetPkt); - - - //4 [3] Fix headers without data or fix bad headers, and then return the address where to get started. - if(!efuse_PgPacketPartialWrite(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest)) - { - pAdapter->LastError = ERR_INVALID_DATA; - RTW_INFO("efuse_PgPacketPartialWrite(), fail!!\n"); - return _FALSE; - } - - //4 [4] Write the (extension) header. - if(!efuse_PgPacketWriteHeader(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest)) - { - pAdapter->LastError = ERR_IO_FAILURE; - RTW_INFO("efuse_PgPacketWriteHeader(), fail!!\n"); - return _FALSE; - } - - //4 [5] Write the data. - if(!efuse_PgPacketWriteData(pAdapter, efuseType, &startAddr, &targetPkt, bPseudoTest)) - { - pAdapter->LastError = ERR_IO_FAILURE; - RTW_INFO("efuse_PgPacketWriteData(), fail!!\n"); - return _FALSE; - } - - RTW_INFO("<=== efuse_PgPacketWrite\n"); - return _TRUE; -} - -static int -rtl8814_Efuse_PgPacketWrite(IN PADAPTER pAdapter, - IN u8 offset, - IN u8 word_en, - IN u8 *data, - IN BOOLEAN bPseudoTest) -{ - int ret; - - ret = hal_EfusePgPacketWrite_8814A(pAdapter, offset, word_en, data, bPseudoTest); - - return ret; -} - -void InitRDGSetting8814A(PADAPTER padapter) -{ - rtw_write8(padapter, REG_RD_CTRL, 0xFF); - rtw_write16(padapter, REG_RD_NAV_NXT, 0x200); - rtw_write8(padapter, REG_RD_RESP_PKT_TH, 0x05); -} - -void ReadRFType8814A(PADAPTER padapter) -{ - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); - -#if DISABLE_BB_RF - pHalData->rf_chip = RF_PSEUDO_11N; -#else - pHalData->rf_chip = RF_6052; -#endif - - //if (pHalData->rf_type == RF_1T1R){ - // pHalData->bRFPathRxEnable[0] = _TRUE; - //} - //else { // Default unknow type is 2T2r - // pHalData->bRFPathRxEnable[0] = pHalData->bRFPathRxEnable[1] = _TRUE; - //} - - if (IsSupported24G(padapter->registrypriv.wireless_mode) && - is_supported_5g(padapter->registrypriv.wireless_mode)) - pHalData->BandSet = BAND_ON_BOTH; - else if (is_supported_5g(padapter->registrypriv.wireless_mode)) - pHalData->BandSet = BAND_ON_5G; - else - pHalData->BandSet = BAND_ON_2_4G; - - //if(padapter->bInHctTest) - // pHalData->BandSet = BAND_ON_2_4G; -} - -void rtl8814_start_thread(PADAPTER padapter) -{ -} - -void rtl8814_stop_thread(PADAPTER padapter) -{ -} - -void hal_notch_filter_8814(_adapter *adapter, bool enable) -{ - if (enable) { - RTW_INFO("Enable notch filter\n"); - //rtw_write8(adapter, rOFDM0_RxDSP+1, rtw_read8(adapter, rOFDM0_RxDSP+1) | BIT1); - } else { - RTW_INFO("Disable notch filter\n"); - //rtw_write8(adapter, rOFDM0_RxDSP+1, rtw_read8(adapter, rOFDM0_RxDSP+1) & ~BIT1); - } -} - -u8 -GetEEPROMSize8814A( - IN PADAPTER Adapter - ) -{ - u8 size = 0; - u32 curRCR; - - curRCR = rtw_read16(Adapter, REG_SYS_EEPROM_CTRL); - size = (curRCR & EEPROMSEL) ? 6 : 4; // 6: EEPROM used is 93C46, 4: boot from E-Fuse. - - RTW_INFO("EEPROM type is %s\n", size==4 ? "E-FUSE" : "93C46"); - //return size; - return 4; // <20120713, Kordan> The default value of HW is 6 ?!! -} - -/* -void CheckAutoloadState8812A(PADAPTER padapter) -{ - - u8 val8; - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); - - - // check system boot selection - val8 = rtw_read8(padapter, REG_9346CR); - pHalData->EepromOrEfuse = (val8 & BOOT_FROM_EEPROM) ? _TRUE : _FALSE; - pHalData->bautoload_fail_flag = (val8 & EEPROM_EN) ? _FALSE : _TRUE; - - RTW_INFO("%s: 9346CR(%#x)=0x%02x, Boot from %s, Autoload %s!\n", - __FUNCTION__, REG_9346CR, val8, - (pHalData->EepromOrEfuse ? "EEPROM" : "EFUSE"), - (pHalData->bautoload_fail_flag ? "Fail" : "OK")); -} -*/ - -void InitPGData8814A(PADAPTER padapter) -{ - u32 i; - u16 val16; - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter); - - if (_FALSE == pHalData->bautoload_fail_flag) - { - // autoload OK. - if (is_boot_from_eeprom(padapter)) - { - // Read all Content from EEPROM or EFUSE. - //for (i = 0; i < HWSET_MAX_SIZE_JAGUAR; i += 2) - { - //val16 = EF2Byte(ReadEEprom(pAdapter, (u16) (i>>1))); - //*((u16*)(&PROMContent[i])) = val16; - } - } - else - { - // Read EFUSE real map to shadow. - EFUSE_ShadowMapUpdate(padapter, EFUSE_WIFI, _FALSE); - } - } - else - { - // update to default value 0xFF - if (!is_boot_from_eeprom(padapter)) - EFUSE_ShadowMapUpdate(padapter, EFUSE_WIFI, _FALSE); - } - -#ifdef CONFIG_EFUSE_CONFIG_FILE - if (check_phy_efuse_tx_power_info_valid(padapter) == _FALSE) { - if (Hal_readPGDataFromConfigFile(padapter) != _SUCCESS) - RTW_ERR("invalid phy efuse and read from file fail, will use driver default!!\n"); - } -#endif -} - -static void read_chip_version_8814a(PADAPTER Adapter) -{ - u32 value32; - PHAL_DATA_TYPE pHalData; - u8 vdr; - - pHalData = GET_HAL_DATA(Adapter); - - value32 = rtw_read32(Adapter, REG_SYS_CFG); - RTW_INFO("%s SYS_CFG(0x%X)=0x%08x \n", __FUNCTION__, REG_SYS_CFG, value32); - - pHalData->version_id.ICType = CHIP_8814A; - - pHalData->version_id.ChipType = ((value32 & RTL_ID) ? TEST_CHIP : NORMAL_CHIP); - - pHalData->version_id.RFType = RF_TYPE_3T3R; - - if(Adapter->registrypriv.special_rf_path == 1) - pHalData->version_id.RFType = RF_TYPE_1T1R; //RF_1T1R; - - vdr = (value32 & EXT_VENDOR_ID) >> EXT_VENDOR_ID_SHIFT; - if(vdr == 0x00) - pHalData->version_id.VendorType = CHIP_VENDOR_TSMC; - else if(vdr == 0x01) - pHalData->version_id.VendorType = CHIP_VENDOR_SMIC; - else if(vdr == 0x02) - pHalData->version_id.VendorType = CHIP_VENDOR_UMC; - - pHalData->version_id.CUTVersion = (value32 & CHIP_VER_RTL_MASK)>>CHIP_VER_RTL_SHIFT; // IC version (CUT) - - pHalData->MultiFunc = RT_MULTI_FUNC_NONE; - - rtw_hal_config_rftype(Adapter); - -#if 1 - dump_chip_info(pHalData->version_id); -#endif - -} - -VOID -hal_PatchwithJaguar_8814( - IN PADAPTER Adapter, - IN RT_MEDIA_STATUS MediaStatus - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct mlme_ext_priv *pmlmeext = &(Adapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - if( (MediaStatus == RT_MEDIA_CONNECT) && - (pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_REALTEK_JAGUAR_BCUTAP )) - { - rtw_write8(Adapter, rVhtlen_Use_Lsig_Jaguar, 0x1); - rtw_write8(Adapter, REG_TCR+3, BIT2); - } - else - { - rtw_write8(Adapter, rVhtlen_Use_Lsig_Jaguar, 0x3F); - rtw_write8(Adapter, REG_TCR+3, BIT0|BIT1|BIT2); - } - - - /*if( (MediaStatus == RT_MEDIA_CONNECT) && - ((pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_REALTEK_JAGUAR_BCUTAP) || - (pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_REALTEK_JAGUAR_CCUTAP))) - { - pHalData->Reg837 |= BIT2; - rtw_write8(Adapter, rBWIndication_Jaguar+3, pHalData->Reg837); - } - else - { - pHalData->Reg837 &= (~BIT2); - rtw_write8(Adapter, rBWIndication_Jaguar+3, pHalData->Reg837); - }*/ -} - -void init_hal_spec_8814a(_adapter *adapter) -{ - struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter); - - hal_spec->ic_name = "rtl8814a"; - hal_spec->macid_num = MACID_NUM_8814A; - hal_spec->sec_cam_ent_num = SEC_CAM_ENT_NUM_8814A; - hal_spec->sec_cap = SEC_CAP_CHK_BMC; - hal_spec->rfpath_num_2g = 3; - hal_spec->rfpath_num_5g = 3; - hal_spec->max_tx_cnt = 4; - hal_spec->txgi_max = 63; - hal_spec->txgi_pdbm = 2; - hal_spec->tx_nss_num = 4; - hal_spec->rx_nss_num = 4; - hal_spec->band_cap = BAND_CAP_8814A; - hal_spec->bw_cap = BW_CAP_8814A; - hal_spec->port_num = 2; - hal_spec->proto_cap = PROTO_CAP_11B | PROTO_CAP_11G | PROTO_CAP_11N | PROTO_CAP_11AC; - - hal_spec->wl_func = 0 - | WL_FUNC_P2P - | WL_FUNC_MIRACAST - | WL_FUNC_TDLS - ; - - hal_spec->pg_txpwr_saddr = 0x10; - hal_spec->pg_txgi_diff_factor = 1; - rtw_macid_ctl_init_sleep_reg(adapter_to_macidctl(adapter) - , REG_MACID_SLEEP - , REG_MACID_SLEEP_1 - , REG_MACID_SLEEP_2 - , REG_MACID_SLEEP_3); - -} - -void InitDefaultValue8814A(PADAPTER padapter) -{ - PHAL_DATA_TYPE pHalData; - struct pwrctrl_priv *pwrctrlpriv; - u8 i; - - pHalData = GET_HAL_DATA(padapter); - pwrctrlpriv = adapter_to_pwrctl(padapter); - - // init default value - pHalData->fw_ractrl = _FALSE; - if (!pwrctrlpriv->bkeepfwalive) - pHalData->LastHMEBoxNum = 0; - - init_hal_spec_8814a(padapter); - - // init dm default value - pHalData->bChnlBWInitialized = _FALSE; - pHalData->bIQKInitialized = _FALSE; - - pHalData->EfuseHal.fakeEfuseBank = 0; - pHalData->EfuseHal.fakeEfuseUsedBytes = 0; - _rtw_memset(pHalData->EfuseHal.fakeEfuseContent, 0xFF, EFUSE_MAX_HW_SIZE); - _rtw_memset(pHalData->EfuseHal.fakeEfuseInitMap, 0xFF, EFUSE_MAX_MAP_LEN); - _rtw_memset(pHalData->EfuseHal.fakeEfuseModifiedMap, 0xFF, EFUSE_MAX_MAP_LEN); -} - -VOID -_InitBeaconParameters_8814A( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u16 val16; - u8 val8; - - val8 = DIS_TSF_UDT; - val16 = val8 | (val8 << 8); // port0 and port1 -#ifdef CONFIG_BT_COEXIST - if (pHalData->EEPROMBluetoothCoexist == 1) - { - // Enable prot0 beacon function for PSTDMA - val16 |= EN_BCN_FUNCTION; - } -#endif - rtw_write16(Adapter, REG_BCN_CTRL, val16); - //rtw_write16(Adapter, REG_BCN_CTRL, 0x1010); - - // TODO: Remove these magic number - rtw_write16(Adapter, REG_TBTT_PROHIBIT,0x6404);// ms - rtw_write8(Adapter, REG_DRVERLYINT, DRIVER_EARLY_INT_TIME_8814);// 5ms - rtw_write8(Adapter, REG_BCNDMATIM, BCN_DMA_ATIME_INT_TIME_8814); // 2ms - - // Suggested by designer timchen. Change beacon AIFS to the largest number - // beacause test chip does not contension before sending beacon. by tynli. 2009.11.03 - rtw_write16(Adapter, REG_BCNTCFG, 0x660F); - - //pHalData->RegBcnCtrlVal = rtw_read8(Adapter, REG_BCN_CTRL); - //pHalData->RegTxPause = rtw_read8(Adapter, REG_TXPAUSE); - //pHalData->RegFwHwTxQCtrl = rtw_read8(Adapter, REG_FWHW_TXQ_CTRL+2); - //pHalData->RegReg542 = rtw_read8(Adapter, REG_TBTT_PROHIBIT+2); - //pHalData->RegCR_1 = rtw_read8(Adapter, REG_CR+1); -} - -static VOID -_BeaconFunctionEnable( - IN PADAPTER Adapter, - IN BOOLEAN Enable, - IN BOOLEAN Linked - ) -{ - rtw_write8(Adapter, REG_BCN_CTRL, (BIT4 | BIT3 | BIT1)); - //SetBcnCtrlReg(Adapter, (BIT4 | BIT3 | BIT1), 0x00); - //RT_TRACE(COMP_BEACON, DBG_LOUD, ("_BeaconFunctionEnable 0x550 0x%x\n", rtw_read8(Adapter, 0x550))); - - rtw_write8(Adapter, REG_RD_CTRL+1, 0x6F); -} - -void SetBeaconRelatedRegisters8814A(PADAPTER padapter) -{ - u32 value32; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv); - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - u32 bcn_ctrl_reg = REG_BCN_CTRL; - //reset TSF, enable update TSF, correcting TSF On Beacon - - //REG_BCN_INTERVAL - //REG_BCNDMATIM - //REG_ATIMWND - //REG_TBTT_PROHIBIT - //REG_DRVERLYINT - //REG_BCN_MAX_ERR - //REG_BCNTCFG //(0x510) - //REG_DUAL_TSF_RST - //REG_BCN_CTRL //(0x550) - - //BCN interval -#ifdef CONFIG_CONCURRENT_MODE - if (padapter->iface_type == IFACE_PORT1){ - bcn_ctrl_reg = REG_BCN_CTRL_1; - } -#endif - rtw_write16(padapter, REG_BCN_INTERVAL, pmlmeinfo->bcn_interval); - rtw_write8(padapter, REG_ATIMWND, 0x02);// 2ms - - _InitBeaconParameters_8814A(padapter); - - rtw_write8(padapter, REG_SLOT, 0x09); - - value32 =rtw_read32(padapter, REG_TCR); - value32 &= ~TSFRST; - rtw_write32(padapter, REG_TCR, value32); - - value32 |= TSFRST; - rtw_write32(padapter, REG_TCR, value32); - - // NOTE: Fix test chip's bug (about contention windows's randomness) - rtw_write8(padapter, REG_RXTSF_OFFSET_CCK, 0x50); - rtw_write8(padapter, REG_RXTSF_OFFSET_OFDM, 0x50); - - _BeaconFunctionEnable(padapter, _TRUE, _TRUE); - - ResumeTxBeacon(padapter); - - //rtw_write8(padapter, 0x422, rtw_read8(padapter, 0x422)|BIT(6)); - - //rtw_write8(padapter, 0x541, 0xff); - - //rtw_write8(padapter, 0x542, rtw_read8(padapter, 0x541)|BIT(0)); - - rtw_write8(padapter, bcn_ctrl_reg, rtw_read8(padapter, bcn_ctrl_reg)|BIT(1)); - -} - -#ifdef CONFIG_BEAMFORMING -#if (BEAMFORMING_SUPPORT == 0) -VOID -SetBeamformingCLK_8812( - IN PADAPTER Adapter - ) -{ - struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(Adapter); - u16 u2btmp; - u8 Count = 0, u1btmp; - - RTW_INFO(" ==>%s\n", __FUNCTION__); - - if ( (check_fwstate(&Adapter->mlmepriv, _FW_UNDER_SURVEY)==_TRUE) -#ifdef CONFIG_CONCURRENT_MODE - || (check_buddy_fwstate(Adapter, _FW_UNDER_SURVEY) == _TRUE) -#endif - ) - { - RTW_INFO(" <==%s return by Scan\n", __FUNCTION__); - return; - } - - // Stop Usb TxDMA - rtw_write_port_cancel(Adapter); - -#ifdef CONFIG_PCI_HCI - // Stop PCIe TxDMA - rtw_write8(Adapter, REG_PCIE_CTRL_REG+1, 0xFE); -#endif - - // Wait TXFF empty - for(Count = 0; Count < 100; Count++) - { - u2btmp = rtw_read16(Adapter, REG_TXPKT_EMPTY); - u2btmp = u2btmp & 0xfff; - if(u2btmp != 0xfff) - { - rtw_mdelay_os(10); - continue; - } - else - break; - } - - RTW_INFO(" Tx Empty count %d \n", Count); - - // TX pause - rtw_write8(Adapter, REG_TXPAUSE, 0xFF); - - // Wait TX State Machine OK - for(Count = 0; Count < 100; Count++) - { - if (rtw_read32(Adapter, REG_SCH_TXCMD_8812A) != 0) - continue; - else - break; - } - - RTW_INFO(" Tx Status count %d\n", Count); - - // Stop RX DMA path - u1btmp = rtw_read8(Adapter, REG_RXDMA_CONTROL_8812A); - rtw_write8(Adapter, REG_RXDMA_CONTROL_8812A, u1btmp | BIT2); - - for(Count = 0; Count < 100; Count++) - { - u1btmp = rtw_read8(Adapter, REG_RXDMA_CONTROL_8812A); - if(u1btmp & BIT1) - break; - else - rtw_mdelay_os(10); - } - - RTW_INFO(" Rx Empty count %d \n", Count); - - // Disable clock - rtw_write8(Adapter, REG_SYS_CLKR+1, 0xf0); - // Disable 320M - rtw_write8(Adapter, REG_AFE_PLL_CTRL+3, 0x8); - // Enable 320M - rtw_write8(Adapter, REG_AFE_PLL_CTRL+3, 0xa); - // Enable clock - rtw_write8(Adapter, REG_SYS_CLKR+1, 0xfc); - - // Release Tx pause - rtw_write8(Adapter, REG_TXPAUSE, 0); - - // Enable RX DMA path - u1btmp = rtw_read8(Adapter, REG_RXDMA_CONTROL_8812A); - rtw_write8(Adapter, REG_RXDMA_CONTROL_8812A, u1btmp & (~BIT2)); - - // Start Usb TxDMA - RTW_ENABLE_FUNC(Adapter, DF_TX_BIT); - RTW_INFO("%s \n", __FUNCTION__); - - RTW_INFO("<==%s\n", __FUNCTION__); -} - -VOID -SetBeamformRfMode_8812( - IN PADAPTER Adapter, - IN struct beamforming_info *pBeamInfo - ) -{ - BOOLEAN bSelfBeamformer = _FALSE; - BOOLEAN bSelfBeamformee = _FALSE; - BEAMFORMING_CAP BeamformCap = BEAMFORMING_CAP_NONE; - - BeamformCap = beamforming_get_beamform_cap(pBeamInfo); - - if(BeamformCap == pBeamInfo->beamforming_cap) - return; - else - pBeamInfo->beamforming_cap = BeamformCap; - - if(GET_RF_TYPE(Adapter) == RF_1T1R) - return; - - bSelfBeamformer = BeamformCap & BEAMFORMER_CAP; - bSelfBeamformee = BeamformCap & BEAMFORMEE_CAP; - - PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_WeLut_Jaguar, 0x80000,0x1); // RF Mode table write enable - PHY_SetRFReg(Adapter, ODM_RF_PATH_B, RF_WeLut_Jaguar, 0x80000,0x1); // RF Mode table write enable - - if(bSelfBeamformer) - { - // Paath_A - PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_ModeTableAddr, 0x78000,0x3); // Select RX mode - PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_ModeTableData0, 0xfffff,0x3F7FF); // Set Table data - PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_ModeTableData1, 0xfffff,0xE26BF); // Enable TXIQGEN in RX mode - // Path_B - PHY_SetRFReg(Adapter, ODM_RF_PATH_B, RF_ModeTableAddr, 0x78000, 0x3); // Select RX mode - PHY_SetRFReg(Adapter, ODM_RF_PATH_B, RF_ModeTableData0, 0xfffff,0x3F7FF); // Set Table data - PHY_SetRFReg(Adapter, ODM_RF_PATH_B, RF_ModeTableData1, 0xfffff,0xE26BF); // Enable TXIQGEN in RX mode - } - else - { - // Paath_A - PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_ModeTableAddr, 0x78000, 0x3); // Select RX mode - PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_ModeTableData0, 0xfffff,0x3F7FF); // Set Table data - PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_ModeTableData1, 0xfffff,0xC26BF); // Disable TXIQGEN in RX mode - // Path_B - PHY_SetRFReg(Adapter, ODM_RF_PATH_B, RF_ModeTableAddr, 0x78000, 0x3); // Select RX mode - PHY_SetRFReg(Adapter, ODM_RF_PATH_B, RF_ModeTableData0, 0xfffff,0x3F7FF); // Set Table data - PHY_SetRFReg(Adapter, ODM_RF_PATH_B, RF_ModeTableData1, 0xfffff,0xC26BF); // Disable TXIQGEN in RX mode - } - - PHY_SetRFReg(Adapter, ODM_RF_PATH_A, RF_WeLut_Jaguar, 0x80000,0x0); // RF Mode table write disable - PHY_SetRFReg(Adapter, ODM_RF_PATH_B, RF_WeLut_Jaguar, 0x80000,0x0); // RF Mode table write disable - - if(bSelfBeamformer) - PHY_SetBBReg(Adapter, rTxPath_Jaguar, bMaskByte1, 0x33); - else - PHY_SetBBReg(Adapter, rTxPath_Jaguar, bMaskByte1, 0x11); -} - - - -VOID -SetBeamformEnter_8812( - IN PADAPTER Adapter, - IN u8 Idx - ) -{ - u8 i = 0; - u32 CSI_Param; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); - struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv); - struct beamforming_entry BeamformEntry = pBeamInfo->beamforming_entry[Idx]; - u16 STAid = 0; - - SetBeamformRfMode_8812(Adapter, pBeamInfo); - - if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) - STAid = BeamformEntry.mac_id; - else - STAid = BeamformEntry.p_aid; - - // Sounding protocol control - rtw_write8(Adapter, REG_SND_PTCL_CTRL_8812A, 0xCB); - - // MAC addresss/Partial AID of Beamformer - if(Idx == 0) - { - for(i = 0; i < 6 ; i++) - rtw_write8(Adapter, (REG_BFMER0_INFO_8812A+i), BeamformEntry.mac_addr[i]); - /* CSI report use legacy ofdm so don't need to fill P_AID.*/ - /*rtw_write16(Adapter, REG_BFMER0_INFO_8812A+6, BeamformEntry.P_AID);*/ - } - else - { - for(i = 0; i < 6 ; i++) - rtw_write8(Adapter, (REG_BFMER1_INFO_8812A+i), BeamformEntry.mac_addr[i]); - /* CSI report use legacy ofdm so don't need to fill P_AID.*/ - /*rtw_write16(Adapter, REG_BFMER1_INFO_8812A+6, BeamformEntry.P_AID);*/ - } - - // CSI report parameters of Beamformee - if( (BeamformEntry.beamforming_entry_cap & BEAMFORMEE_CAP_VHT_SU) || - (BeamformEntry.beamforming_entry_cap & BEAMFORMER_CAP_VHT_SU) ) - { - if(pHalData->rf_type == RF_2T2R) - CSI_Param = 0x01090109; - else - CSI_Param = 0x01080108; - } - else - { - if(pHalData->rf_type == RF_2T2R) - CSI_Param = 0x03090309; - else - CSI_Param = 0x03080308; - } - - if(pHalData->rf_type == RF_2T2R) - rtw_write32(Adapter, 0x9B4, 0x00000000); // Nc =2 - else - rtw_write32(Adapter, 0x9B4, 0x01081008); // Nc =1 - - rtw_write32(Adapter, REG_CSI_RPT_PARAM_BW20_8812A, CSI_Param); - rtw_write32(Adapter, REG_CSI_RPT_PARAM_BW40_8812A, CSI_Param); - rtw_write32(Adapter, REG_CSI_RPT_PARAM_BW80_8812A, CSI_Param); - - // P_AID of Beamformee & enable NDPA transmission & enable NDPA interrupt - if(Idx == 0) - { - rtw_write16(Adapter, REG_TXBF_CTRL_8812A, STAid); - rtw_write8(Adapter, REG_TXBF_CTRL_8812A+3, rtw_read8(Adapter, REG_TXBF_CTRL_8812A+3)|BIT4|BIT6|BIT7); - } - else - { - rtw_write16(Adapter, REG_TXBF_CTRL_8812A+2, STAid | BIT12 | BIT14 | BIT15); - } - - // CSI report parameters of Beamformee - if(Idx == 0) - { - // Get BIT24 & BIT25 - u8 tmp = rtw_read8(Adapter, REG_BFMEE_SEL_8812A+3) & 0x3; - - rtw_write8(Adapter, REG_BFMEE_SEL_8812A+3, tmp | 0x60); - rtw_write16(Adapter, REG_BFMEE_SEL_8812A, STAid | BIT9); - } - else - { - // Set BIT25 - rtw_write16(Adapter, REG_BFMEE_SEL_8812A+2, STAid | (0xE2 << 8)); - } - - // Timeout value for MAC to leave NDP_RX_standby_state (60 us, Test chip) (80 us, MP chip) - rtw_write8(Adapter, REG_SND_PTCL_CTRL_8812A+3, 0x50); - - beamforming_notify(Adapter); -} - - -VOID -SetBeamformLeave_8812( - IN PADAPTER Adapter, - IN u8 Idx - ) -{ - struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(&(Adapter->mlmepriv)); - - SetBeamformRfMode_8812(Adapter, pBeamInfo); - - /* Clear P_AID of Beamformee - * Clear MAC addresss of Beamformer - * Clear Associated Bfmee Sel - */ - if(pBeamInfo->beamforming_cap == BEAMFORMING_CAP_NONE) - rtw_write8(Adapter, REG_SND_PTCL_CTRL_8812A, 0xC8); - - if(Idx == 0) - { - rtw_write16(Adapter, REG_TXBF_CTRL_8812A, 0); - - rtw_write32(Adapter, REG_BFMER0_INFO_8812A, 0); - rtw_write16(Adapter, REG_BFMER0_INFO_8812A+4, 0); - - rtw_write16(Adapter, REG_BFMEE_SEL_8812A, 0); - } - else - { - rtw_write16(Adapter, REG_TXBF_CTRL_8812A+2, rtw_read16(Adapter, REG_TXBF_CTRL_8812A+2) & 0xF000); - - rtw_write32(Adapter, REG_BFMER1_INFO_8812A, 0); - rtw_write16(Adapter, REG_BFMER1_INFO_8812A+4, 0); - - rtw_write16(Adapter, REG_BFMEE_SEL_8812A+2, rtw_read16(Adapter, REG_BFMEE_SEL_8812A+2) & 0x60); - } -} - - -VOID -SetBeamformStatus_8812( - IN PADAPTER Adapter, - IN u8 Idx - ) -{ - u16 BeamCtrlVal; - u32 BeamCtrlReg; - struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); - struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv); - struct beamforming_entry BeamformEntry = pBeamInfo->beamforming_entry[Idx]; - - if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) - BeamCtrlVal = BeamformEntry.mac_id; - else - BeamCtrlVal = BeamformEntry.p_aid; - - if(Idx == 0) - BeamCtrlReg = REG_TXBF_CTRL_8812A; - else - { - BeamCtrlReg = REG_TXBF_CTRL_8812A+2; - BeamCtrlVal |= BIT12 | BIT14|BIT15; - } - - if(BeamformEntry.beamforming_entry_state == BEAMFORMING_ENTRY_STATE_PROGRESSED) - { - if(BeamformEntry.sound_bw == CHANNEL_WIDTH_20) - BeamCtrlVal |= BIT9; - else if(BeamformEntry.sound_bw == CHANNEL_WIDTH_40) - BeamCtrlVal |= BIT10; - else if(BeamformEntry.sound_bw == CHANNEL_WIDTH_80) - BeamCtrlVal |= BIT11; - } - else - { - BeamCtrlVal &= ~(BIT9|BIT10|BIT11); - } - - rtw_write16(Adapter, BeamCtrlReg, BeamCtrlVal); - - RTW_INFO("%s Idx %d BeamCtrlReg %x BeamCtrlVal %x\n", __FUNCTION__, Idx, BeamCtrlReg, BeamCtrlVal); -} - - -VOID -SetBeamformFwTxBFCmd_8812( - IN PADAPTER Adapter - ) -{ - u8 Idx, Period0 = 0, Period1 = 0; - u8 PageNum0 = 0xFF, PageNum1 = 0xFF; - u8 u1TxBFParm[3]={0}; - - struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); - struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(pmlmepriv); - - for(Idx = 0; Idx < BEAMFORMING_ENTRY_NUM; Idx++) - { - if(pBeamInfo->beamforming_entry[Idx].beamforming_entry_state == BEAMFORMING_ENTRY_STATE_PROGRESSED) - { - if(Idx == 0) - { - if(pBeamInfo->beamforming_entry[Idx].bSound) - PageNum0 = 0xFE; - else - PageNum0 = 0xFF; //stop sounding - Period0 = (u8)(pBeamInfo->beamforming_entry[Idx].sound_period); - } - else if(Idx == 1) - { - if(pBeamInfo->beamforming_entry[Idx].bSound) - PageNum1 = 0xFE; - else - PageNum1 = 0xFF; //stop sounding - Period1 = (u8)(pBeamInfo->beamforming_entry[Idx].sound_period); - } - } - } - - u1TxBFParm[0] = PageNum0; - u1TxBFParm[1] = PageNum1; - u1TxBFParm[2] = (Period1 << 4) | Period0; - FillH2CCmd_8812(Adapter, H2C_8812_TxBF, 3, u1TxBFParm); - - RTW_INFO("%s PageNum0 = %d Period0 = %d\n", __FUNCTION__, PageNum0, Period0); - RTW_INFO("PageNum1 = %d Period1 %d\n", PageNum1, Period1); -} - - -VOID -SetBeamformDownloadNDPA_8812( - IN PADAPTER Adapter, - IN u8 Idx - ) -{ - u8 u1bTmp=0, tmpReg422=0, Head_Page; - u8 BcnValidReg=0, count=0, DLBcnCount=0; - BOOLEAN bSendBeacon=_FALSE; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u16 TxPageBndy= LAST_ENTRY_OF_TX_PKT_BUFFER_8812; // default reseved 1 page for the IC type which is undefined. - struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(&(Adapter->mlmepriv)); - struct beamforming_entry *pBeamEntry = pBeamInfo->beamforming_entry+Idx; - - //pHalData->bFwDwRsvdPageInProgress = _TRUE; - - if(Idx == 0) - Head_Page = 0xFE; - else - Head_Page = 0xFE; - - rtw_hal_get_def_var(Adapter, HAL_DEF_TX_PAGE_BOUNDARY, (u16 *)&TxPageBndy); - - //Set REG_CR bit 8. DMA beacon by SW. - u1bTmp = rtw_read8(Adapter, REG_CR+1); - rtw_write8(Adapter, REG_CR+1, (u1bTmp|BIT0)); - - pHalData->RegCR_1 |= BIT0; - rtw_write8(Adapter, REG_CR+1, pHalData->RegCR_1); - - // Set FWHW_TXQ_CTRL 0x422[6]=0 to tell Hw the packet is not a real beacon frame. - tmpReg422 = rtw_read8(Adapter, REG_FWHW_TXQ_CTRL+2); - rtw_write8(Adapter, REG_FWHW_TXQ_CTRL+2, tmpReg422&(~BIT6)); - - if(tmpReg422&BIT6) - { - RTW_INFO("SetBeamformDownloadNDPA_8812(): There is an Adapter is sending beacon.\n"); - bSendBeacon = _TRUE; - } - - // TDECTRL[15:8] 0x209[7:0] = 0xF6 Beacon Head for TXDMA - rtw_write8(Adapter,REG_TDECTRL+1, Head_Page); - - do - { - // Clear beacon valid check bit. - BcnValidReg = rtw_read8(Adapter, REG_TDECTRL+2); - rtw_write8(Adapter, REG_TDECTRL+2, (BcnValidReg|BIT0)); - - // download NDPA rsvd page. - if(pBeamEntry->beamforming_entry_cap & BEAMFORMER_CAP_VHT_SU) - beamforming_send_vht_ndpa_packet(Adapter,pBeamEntry->mac_addr,pBeamEntry->aid,pBeamEntry->sound_bw, BCN_QUEUE_INX); - else - beamforming_send_ht_ndpa_packet(Adapter,pBeamEntry->mac_addr,pBeamEntry->sound_bw, BCN_QUEUE_INX); - - // check rsvd page download OK. - BcnValidReg = rtw_read8(Adapter, REG_TDECTRL+2); - count=0; - while(!(BcnValidReg & BIT0) && count <20) - { - count++; - rtw_udelay_os(10); - BcnValidReg = rtw_read8(Adapter, REG_TDECTRL+2); - } - DLBcnCount++; - }while(!(BcnValidReg&BIT0) && DLBcnCount<5); - - if(!(BcnValidReg&BIT0)) - RTW_INFO("%s Download RSVD page failed!\n", __FUNCTION__); - - // TDECTRL[15:8] 0x209[7:0] = 0xF6 Beacon Head for TXDMA - rtw_write8(Adapter,REG_TDECTRL+1, TxPageBndy); - - // To make sure that if there exists an adapter which would like to send beacon. - // If exists, the origianl value of 0x422[6] will be 1, we should check this to - // prevent from setting 0x422[6] to 0 after download reserved page, or it will cause - // the beacon cannot be sent by HW. - // 2010.06.23. Added by tynli. - if(bSendBeacon) - { - rtw_write8(Adapter, REG_FWHW_TXQ_CTRL+2, tmpReg422); - } - - // Do not enable HW DMA BCN or it will cause Pcie interface hang by timing issue. 2011.11.24. by tynli. - // Clear CR[8] or beacon packet will not be send to TxBuf anymore. - u1bTmp = rtw_read8(Adapter, REG_CR+1); - rtw_write8(Adapter, REG_CR+1, (u1bTmp&(~BIT0))); - - pBeamEntry->beamforming_entry_state = BEAMFORMING_ENTRY_STATE_PROGRESSED; - - //pHalData->bFwDwRsvdPageInProgress = _FALSE; -} - -VOID -SetBeamformFwTxBF_8812( - IN PADAPTER Adapter, - IN u8 Idx - ) -{ - struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(&(Adapter->mlmepriv)); - struct beamforming_entry *pBeamEntry = pBeamInfo->beamforming_entry+Idx; - - if(pBeamEntry->beamforming_entry_state == BEAMFORMING_ENTRY_STATE_PROGRESSING) - SetBeamformDownloadNDPA_8812(Adapter, Idx); - - SetBeamformFwTxBFCmd_8812(Adapter); -} - - -VOID -SetBeamformPatch_8812( - IN PADAPTER Adapter, - IN u8 Operation - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct beamforming_info *pBeamInfo = GET_BEAMFORM_INFO(&(Adapter->mlmepriv)); - - if(pBeamInfo->beamforming_cap == BEAMFORMING_CAP_NONE) - return; - - /*if(Operation == SCAN_OPT_BACKUP_BAND0) - { - rtw_write8(Adapter, REG_SND_PTCL_CTRL_8812A, 0xC8); - } - else if(Operation == SCAN_OPT_RESTORE) - { - rtw_write8(Adapter, REG_SND_PTCL_CTRL_8812A, 0xCB); - }*/ -} - -#endif /*#if (BEAMFORMING_SUPPORT == 0) for driver's TxBF*/ -#endif /*CONFIG_BEAMFORMING*/ - -static void hw_var_set_monitor(PADAPTER Adapter, u8 variable, u8 *val) -{ - u32 value_rcr, rcr_bits; - u16 value_rxfltmap2; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv); - - if (*((u8 *)val) == _HW_STATE_MONITOR_) { - - /* Leave IPS */ - rtw_pm_set_ips(Adapter, IPS_NONE); - LeaveAllPowerSaveMode(Adapter); - - /* Receive all type */ - rcr_bits = RCR_AAP | RCR_APM | RCR_AM | RCR_AB | RCR_APWRMGT | RCR_ADF | RCR_ACF | RCR_AMF | RCR_APP_PHYST_RXFF; - - /* Append FCS */ - rcr_bits |= RCR_APPFCS; - - #if 0 - /* - CRC and ICV packet will drop in recvbuf2recvframe() - We no turn on it. - */ - rcr_bits |= (RCR_ACRC32 | RCR_AICV); - #endif - - /* Receive all data frames */ - value_rxfltmap2 = 0xFFFF; - - value_rcr = rcr_bits; - rtw_write32(Adapter, REG_RCR, value_rcr); - - rtw_write16(Adapter, REG_RXFLTMAP2, value_rxfltmap2); - - #if 0 - /* tx pause */ - rtw_write8(padapter, REG_TXPAUSE, 0xFF); - #endif - } else { - /* do nothing */ - } - -} - -static void hw_var_set_opmode(PADAPTER Adapter, u8 variable, u8* val) -{ - u8 val8; - u8 mode = *((u8 *)val); - u32 value_rcr; - static u8 isMonitor = _FALSE; - - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - if (isMonitor == _TRUE) { - /* reset RCR */ - rtw_write32(Adapter, REG_RCR, pHalData->ReceiveConfig); - isMonitor = _FALSE; - } - - if (mode == _HW_STATE_MONITOR_) { - isMonitor = _TRUE; - /* set net_type */ - Set_MSR(Adapter, _HW_STATE_NOLINK_); - - hw_var_set_monitor(Adapter, variable, val); - return; - } - -#ifdef CONFIG_CONCURRENT_MODE - if(Adapter->iface_type == IFACE_PORT1) - { - // disable Port1 TSF update - rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|DIS_TSF_UDT); - - // set net_type - val8 = rtw_read8(Adapter, MSR)&0x03; - val8 |= (mode<<2); - rtw_write8(Adapter, MSR, val8); - - RTW_INFO("%s()-%d mode = %d\n", __FUNCTION__, __LINE__, mode); - - if((mode == _HW_STATE_STATION_) || (mode == _HW_STATE_NOLINK_)) - { - if(!check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE)) - { - StopTxBeacon(Adapter); -#ifdef CONFIG_PCI_HCI - UpdateInterruptMask8814AE(Adapter, 0, 0, RT_BCN_INT_MASKS, 0); -#else //CONFIG_PCI_HCI - #ifdef CONFIG_INTERRUPT_BASED_TXBCN - - #ifdef CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT - rtw_write8(Adapter, REG_DRVERLYINT, 0x05);//restore early int time to 5ms - UpdateInterruptMask8814AU(Adapter,_TRUE, 0, IMR_BCNDMAINT0_8812); - #endif // CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT - - #ifdef CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR - UpdateInterruptMask8814AU(Adapter,_TRUE ,0, (IMR_TXBCN0ERR_8812|IMR_TXBCN0OK_8812)); - #endif// CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR - - #endif //CONFIG_INTERRUPT_BASED_TXBCN -#endif //CONFIG_PCI_HCI - } - - rtw_write8(Adapter,REG_BCN_CTRL_1, 0x11);//disable atim wnd and disable beacon function - //rtw_write8(Adapter,REG_BCN_CTRL_1, 0x18); - } - else if (mode == _HW_STATE_ADHOC_) /*|| (mode == _HW_STATE_AP_)*/ - { -#ifdef RTL8814AE_SW_BCN - /*Beacon is polled to TXBUF*/ - rtw_write16(Adapter, REG_CR, rtw_read16(Adapter, REG_CR)|BIT(8)); - RTW_INFO("%s-%d: enable SW BCN, REG_CR=0x%x\n", __func__, __LINE__, rtw_read32(Adapter, REG_CR)); -#endif - ResumeTxBeacon(Adapter); - rtw_write8(Adapter,REG_BCN_CTRL_1, 0x1a); - } - else if(mode == _HW_STATE_AP_) - { -#ifdef CONFIG_PCI_HCI - UpdateInterruptMask8814AE(Adapter, RT_BCN_INT_MASKS, 0, 0, 0); -#else - #ifdef CONFIG_INTERRUPT_BASED_TXBCN - #ifdef CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT - UpdateInterruptMask8814AU(Adapter,_TRUE ,IMR_BCNDMAINT0_8812, 0); - #endif//CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT - - #ifdef CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR - UpdateInterruptMask8814AU(Adapter,_TRUE ,(IMR_TXBCN0ERR_8812|IMR_TXBCN0OK_8812), 0); - #endif//CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR - - #endif //CONFIG_INTERRUPT_BASED_TXBCN -#endif - - ResumeTxBeacon(Adapter); - - rtw_write8(Adapter, REG_BCN_CTRL_1, 0x12); - -#ifdef RTL8814AE_SW_BCN - rtw_write16(Adapter, REG_CR, rtw_read16(Adapter, REG_CR)|BIT(8)); - RTW_INFO("%s-%d: enable SW BCN, REG_CR=0x%x\n", __func__, __LINE__, rtw_read32(Adapter, REG_CR)); -#endif - //Set RCR - //rtw_write32(padapter, REG_RCR, 0x70002a8e);//CBSSID_DATA must set to 0 - //rtw_write32(Adapter, REG_RCR, 0x7000228e);//CBSSID_DATA must set to 0 - //rtw_write32(Adapter, REG_RCR, 0x7000208e);//CBSSID_DATA must set to 0,reject ICV_ERR packet - value_rcr = rtw_read32(Adapter, REG_RCR); - value_rcr &= ~(RCR_CBSSID_DATA);//Clear CBSSID_DATA - rtw_write32(Adapter, REG_RCR, value_rcr); - - //enable to rx data frame - rtw_write16(Adapter, REG_RXFLTMAP2, 0xFFFF); - - //Beacon Control related register for first time - rtw_write8(Adapter, REG_BCNDMATIM, 0x02); // 2ms - - //rtw_write8(Adapter, REG_BCN_MAX_ERR, 0xFF); - rtw_write8(Adapter, REG_ATIMWND_1, 0x0a); // 10ms for port1 - rtw_write16(Adapter, REG_BCNTCFG, 0x00); - rtw_write16(Adapter, REG_TBTT_PROHIBIT, 0xff04); - rtw_write16(Adapter, REG_TSFTR_SYN_OFFSET, 0x7fff);// +32767 (~32ms) - - //reset TSF2 - rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(1)); - - //enable BCN1 Function for if2 - //don't enable update TSF1 for if2 (due to TSF update when beacon/probe rsp are received) - rtw_write8(Adapter, REG_BCN_CTRL_1, (DIS_TSF_UDT|EN_BCN_FUNCTION | EN_TXBCN_RPT|DIS_BCNQ_SUB)); - -#ifdef CONFIG_CONCURRENT_MODE - if(check_buddy_fwstate(Adapter, WIFI_FW_NULL_STATE)) - rtw_write8(Adapter, REG_BCN_CTRL, - rtw_read8(Adapter, REG_BCN_CTRL) & ~EN_BCN_FUNCTION); -#endif - //BCN1 TSF will sync to BCN0 TSF with offset(0x518) if if1_sta linked - //rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|BIT(5)); - //rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(3)); - - //dis BCN0 ATIM WND if if1 is station - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|DIS_ATIM); - -#ifdef CONFIG_TSF_RESET_OFFLOAD - // Reset TSF for STA+AP concurrent mode - if ( check_buddy_fwstate(Adapter, (WIFI_STATION_STATE|WIFI_ASOC_STATE)) ) { - if (reset_tsf(Adapter, IFACE_PORT1) == _FALSE) - RTW_INFO("ERROR! %s()-%d: Reset port1 TSF fail\n", - __FUNCTION__, __LINE__); - } -#endif // CONFIG_TSF_RESET_OFFLOAD - } - } - else //else for port0 -#endif // CONFIG_CONCURRENT_MODE - { - // disable Port0 TSF update - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|DIS_TSF_UDT); - - // set net_type - val8 = rtw_read8(Adapter, MSR)&0x0c; - val8 |= mode; - rtw_write8(Adapter, MSR, val8); - - RTW_INFO("%s()-%d mode = %d\n", __FUNCTION__, __LINE__, mode); - - if((mode == _HW_STATE_STATION_) || (mode == _HW_STATE_NOLINK_)) - { -#ifdef CONFIG_CONCURRENT_MODE - if(!check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE)) -#endif // CONFIG_CONCURRENT_MODE - { - StopTxBeacon(Adapter); -#ifdef CONFIG_PCI_HCI - UpdateInterruptMask8814AE(Adapter, 0, 0, RT_BCN_INT_MASKS, 0); -#else - #ifdef CONFIG_INTERRUPT_BASED_TXBCN - #ifdef CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT - rtw_write8(Adapter, REG_DRVERLYINT, 0x05);//restore early int time to 5ms - UpdateInterruptMask8814AU(Adapter,_TRUE, 0, IMR_BCNDMAINT0_8812); - #endif//CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT - - #ifdef CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR - UpdateInterruptMask8814AU(Adapter,_TRUE ,0, (IMR_TXBCN0ERR_8812|IMR_TXBCN0OK_8812)); - #endif //CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR - - #endif //CONFIG_INTERRUPT_BASED_TXBCN -#endif - } - - rtw_write8(Adapter,REG_BCN_CTRL, 0x19);//disable atim wnd - //rtw_write8(Adapter,REG_BCN_CTRL, 0x18); - } - else if (mode == _HW_STATE_ADHOC_) /*|| (mode == _HW_STATE_AP_)*/ - { -#ifdef RTL8814AE_SW_BCN - rtw_write16(Adapter, REG_CR, rtw_read16(Adapter, REG_CR)|BIT(8)); - RTW_INFO("%s-%d: enable SW BCN, REG_CR=0x%x\n", __func__, __LINE__, rtw_read32(Adapter, REG_CR)); -#endif - ResumeTxBeacon(Adapter); - rtw_write8(Adapter,REG_BCN_CTRL, 0x1a); - } - else if(mode == _HW_STATE_AP_) - { -#ifdef CONFIG_PCI_HCI - UpdateInterruptMask8814AE(Adapter, RT_BCN_INT_MASKS, 0, 0, 0); -#else - #ifdef CONFIG_INTERRUPT_BASED_TXBCN - #ifdef CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT - UpdateInterruptMask8814AU(Adapter,_TRUE ,IMR_BCNDMAINT0_8812, 0); - #endif//CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT - - #ifdef CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR - UpdateInterruptMask8814AU(Adapter,_TRUE ,(IMR_TXBCN0ERR_8812|IMR_TXBCN0OK_8812), 0); - #endif//CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR - - #endif //CONFIG_INTERRUPT_BASED_TXBCN -#endif - - ResumeTxBeacon(Adapter); - - rtw_write8(Adapter, REG_BCN_CTRL, 0x12); - /*Beacon is polled to TXBUF*/ -#ifdef RTL8814AE_SW_BCN - rtw_write16(Adapter, REG_CR, rtw_read16(Adapter, REG_CR)|BIT(8)); - RTW_INFO("%s-%d: enable SW BCN, REG_CR=0x%x\n", __func__, __LINE__, rtw_read32(Adapter, REG_CR)); -#endif - - //Set RCR - //rtw_write32(padapter, REG_RCR, 0x70002a8e);//CBSSID_DATA must set to 0 - //rtw_write32(Adapter, REG_RCR, 0x7000228e);//CBSSID_DATA must set to 0 - //rtw_write32(Adapter, REG_RCR, 0x7000208e);//CBSSID_DATA must set to 0,reject ICV_ERR packet - value_rcr = rtw_read32(Adapter, REG_RCR); - value_rcr &= ~(RCR_CBSSID_DATA);//Clear CBSSID_DATA - rtw_write32(Adapter, REG_RCR, value_rcr); - - //enable to rx data frame - rtw_write16(Adapter, REG_RXFLTMAP2, 0xFFFF); - - //Beacon Control related register for first time - rtw_write8(Adapter, REG_BCNDMATIM, 0x02); // 2ms - - //rtw_write8(Adapter, REG_BCN_MAX_ERR, 0xFF); - rtw_write8(Adapter, REG_ATIMWND, 0x0a); // 10ms - rtw_write16(Adapter, REG_BCNTCFG, 0x00); - rtw_write16(Adapter, REG_TBTT_PROHIBIT, 0xff04); - rtw_write16(Adapter, REG_TSFTR_SYN_OFFSET, 0x7fff);// +32767 (~32ms) - - //reset TSF - rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(0)); - - //enable BCN0 Function for if1 - //don't enable update TSF0 for if1 (due to TSF update when beacon/probe rsp are received) - rtw_write8(Adapter, REG_BCN_CTRL, (DIS_TSF_UDT|EN_BCN_FUNCTION | EN_TXBCN_RPT|DIS_BCNQ_SUB)); - -#ifdef CONFIG_CONCURRENT_MODE - if(check_buddy_fwstate(Adapter, WIFI_FW_NULL_STATE)) - rtw_write8(Adapter, REG_BCN_CTRL_1, - rtw_read8(Adapter, REG_BCN_CTRL_1) & ~EN_BCN_FUNCTION); -#endif - - //dis BCN1 ATIM WND if if2 is station - rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|DIS_ATIM); -#ifdef CONFIG_TSF_RESET_OFFLOAD - // Reset TSF for STA+AP concurrent mode - if ( check_buddy_fwstate(Adapter, (WIFI_STATION_STATE|WIFI_ASOC_STATE)) ) { - if (reset_tsf(Adapter, IFACE_PORT0) == _FALSE) - RTW_INFO("ERROR! %s()-%d: Reset port0 TSF fail\n", - __FUNCTION__, __LINE__); - } -#endif // CONFIG_TSF_RESET_OFFLOAD - } - } -} - -static void hw_var_set_macaddr(PADAPTER Adapter, u8 variable, u8* val) -{ - u8 idx = 0; - u32 reg_macid; - -#ifdef CONFIG_CONCURRENT_MODE - if(Adapter->iface_type == IFACE_PORT1) - { - reg_macid = REG_MACID1; - } - else -#endif - { - reg_macid = REG_MACID; - } - - for(idx = 0 ; idx < 6; idx++) - { - rtw_write8(GET_PRIMARY_ADAPTER(Adapter), (reg_macid+idx), val[idx]); - } - -} - -static void hw_var_set_bssid(PADAPTER Adapter, u8 variable, u8* val) -{ - u8 idx = 0; - u32 reg_bssid; - -#ifdef CONFIG_CONCURRENT_MODE - if(Adapter->iface_type == IFACE_PORT1) - { - reg_bssid = REG_BSSID1; - } - else -#endif //CONFIG_CONCURRENT_MODE - { - reg_bssid = REG_BSSID; - } - - for(idx = 0 ; idx < 6; idx++) - { - rtw_write8(Adapter, (reg_bssid+idx), val[idx]); - } - -} - -static void hw_var_set_bcn_func(PADAPTER Adapter, u8 variable, u8* val) -{ - u32 bcn_ctrl_reg; - u8 val8; -#ifdef CONFIG_CONCURRENT_MODE - if(Adapter->iface_type == IFACE_PORT1) - { - bcn_ctrl_reg = REG_BCN_CTRL_1; - } - else -#endif - { - bcn_ctrl_reg = REG_BCN_CTRL; - } - - if(*((u8 *)val)) - { - rtw_write8(Adapter, bcn_ctrl_reg, (EN_BCN_FUNCTION | EN_TXBCN_RPT)); - } - else - { - - u8 val8; - val8 = rtw_read8(Adapter, bcn_ctrl_reg); - val8 &= ~(EN_BCN_FUNCTION | EN_TXBCN_RPT); - -#ifdef CONFIG_BT_COEXIST - if (GET_HAL_DATA(Adapter)->EEPROMBluetoothCoexist == 1) - { - // Always enable port0 beacon function for PSTDMA - if (REG_BCN_CTRL == bcn_ctrl_reg) - val8 |= EN_BCN_FUNCTION; - } -#endif //CONFIG_BT_COEXIST - - rtw_write8(Adapter, bcn_ctrl_reg, val8); - } - - -} - -static void hw_var_set_correct_tsf(PADAPTER Adapter, u8 variable, u8* val) -{ -#if 0 //check 8814 still need sw sync tsf?? -#ifdef CONFIG_CONCURRENT_MODE - u64 tsf; - struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - //tsf = pmlmeext->TSFValue - ((u32)pmlmeext->TSFValue % (pmlmeinfo->bcn_interval*1024)) -1024; //us - tsf = pmlmeext->TSFValue - rtw_modular64(pmlmeext->TSFValue, (pmlmeinfo->bcn_interval*1024)) -1024; //us - - if(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)) - { - //pHalData->RegTxPause |= STOP_BCNQ;BIT(6) - //rtw_write8(Adapter, REG_TXPAUSE, (rtw_read8(Adapter, REG_TXPAUSE)|BIT(6))); - StopTxBeacon(Adapter); - } - - if(Adapter->iface_type == IFACE_PORT1) - { - //disable related TSF function - rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)&(~BIT(3))); - - rtw_write32(Adapter, REG_TSFTR1, tsf); - rtw_write32(Adapter, REG_TSFTR1+4, tsf>>32); - - - //enable related TSF function - rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|BIT(3)); - - // Update buddy port's TSF if it is SoftAP for beacon TX issue! - if ( (pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE - && check_buddy_fwstate(Adapter, WIFI_AP_STATE) - ) { - //disable related TSF function - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(3))); - - rtw_write32(Adapter, REG_TSFTR, tsf); - rtw_write32(Adapter, REG_TSFTR+4, tsf>>32); - - //enable related TSF function - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(3)); -#ifdef CONFIG_TSF_RESET_OFFLOAD - // Update buddy port's TSF(TBTT) if it is SoftAP for beacon TX issue! - if (reset_tsf(Adapter, IFACE_PORT0) == _FALSE) - RTW_INFO("ERROR! %s()-%d: Reset port0 TSF fail\n", - __FUNCTION__, __LINE__); - -#endif // CONFIG_TSF_RESET_OFFLOAD - } - - - } - else - { - //disable related TSF function - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(3))); - - rtw_write32(Adapter, REG_TSFTR, tsf); - rtw_write32(Adapter, REG_TSFTR+4, tsf>>32); - - //enable related TSF function - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(3)); - - // Update buddy port's TSF if it is SoftAP for beacon TX issue! - if ( (pmlmeinfo->state&0x03) == WIFI_FW_STATION_STATE - && check_buddy_fwstate(Adapter, WIFI_AP_STATE) - ) { - //disable related TSF function - rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)&(~BIT(3))); - - rtw_write32(Adapter, REG_TSFTR1, tsf); - rtw_write32(Adapter, REG_TSFTR1+4, tsf>>32); - - //enable related TSF function - rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|BIT(3)); -#ifdef CONFIG_TSF_RESET_OFFLOAD - // Update buddy port's TSF if it is SoftAP for beacon TX issue! - if (reset_tsf(Adapter, IFACE_PORT1) == _FALSE) - RTW_INFO("ERROR! %s()-%d: Reset port1 TSF fail\n", - __FUNCTION__, __LINE__); -#endif // CONFIG_TSF_RESET_OFFLOAD - } - - } - - - if(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)) - { - //pHalData->RegTxPause &= (~STOP_BCNQ); - //rtw_write8(Adapter, REG_TXPAUSE, (rtw_read8(Adapter, REG_TXPAUSE)&(~BIT(6)))); - ResumeTxBeacon(Adapter); - } -#endif //CONFIG_CONCURRENT_MODE -#endif //0 -} - -static void hw_var_set_mlme_disconnect(PADAPTER Adapter, u8 variable, u8* val) -{ -#ifdef CONFIG_CONCURRENT_MODE - - if(check_buddy_mlmeinfo_state(Adapter, _HW_STATE_NOLINK_)) - rtw_write16(Adapter, REG_RXFLTMAP2, 0x00); - - - if(Adapter->iface_type == IFACE_PORT1) - { - //reset TSF1 - rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(1)); - - //disable update TSF1 - rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)|BIT(4)); - - // disable Port1's beacon function - rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)&(~BIT(3))); - } - else - { - //reset TSF - rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(0)); - - //disable update TSF - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)|BIT(4)); - } -#endif //CONFIG_CONCURRENT_MODE -} - -static void hw_var_set_mlme_sitesurvey(PADAPTER Adapter, u8 variable, u8* val) -{ - struct dvobj_priv *dvobj = adapter_to_dvobj(Adapter); - u32 value_rcr, rcr_clear_bit, reg_bcn_ctl; - u16 value_rxfltmap2; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct mlme_priv *pmlmepriv=&(Adapter->mlmepriv); - u8 ap_num = 0; - -#ifdef DBG_IFACE_STATUS - DBG_IFACE_STATUS_DUMP(Adapter); -#endif - -#ifdef CONFIG_CONCURRENT_MODE - if(Adapter->iface_type == IFACE_PORT1) - reg_bcn_ctl = REG_BCN_CTRL_1; - else -#endif //CONFIG_CONCURRENT_MODE - reg_bcn_ctl = REG_BCN_CTRL; - -#ifdef CONFIG_FIND_BEST_CHANNEL - - rcr_clear_bit = (RCR_CBSSID_BCN | RCR_CBSSID_DATA); - - /* Receive all data frames */ - value_rxfltmap2 = 0xFFFF; - -#else /* CONFIG_FIND_BEST_CHANNEL */ - - rcr_clear_bit = RCR_CBSSID_BCN; - - //config RCR to receive different BSSID & not to receive data frame - value_rxfltmap2 = 0; - -#endif /* CONFIG_FIND_BEST_CHANNEL */ - - if( (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) -#ifdef CONFIG_CONCURRENT_MODE - || (check_buddy_fwstate(Adapter, WIFI_AP_STATE) == _TRUE) -#endif - ) - { - rcr_clear_bit = RCR_CBSSID_BCN; - } -#ifdef CONFIG_TDLS - // TDLS will clear RCR_CBSSID_DATA bit for connection. - else if (Adapter->tdlsinfo.link_established == _TRUE) - { - rcr_clear_bit = RCR_CBSSID_BCN; - } -#endif // CONFIG_TDLS - - value_rcr = rtw_read32(Adapter, REG_RCR); - - if(*((u8 *)val))//under sitesurvey - { - value_rcr &= ~(rcr_clear_bit); - rtw_write32(Adapter, REG_RCR, value_rcr); - - rtw_write16(Adapter, REG_RXFLTMAP2, value_rxfltmap2); - - if (check_fwstate(pmlmepriv, WIFI_STATION_STATE | WIFI_ADHOC_STATE |WIFI_ADHOC_MASTER_STATE)) { - //disable update TSF - rtw_write8(Adapter, reg_bcn_ctl, rtw_read8(Adapter, reg_bcn_ctl)|DIS_TSF_UDT); - } - - // Save orignal RRSR setting. - pHalData->RegRRSR = rtw_read16(Adapter, REG_RRSR); - - if (ap_num) - StopTxBeacon(Adapter); - } - else//sitesurvey done - { - if(check_fwstate(pmlmepriv, (_FW_LINKED|WIFI_AP_STATE)) -#ifdef CONFIG_CONCURRENT_MODE - || check_buddy_fwstate(Adapter, (_FW_LINKED|WIFI_AP_STATE)) -#endif - ) - { - //enable to rx data frame - rtw_write16(Adapter, REG_RXFLTMAP2,0xFFFF); - } - - if (check_fwstate(pmlmepriv, WIFI_STATION_STATE | WIFI_ADHOC_STATE |WIFI_ADHOC_MASTER_STATE)) { - //enable update TSF - rtw_write8(Adapter, reg_bcn_ctl, rtw_read8(Adapter, reg_bcn_ctl)&(~(DIS_TSF_UDT))); - } - - value_rcr |= rcr_clear_bit; - rtw_write32(Adapter, REG_RCR, value_rcr); - - // Restore orignal RRSR setting. - rtw_write16(Adapter, REG_RRSR, pHalData->RegRRSR); - - if (ap_num) { - int i; - _adapter *iface; - - ResumeTxBeacon(Adapter); - for (i = 0; i < dvobj->iface_nums; i++) { - iface = dvobj->padapters[i]; - if (!iface) - continue; - - if (check_fwstate(&iface->mlmepriv, WIFI_AP_STATE) == _TRUE - && check_fwstate(&iface->mlmepriv, WIFI_ASOC_STATE) == _TRUE - ) { - iface->mlmepriv.update_bcn = _TRUE; - #ifndef CONFIG_INTERRUPT_BASED_TXBCN - #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI) - tx_beacon_hdl(iface, NULL); - #endif - #endif - } - } - } - } -} - -static void hw_var_set_mlme_join(PADAPTER Adapter, u8 variable, u8* val) -{ -#ifdef CONFIG_CONCURRENT_MODE - u8 RetryLimit = 0x30; - u8 type = *((u8 *)val); - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct mlme_priv *pmlmepriv = &Adapter->mlmepriv; - - if(type == 0) // prepare to join - { - if(check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE) && - check_buddy_fwstate(Adapter, _FW_LINKED)) - { - StopTxBeacon(Adapter); - } - - //enable to rx data frame.Accept all data frame - //rtw_write32(padapter, REG_RCR, rtw_read32(padapter, REG_RCR)|RCR_ADF); - rtw_write16(Adapter, REG_RXFLTMAP2,0xFFFF); - - if(check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE)) - { - rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_BCN); - } - else - { - rtw_write32(Adapter, REG_RCR, rtw_read32(Adapter, REG_RCR)|RCR_CBSSID_DATA|RCR_CBSSID_BCN); - } - - if(check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) - { - RetryLimit = (pHalData->CustomerID == RT_CID_CCX) ? 7 : 48; - } - else // Ad-hoc Mode - { - RetryLimit = 0x7; - } - } - else if(type == 1) //joinbss_event call back when join res < 0 - { - if(check_buddy_mlmeinfo_state(Adapter, _HW_STATE_NOLINK_)) - rtw_write16(Adapter, REG_RXFLTMAP2,0x00); - - if(check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE) && - check_buddy_fwstate(Adapter, _FW_LINKED)) - { - ResumeTxBeacon(Adapter); - - //reset TSF 1/2 after ResumeTxBeacon - rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(1)|BIT(0)); - - } - } - else if(type == 2) //sta add event call back - { - - //enable update TSF - if(Adapter->iface_type == IFACE_PORT1) - rtw_write8(Adapter, REG_BCN_CTRL_1, rtw_read8(Adapter, REG_BCN_CTRL_1)&(~BIT(4))); - else - rtw_write8(Adapter, REG_BCN_CTRL, rtw_read8(Adapter, REG_BCN_CTRL)&(~BIT(4))); - - - if(check_fwstate(pmlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE)) - { - //fixed beacon issue for 8191su........... - rtw_write8(Adapter,0x542 ,0x02); - RetryLimit = 0x7; - } - - - if(check_buddy_mlmeinfo_state(Adapter, WIFI_FW_AP_STATE) && - check_buddy_fwstate(Adapter, _FW_LINKED)) - { - ResumeTxBeacon(Adapter); - - //reset TSF 1/2 after ResumeTxBeacon - rtw_write8(Adapter, REG_DUAL_TSF_RST, BIT(1)|BIT(0)); - } - - } - - rtw_write16(Adapter, REG_RETRY_LIMIT, BIT_SRL(RetryLimit) | BIT_LRL(RetryLimit)); - -#endif //CONFIG_CONCURRENT_MODE -} - -static void rtw_store_all_sta_hwseq(_adapter *padapter) -{ - _irqL irqL; - _list *plist, *phead; - u8 index; - u16 hw_seq[NUM_STA]; - u32 shcut_addr = 0; - struct sta_info *psta; - struct sta_priv *pstapriv = &padapter->stapriv; - struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); - struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj); - - /* save each HW sequence of mac id from report fifo */ - for (index = 0; index < macid_ctl->num && index < NUM_STA; index++) { - if (rtw_macid_is_used(macid_ctl, index)) { - rtw_write16(padapter, 0x140, 0x662 | ((index & BIT5)>>5)); - shcut_addr = 0x8000; - shcut_addr = (shcut_addr | ((index&0x1f)<<7) | (10<<2)) + 1; - hw_seq[index] = rtw_read16(padapter, shcut_addr); - /* RTW_INFO("mac_id:%d is used, hw_seq[index]=%d\n", index, hw_seq[index]); */ - } - } - - _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL); - for (index = 0; index < NUM_STA; index++) { - psta = NULL; - - phead = &(pstapriv->sta_hash[index]); - plist = get_next(phead); - - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) { - psta = LIST_CONTAINOR(plist, struct sta_info, hash_list); - plist = get_next(plist); - - psta->hwseq = hw_seq[psta->cmn.mac_id]; - /* RTW_INFO(" psta->cmn.mac_id=%d, psta->hwseq=%d\n" , psta->cmn.mac_id, psta->hwseq); */ - } - - } - _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); - -} - -static void rtw_restore_all_sta_hwseq(_adapter *padapter) -{ - _irqL irqL; - _list *plist, *phead; - u8 index; - u16 hw_seq[NUM_STA]; - u32 shcut_addr = 0; - struct sta_info *psta; - struct sta_priv *pstapriv = &padapter->stapriv; - struct dvobj_priv *dvobj = adapter_to_dvobj(padapter); - struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj); - - _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL); - for (index = 0; index < NUM_STA; index++) { - psta = NULL; - - phead = &(pstapriv->sta_hash[index]); - plist = get_next(phead); - - while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) { - psta = LIST_CONTAINOR(plist, struct sta_info, hash_list); - plist = get_next(plist); - - hw_seq[psta->cmn.mac_id] = psta->hwseq; - /* RTW_INFO(" psta->cmn.mac_id=%d, psta->hwseq=%d\n", psta->cmn.mac_id, psta->hwseq); */ - } - - } - _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL); - - /* restore each HW sequence of mac id to report fifo */ - for (index = 0; index < macid_ctl->num && index < NUM_STA; index++) { - if (rtw_macid_is_used(macid_ctl, index)) { - rtw_write16(padapter, 0x140, 0x662 | ((index & BIT5)>>5)); - shcut_addr = 0x8000; - shcut_addr = (shcut_addr | ((index&0x1f)<<7) | (10<<2)) + 1; - rtw_write16(padapter, shcut_addr, hw_seq[index]); - /* RTW_INFO("mac_id:%d is used, hw_seq[index]=%d\n", index, hw_seq[index]); */ - } - } - -} - -u8 SetHwReg8814A(PADAPTER padapter, u8 variable, u8 *pval) -{ - PHAL_DATA_TYPE pHalData; - struct dm_struct* podmpriv; - u8 ret = _SUCCESS; - u8 val8; - u16 val16; - u32 val32; - - pHalData = GET_HAL_DATA(padapter); - podmpriv = &pHalData->odmpriv; - - switch (variable) - { - case HW_VAR_MEDIA_STATUS: - val8 = rtw_read8(padapter, MSR) & 0x0c; - val8 |= *pval; - rtw_write8(padapter, MSR, val8); - break; - - case HW_VAR_SET_OPMODE: - hw_var_set_opmode(padapter, variable, pval); - break; - - case HW_VAR_MAC_ADDR: - hw_var_set_macaddr(padapter, variable, pval); - break; - - case HW_VAR_BSSID: - hw_var_set_bssid(padapter, variable, pval); - break; - - case HW_VAR_BASIC_RATE: - { - struct mlme_ext_info *mlmext_info = &padapter->mlmeextpriv.mlmext_info; - u16 input_b = 0, masked = 0, ioted = 0, BrateCfg = 0; - u16 rrsr_2g_force_mask = RRSR_CCK_RATES; - u16 rrsr_2g_allow_mask = (RRSR_24M|RRSR_12M|RRSR_6M|RRSR_CCK_RATES); - u16 rrsr_5g_force_mask = (RRSR_6M); - u16 rrsr_5g_allow_mask = (RRSR_OFDM_RATES); - - HalSetBrateCfg(padapter, pval, &BrateCfg); - input_b = BrateCfg; - - /* apply force and allow mask */ - if(pHalData->current_band_type == BAND_ON_2_4G) - { - BrateCfg |= rrsr_2g_force_mask; - BrateCfg &= rrsr_2g_allow_mask; - } - else // 5G - { - BrateCfg |= rrsr_5g_force_mask; - BrateCfg &= rrsr_5g_allow_mask; - } - masked = BrateCfg; - - /* IOT consideration */ - if (mlmext_info->assoc_AP_vendor == HT_IOT_PEER_CISCO) { - /* if peer is cisco and didn't use ofdm rate, we enable 6M ack */ - if((BrateCfg & (RRSR_24M|RRSR_12M|RRSR_6M)) == 0) - BrateCfg |= RRSR_6M; - } - ioted = BrateCfg; - - pHalData->BasicRateSet = BrateCfg; - - RTW_INFO("HW_VAR_BASIC_RATE: %#x -> %#x -> %#x\n", input_b, masked, ioted); - - // Set RRSR rate table. - rtw_write16(padapter, REG_RRSR, BrateCfg); - rtw_write8(padapter, REG_RRSR+2, rtw_read8(padapter, REG_RRSR+2)&0xf0); - } - break; - - case HW_VAR_TXPAUSE: - rtw_write8(padapter, REG_TXPAUSE, *pval); - break; - - case HW_VAR_BCN_FUNC: - hw_var_set_bcn_func(padapter, variable, pval); - break; - - case HW_VAR_CORRECT_TSF: -#ifdef CONFIG_CONCURRENT_MODE - hw_var_set_correct_tsf(padapter, variable, pval); -#else //CONFIG_CONCURRENT_MODE - { - u64 tsf; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - //tsf = pmlmeext->TSFValue - ((u32)pmlmeext->TSFValue % (pmlmeinfo->bcn_interval*1024)) -1024; //us - tsf = pmlmeext->TSFValue - rtw_modular64(pmlmeext->TSFValue, (pmlmeinfo->bcn_interval*1024)) -1024; //us - - if(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)) - { - //pHalData->RegTxPause |= STOP_BCNQ;BIT(6) - //rtw_write8(padapter, REG_TXPAUSE, (rtw_read8(padapter, REG_TXPAUSE)|BIT(6))); - StopTxBeacon(padapter); - } - - //disable related TSF function - rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)&(~BIT(3))); - //select port0 tsf - rtw_write8(padapter, REG_BCN_INTERVAL+3, rtw_read8(padapter, REG_BCN_INTERVAL+3)&0x8f); - rtw_write32(padapter, REG_TSFTR, tsf); - rtw_write32(padapter, REG_TSFTR+4, tsf>>32); - - //enable related TSF function - rtw_write8(padapter, REG_BCN_CTRL, rtw_read8(padapter, REG_BCN_CTRL)|BIT(3)); - - - if(((pmlmeinfo->state&0x03) == WIFI_FW_ADHOC_STATE) || ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE)) - { - //pHalData->RegTxPause &= (~STOP_BCNQ); - //rtw_write8(padapter, REG_TXPAUSE, (rtw_read8(padapter, REG_TXPAUSE)&(~BIT(6)))); - ResumeTxBeacon(padapter); - } - } -#endif //CONFIG_CONCURRENT_MODE - break; - - case HW_VAR_MLME_DISCONNECT: -#ifdef CONFIG_CONCURRENT_MODE - hw_var_set_mlme_disconnect(padapter, variable, pval); -#else - { - // Set RCR to not to receive data frame when NO LINK state -// val32 = rtw_read32(padapter, REG_RCR); -// val32 &= ~RCR_ADF; -// rtw_write32(padapter, REG_RCR, val32); - - // reject all data frames - rtw_write16(padapter, REG_RXFLTMAP2, 0x00); - - // reset TSF - val8 = BIT(0) | BIT(1); - rtw_write8(padapter, REG_DUAL_TSF_RST, val8); - - // disable update TSF - val8 = rtw_read8(padapter, REG_BCN_CTRL); - val8 |= BIT(4); - rtw_write8(padapter, REG_BCN_CTRL, val8); - } -#endif - break; - - case HW_VAR_MLME_SITESURVEY: - hw_var_set_mlme_sitesurvey(padapter, variable, pval); - -#ifdef CONFIG_BT_COEXIST - if (_TRUE == pHalData->EEPROMBluetoothCoexist) - rtw_btcoex_ScanNotify(padapter, *pval?_TRUE:_FALSE); -#endif - break; - - case HW_VAR_MLME_JOIN: -#ifdef CONFIG_CONCURRENT_MODE - hw_var_set_mlme_join(padapter, variable, pval); -#else // !CONFIG_CONCURRENT_MODE - { - u8 RetryLimit = RL_VAL_AP; - u8 type = *(u8*)pval; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - - if (type == 0) // prepare to join - { - //enable to rx data frame.Accept all data frame - rtw_write16(padapter, REG_RXFLTMAP2, 0xFFFF); - - if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE) - { - RetryLimit = (pHalData->CustomerID == RT_CID_CCX) ? 7 : 48; - } - else // Ad-hoc Mode - { - RetryLimit = RL_VAL_AP; - } - } - else if (type == 1) //joinbss_event call back when join res < 0 - { - rtw_write16(padapter, REG_RXFLTMAP2, 0x00); - } - else if (type == 2) //sta add event call back - { - //enable update TSF - val8 = rtw_read8(padapter, REG_BCN_CTRL); - val8 &= ~BIT(4); - rtw_write8(padapter, REG_BCN_CTRL, val8); - - if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE)) - { - RetryLimit = RL_VAL_AP; - } - } - - val16 = BIT_SRL(RetryLimit) | BIT_LRL(RetryLimit); - rtw_write16(padapter, REG_RETRY_LIMIT, val16); - } -#endif // !CONFIG_CONCURRENT_MODE - -#ifdef CONFIG_BT_COEXIST - if (_TRUE == pHalData->EEPROMBluetoothCoexist) - { - switch (*pval) - { - case 0: - // prepare to join - rtw_btcoex_ConnectNotify(padapter, _TRUE); - break; - case 1: - // joinbss_event callback when join res < 0 - rtw_btcoex_ConnectNotify(padapter, _FALSE); - break; - case 2: - // sta add event callback - // rtw_btcoex_MediaStatusNotify(padapter, RT_MEDIA_CONNECT); - break; - } - } -#endif - break; - - - case HW_VAR_BEACON_INTERVAL: - rtw_write16(padapter, REG_BCN_INTERVAL, *(u16*)pval); -#ifdef CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT - { - struct mlme_ext_priv *pmlmeext; - struct mlme_ext_info *pmlmeinfo; - u16 bcn_interval; - - pmlmeext = &padapter->mlmeextpriv; - pmlmeinfo = &pmlmeext->mlmext_info; - bcn_interval = *((u16*)pval); - - if ((pmlmeinfo->state&0x03) == WIFI_FW_AP_STATE) - { - RTW_INFO("%s==> bcn_interval:%d, eraly_int:%d\n", __FUNCTION__, bcn_interval, bcn_interval>>1); - rtw_write8(padapter, REG_DRVERLYINT, bcn_interval>>1);// 50ms for sdio - } - } -#endif // CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT - break; - - case HW_VAR_SLOT_TIME: - rtw_write8(padapter, REG_SLOT, *pval); - break; - - case HW_VAR_RESP_SIFS: - // SIFS_Timer = 0x0a0a0808; - // RESP_SIFS for CCK - rtw_write8(padapter, REG_RESP_SIFS_CCK, pval[0]); // SIFS_T2T_CCK (0x08) - rtw_write8(padapter, REG_RESP_SIFS_CCK+1, pval[1]); //SIFS_R2T_CCK(0x08) - // RESP_SIFS for OFDM - rtw_write8(padapter, REG_RESP_SIFS_OFDM, pval[2]); //SIFS_T2T_OFDM (0x0a) - rtw_write8(padapter, REG_RESP_SIFS_OFDM+1, pval[3]); //SIFS_R2T_OFDM(0x0a) - break; - - case HW_VAR_ACK_PREAMBLE: - { - u8 bShortPreamble = *pval; - - // Joseph marked out for Netgear 3500 TKIP channel 7 issue.(Temporarily) - val8 = (pHalData->nCur40MhzPrimeSC) << 5; - if (bShortPreamble) - val8 |= 0x80; - rtw_write8(padapter, REG_RRSR+2, val8); - } - break; - - case HW_VAR_CAM_EMPTY_ENTRY: - { - u8 ucIndex = *pval; - u8 i; - u32 ulCommand = 0; - u32 ulContent = 0; - u32 ulEncAlgo = CAM_AES; - - for (i=0; iac_param_be = *(u32*)pval; - rtw_write32(padapter, REG_EDCA_BE_PARAM, *(u32*)pval); - break; - - case HW_VAR_AC_PARAM_BK: - rtw_write32(padapter, REG_EDCA_BK_PARAM, *(u32*)pval); - break; - - case HW_VAR_ACM_CTRL: - { - u8 acm_ctrl; - u8 AcmCtrl; - - acm_ctrl = *(u8*)pval; - AcmCtrl = rtw_read8(padapter, REG_ACMHWCTRL); - - if (acm_ctrl > 1) - AcmCtrl = AcmCtrl | 0x1; - - if (acm_ctrl & BIT(3)) - AcmCtrl |= AcmHw_VoqEn; - else - AcmCtrl &= (~AcmHw_VoqEn); - - if (acm_ctrl & BIT(2)) - AcmCtrl |= AcmHw_ViqEn; - else - AcmCtrl &= (~AcmHw_ViqEn); - - if (acm_ctrl & BIT(1)) - AcmCtrl |= AcmHw_BeqEn; - else - AcmCtrl &= (~AcmHw_BeqEn); - - RTW_INFO("[HW_VAR_ACM_CTRL] Write 0x%X\n", AcmCtrl); - rtw_write8(padapter, REG_ACMHWCTRL, AcmCtrl ); - } - break; - case HW_VAR_AMPDU_FACTOR: - { - u32 AMPDULen = *(u8*)pval; - - RTW_INFO("SetHwReg8814AU(): HW_VAR_AMPDU_FACTOR %x\n" ,AMPDULen); - - if(AMPDULen < VHT_AGG_SIZE_256K) - AMPDULen = (0x2000 << (*((u8*)pval))) -1; - else - AMPDULen = 0x3ffff; - rtw_write32(padapter, REG_AMPDU_MAX_LENGTH_8814A, AMPDULen); - //RTW_INFO("SetHwReg8814AU(): HW_VAR_AMPDU_FACTOR %x\n" ,AMPDULen); - } - break; - case HW_VAR_H2C_FW_PWRMODE: - { - u8 psmode = *pval; - rtl8814_set_FwPwrMode_cmd(padapter, psmode); - } - break; - - case HW_VAR_H2C_FW_JOINBSSRPT: - rtl8814_set_FwJoinBssReport_cmd(padapter, *pval); - break; - -#ifdef CONFIG_P2P_PS - case HW_VAR_H2C_FW_P2P_PS_OFFLOAD: - rtl8814_set_p2p_ps_offload_cmd(padapter, *pval); - break; -#endif // CONFIG_P2P_PS - -#ifdef CONFIG_SW_ANTENNA_DIVERSITY - case HW_VAR_ANTENNA_DIVERSITY_LINK: - //SwAntDivRestAfterLink8192C(padapter); - ODM_SwAntDivRestAfterLink(podmpriv); - break; - - case HW_VAR_ANTENNA_DIVERSITY_SELECT: - { - u8 Optimum_antenna = *pval; - u8 Ant; - - //switch antenna to Optimum_antenna - //RTW_INFO("==> HW_VAR_ANTENNA_DIVERSITY_SELECT , Ant_(%s)\n",(Optimum_antenna==2)?"A":"B"); - if (pHalData->CurAntenna != Optimum_antenna) - { - Ant = (Optimum_antenna==2) ? MAIN_ANT : AUX_ANT; - ODM_UpdateRxIdleAnt(podmpriv, Ant); - - pHalData->CurAntenna = Optimum_antenna; - //RTW_INFO("==> HW_VAR_ANTENNA_DIVERSITY_SELECT , Ant_(%s)\n",(Optimum_antenna==2)?"A":"B"); - } - } - break; -#endif //CONFIG_SW_ANTENNA_DIVERSITY - - case HW_VAR_EFUSE_USAGE: - pHalData->EfuseUsedPercentage = *pval; - break; - - case HW_VAR_EFUSE_BYTES: - pHalData->EfuseUsedBytes = *(u16*)pval; - break; -#if 0 - case HW_VAR_EFUSE_BT_USAGE: -#ifdef HAL_EFUSE_MEMORY - pHalData->EfuseHal.BTEfuseUsedPercentage = *pval; -#endif //HAL_EFUSE_MEMORY - break; - - case HW_VAR_EFUSE_BT_BYTES: -#ifdef HAL_EFUSE_MEMORY - pHalData->EfuseHal.BTEfuseUsedBytes = *(u16*)pval; -#else //HAL_EFUSE_MEMORY - BTEfuseUsedBytes = *(u16*)pval; -#endif //HAL_EFUSE_MEMORY - break; -#endif //0 - case HW_VAR_FIFO_CLEARN_UP: - { - struct pwrctrl_priv *pwrpriv; - u8 trycnt = 100; - - pwrpriv = adapter_to_pwrctl(padapter); - - // pause tx - rtw_write8(padapter, REG_TXPAUSE, 0xff); - - // keep sn - rtw_store_all_sta_hwseq(padapter); - - if (pwrpriv->bkeepfwalive != _TRUE) - { - // RX DMA stop - val32 = rtw_read32(padapter, REG_RXPKT_NUM); - val32 |= RW_RELEASE_EN; - rtw_write32(padapter, REG_RXPKT_NUM, val32); - do { - val32 = rtw_read32(padapter, REG_RXPKT_NUM); - val32 &= RXDMA_IDLE; - if (val32) - break; - } while (--trycnt); - if (trycnt == 0) - { - RTW_INFO("[HW_VAR_FIFO_CLEARN_UP] Stop RX DMA failed......\n"); - } - - //RQPN Load 0 - rtw_write16(padapter, REG_RQPN_NPQ, 0x0); - rtw_write32(padapter, REG_RQPN, 0x80000000); - rtw_mdelay_os(10); - } - } - break; - - case HW_VAR_RESTORE_HW_SEQ: - rtw_restore_all_sta_hwseq(padapter); - break; - - case HW_VAR_CHECK_TXBUF: - { - u8 retry_limit; - u32 reg_230 = 0, reg_234 = 0, reg_238 = 0, reg_23c = 0, reg_240 = 0; - u32 init_reg_230 = 0, init_reg_234 = 0, init_reg_238 = 0, init_reg_23c = 0, init_reg_240 = 0; - systime start = rtw_get_current_time(); - u32 pass_ms; - int i = 0; - - retry_limit = 0x01; - - val16 = BIT_SRL(retry_limit) | BIT_LRL(retry_limit); - rtw_write16(padapter, REG_RETRY_LIMIT, val16); - - while (rtw_get_passing_time_ms(start) < 2000 - && !RTW_CANNOT_RUN(padapter) - ) { - reg_230 = rtw_read32(padapter, REG_FIFOPAGE_INFO_1_8814A); - reg_234 = rtw_read32(padapter, REG_FIFOPAGE_INFO_2_8814A); - reg_238 = rtw_read32(padapter, REG_FIFOPAGE_INFO_3_8814A); - reg_23c = rtw_read32(padapter, REG_FIFOPAGE_INFO_4_8814A); - reg_240 = rtw_read32(padapter, REG_FIFOPAGE_INFO_5_8814A); - - if (i == 0) { - init_reg_230 = reg_230; - init_reg_234 = reg_234; - init_reg_238 = reg_238; - init_reg_23c = reg_23c; - init_reg_240 = reg_240; - } - - i++; - if ((((reg_230 & 0x0c) != ((reg_230>>16) & 0x0c)) || ((reg_234 & 0x0c) != ((reg_234>>16) & 0x0c)) - || ((reg_238 & 0x0c) != ((reg_238>>16) & 0x0c)) || ((reg_23c & 0x0c) != ((reg_23c>>16) & 0x0c)) - || ((reg_240 & 0x0c) != ((reg_240>>16) & 0x0c)))) { - /* RTW_INFO("%s: (HW_VAR_CHECK_TXBUF)TXBUF NOT empty - 0x230=0x%08x, 0x234=0x%08x 0x238=0x%08x," - " 0x23c=0x%08x, 0x240=0x%08x (%d)\n" - , __FUNCTION__, reg_230, reg_234, reg_238, reg_23c, reg_240, i); */ - rtw_msleep_os(10); - } else { - break; - } - } - - pass_ms = rtw_get_passing_time_ms(start); - - if (RTW_CANNOT_RUN(padapter)) { - RTW_INFO("bDriverStopped or bSurpriseRemoved\n"); - } else if (pass_ms >= 2000 || (((reg_230 & 0x0c) != ((reg_230>>16) & 0x0c)) || ((reg_234 & 0x0c) != ((reg_234>>16) & 0x0c)) - || ((reg_238 & 0x0c) != ((reg_238>>16) & 0x0c)) || ((reg_23c & 0x0c) != ((reg_23c>>16) & 0x0c)) - || ((reg_240 & 0x0c) != ((reg_240>>16) & 0x0c)))) { - RTW_ERR("%s:(HW_VAR_CHECK_TXBUF)NOT empty(%d) in %d ms\n", __func__, i, pass_ms); - RTW_ERR("%s:(HW_VAR_CHECK_TXBUF) 0x230=0x%08x, 0x234=0x%08x 0x238=0x%08x, 0x23c=0x%08x, 0x240=0x%08x (0x%08x, 0x%08x, 0x%08x, 0x%08x, 0x%08x)\n", __func__, reg_230, reg_234, reg_238, reg_23c, reg_240 - , init_reg_230, init_reg_234, init_reg_238, init_reg_23c, init_reg_240); - //rtw_warn_on(1); - } else { - RTW_INFO("%s:(HW_VAR_CHECK_TXBUF)TXBUF Empty(%d) in %d ms\n", __FUNCTION__, i, pass_ms); - } - - retry_limit = RL_VAL_STA; - val16 = BIT_SRL(retry_limit) | BIT_LRL(retry_limit); - rtw_write16(padapter, REG_RETRY_LIMIT, val16); - } - - break; - - case HW_VAR_APFM_ON_MAC: - pHalData->bMacPwrCtrlOn = *pval; - RTW_INFO("%s: bMacPwrCtrlOn=%d\n", __FUNCTION__, pHalData->bMacPwrCtrlOn); - break; - - case HW_VAR_NAV_UPPER: - { - u32 usNavUpper = *((u32*)pval); - - if (usNavUpper > HAL_NAV_UPPER_UNIT * 0xFF) - { - RTW_INFO("%s: [HW_VAR_NAV_UPPER] set value(0x%08X us) is larger than (%d * 0xFF)!\n", - __FUNCTION__, usNavUpper, HAL_NAV_UPPER_UNIT); - break; - } - - // The value of ((usNavUpper + HAL_NAV_UPPER_UNIT - 1) / HAL_NAV_UPPER_UNIT) - // is getting the upper integer. - //usNavUpper = (usNavUpper + HAL_NAV_UPPER_UNIT - 1) / HAL_NAV_UPPER_UNIT; - rtw_write8(padapter, REG_NAV_UPPER, (u8)usNavUpper); - } - break; - - case HW_VAR_BCN_VALID: -#ifdef CONFIG_CONCURRENT_MODE - if (padapter->iface_type == IFACE_PORT1) - { - /* BCN_VALID, BIT31 of REG_FIFOPAGE_CTRL_2_8814A, write 1 to clear, Clear by sw */ - val8 = rtw_read8(padapter, REG_FIFOPAGE_CTRL_2_8814A+3); - val8 |= BIT(7); - rtw_write8(padapter, REG_FIFOPAGE_CTRL_2_8814A+3, val8); - } - else -#endif - { - /* BCN_VALID, BIT15 of REG_FIFOPAGE_CTRL_2_8814A, write 1 to clear, Clear by sw */ - val8 = rtw_read8(padapter, REG_FIFOPAGE_CTRL_2_8814A+1); - val8 |= BIT(7); - rtw_write8(padapter, REG_FIFOPAGE_CTRL_2_8814A+1, val8); - } - break; - - case HW_VAR_DL_BCN_SEL: -#if 0 /* for MBSSID, so far we don't need this */ -#ifdef CONFIG_CONCURRENT_MODE - if (IS_HARDWARE_TYPE_8821(padapter) && padapter->iface_type == IFACE_PORT1) - { - // SW_BCN_SEL - Port1 - val8 = rtw_read8(padapter, REG_AUTO_LLT_8814A); - val8 |= BIT(2); - rtw_write8(padapter, REG_AUTO_LLT_8814A, val8); - } - else -#endif //CONFIG_CONCURRENT_MODE - { - /* SW_BCN_SEL - Port0 , BIT_r_EN_BCN_SW_HEAD_SEL */ - val8 = rtw_read8(padapter, REG_AUTO_LLT_8814A); - val8 &= ~BIT(2); - rtw_write8(padapter, REG_AUTO_LLT_8814A, val8); - } -#endif /* for MBSSID, so far we don't need this */ - break; - - case HW_VAR_WIRELESS_MODE: - { - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; - u8 R2T_SIFS = 0, SIFS_Timer = 0; - u8 wireless_mode = *pval; - - if ((wireless_mode == WIRELESS_11BG) || (wireless_mode == WIRELESS_11G)) - SIFS_Timer = 0xa; - else - SIFS_Timer = 0xe; - - // SIFS for OFDM Data ACK - rtw_write8(padapter, REG_SIFS_CTX+1, SIFS_Timer); - // SIFS for OFDM consecutive tx like CTS data! - rtw_write8(padapter, REG_SIFS_TRX+1, SIFS_Timer); - - rtw_write8(padapter,REG_SPEC_SIFS+1, SIFS_Timer); - rtw_write8(padapter,REG_MAC_SPEC_SIFS+1, SIFS_Timer); - - // 20100719 Joseph: Revise SIFS setting due to Hardware register definition change. - rtw_write8(padapter, REG_RESP_SIFS_OFDM+1, SIFS_Timer); - rtw_write8(padapter, REG_RESP_SIFS_OFDM, SIFS_Timer); - - // - // Adjust R2T SIFS for IOT issue. Add by hpfan 2013.01.25 - // Set R2T SIFS to 0x0a for Atheros IOT. Add by hpfan 2013.02.22 - // - // Mac has 10 us delay so use 0xa value is enough. - R2T_SIFS = 0xa; -#ifdef CONFIG_80211AC_VHT - if (wireless_mode & WIRELESS_11_5AC && - //MgntLinkStatusQuery(Adapter) && - TEST_FLAG(pmlmepriv->vhtpriv.ldpc_cap, LDPC_VHT_ENABLE_RX) && - TEST_FLAG(pmlmepriv->vhtpriv.stbc_cap, STBC_VHT_ENABLE_RX)) - { - if (pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_ATHEROS) - R2T_SIFS = 0x8; - else - R2T_SIFS = 0xa; - } -#endif //CONFIG_80211AC_VHT - - rtw_write8(padapter, REG_RESP_SIFS_OFDM+1, R2T_SIFS); - } - break; - - case HW_VAR_DO_IQK: - pHalData->bNeedIQK = _TRUE; - break; - case HW_VAR_DL_RSVD_PAGE: -#ifdef CONFIG_BT_COEXIST - if (pHalData->EEPROMBluetoothCoexist == 1) - { - if (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE) - { - rtl8814a_download_BTCoex_AP_mode_rsvd_page(padapter); - } - } -#endif // CONFIG_BT_COEXIST - break; -#ifdef CONFIG_BEAMFORMING -#if (BEAMFORMING_SUPPORT == 1) /*add by YuChen for PHYDM-TxBF AutoTest HW Timer*/ - case HW_VAR_HW_REG_TIMER_INIT: - { - HAL_HW_TIMER_TYPE TimerType = (*(PHAL_HW_TIMER_TYPE)pval)>>16; - - rtw_write8(padapter, 0x164, 1); - - if (TimerType == HAL_TIMER_TXBF) - rtw_write32(padapter, 0x15C, (*(pu2Byte)pval)); - else if (TimerType == HAL_TIMER_EARLYMODE) - rtw_write32(padapter, 0x160, 0x05000190); - break; - } - case HW_VAR_HW_REG_TIMER_START: - { - HAL_HW_TIMER_TYPE TimerType = *(PHAL_HW_TIMER_TYPE)pval; - - if (TimerType == HAL_TIMER_TXBF) - rtw_write8(padapter, 0x15F, 0x5); - else if (TimerType == HAL_TIMER_EARLYMODE) - rtw_write8(padapter, 0x163, 0x5); - break; - } - case HW_VAR_HW_REG_TIMER_RESTART: - { - HAL_HW_TIMER_TYPE TimerType = *(PHAL_HW_TIMER_TYPE)pval; - - if (TimerType == HAL_TIMER_TXBF) { - rtw_write8(padapter, 0x15F, 0x0); - rtw_write8(padapter, 0x15F, 0x5); - } else if (TimerType == HAL_TIMER_EARLYMODE) { - rtw_write8(padapter, 0x163, 0x0); - rtw_write8(padapter, 0x163, 0x5); - } - break; - } - case HW_VAR_HW_REG_TIMER_STOP: - { - HAL_HW_TIMER_TYPE TimerType = *(PHAL_HW_TIMER_TYPE)pval; - - if (TimerType == HAL_TIMER_TXBF) - rtw_write8(padapter, 0x15F, 0); - else if (TimerType == HAL_TIMER_EARLYMODE) - rtw_write8(padapter, 0x163, 0x0); - break; - } -#endif/*#if (BEAMFORMING_SUPPORT == 1) - for PHYDM TxBF*/ -#endif/*#ifdef CONFIG_BEAMFORMING*/ - - -#ifdef CONFIG_GPIO_WAKEUP - case HW_SET_GPIO_WL_CTRL: - { - u8 enable = *pval; - u8 value = rtw_read8(padapter, 0x4e); - if (enable && (value & BIT(6))) { - value &= ~BIT(6); - rtw_write8(padapter, 0x4e, value); - } else if (enable == _FALSE){ - value |= BIT(6); - rtw_write8(padapter, 0x4e, value); - } - RTW_INFO("%s: set WL control, 0x4E=0x%02X\n", - __func__, rtw_read8(padapter, 0x4e)); - } - break; -#endif - default: - ret = SetHwReg(padapter, variable, pval); - break; - } - return ret; - -} - -struct qinfo_8814a { - u32 head:8; - u32 pkt_num:7; - u32 tail:8; - u32 ac:2; - u32 macid:7; -}; - -struct bcn_qinfo_8814a { - u16 head:8; - u16 pkt_num:8; -}; - -void dump_qinfo_8814a(void *sel, struct qinfo_8814a *info, const char *tag) -{ - //if (info->pkt_num) - RTW_PRINT_SEL(sel, "%shead:0x%02x, tail:0x%02x, pkt_num:%u, macid:%u, ac:%u\n" - , tag ? tag : "", info->head, info->tail, info->pkt_num, info->macid, info->ac - ); -} - -void dump_bcn_qinfo_8814a(void *sel, struct bcn_qinfo_8814a *info, const char *tag) -{ - //if (info->pkt_num) - RTW_PRINT_SEL(sel, "%shead:0x%02x, pkt_num:%u\n" - , tag ? tag : "", info->head, info->pkt_num - ); -} - -void dump_mac_qinfo_8814a(void *sel, _adapter *adapter) -{ - u32 q0_info; - u32 q1_info; - u32 q2_info; - u32 q3_info; - u32 q4_info; - u32 q5_info; - u32 q6_info; - u32 q7_info; - u32 mg_q_info; - u32 hi_q_info; - u16 bcn_q_info; - - q0_info = rtw_read32(adapter, REG_Q0_INFO); - q1_info = rtw_read32(adapter, REG_Q1_INFO); - q2_info = rtw_read32(adapter, REG_Q2_INFO); - q3_info = rtw_read32(adapter, REG_Q3_INFO); - q4_info = rtw_read32(adapter, REG_Q4_INFO); - q5_info = rtw_read32(adapter, REG_Q5_INFO); - q6_info = rtw_read32(adapter, REG_Q6_INFO); - q7_info = rtw_read32(adapter, REG_Q7_INFO); - mg_q_info = rtw_read32(adapter, REG_MGQ_INFO); - hi_q_info = rtw_read32(adapter, REG_HGQ_INFO); - bcn_q_info = rtw_read16(adapter, REG_BCNQ_INFO); - - dump_qinfo_8814a(sel, (struct qinfo_8814a *)&q0_info, "Q0 "); - dump_qinfo_8814a(sel, (struct qinfo_8814a *)&q1_info, "Q1 "); - dump_qinfo_8814a(sel, (struct qinfo_8814a *)&q2_info, "Q2 "); - dump_qinfo_8814a(sel, (struct qinfo_8814a *)&q3_info, "Q3 "); - dump_qinfo_8814a(sel, (struct qinfo_8814a *)&q4_info, "Q4 "); - dump_qinfo_8814a(sel, (struct qinfo_8814a *)&q5_info, "Q5 "); - dump_qinfo_8814a(sel, (struct qinfo_8814a *)&q6_info, "Q6 "); - dump_qinfo_8814a(sel, (struct qinfo_8814a *)&q7_info, "Q7 "); - dump_qinfo_8814a(sel, (struct qinfo_8814a *)&mg_q_info, "MG "); - dump_qinfo_8814a(sel, (struct qinfo_8814a *)&hi_q_info, "HI "); - dump_bcn_qinfo_8814a(sel, (struct bcn_qinfo_8814a *)&bcn_q_info, "BCN "); -} - -void GetHwReg8814A(PADAPTER padapter, u8 variable, u8 *pval) -{ - PHAL_DATA_TYPE pHalData; - struct dm_struct* podmpriv; - u8 val8; - u16 val16; - u32 val32; - - pHalData = GET_HAL_DATA(padapter); - podmpriv = &pHalData->odmpriv; - - switch (variable) - { - case HW_VAR_TXPAUSE: - *pval = rtw_read8(padapter, REG_TXPAUSE); - break; - - case HW_VAR_BCN_VALID: -#ifdef CONFIG_CONCURRENT_MODE - if (padapter->iface_type == IFACE_PORT1) - { - /* BCN_VALID, BIT31 of REG_FIFOPAGE_CTRL_2_8814A, write 1 to clear */ - val8 = rtw_read8(padapter, REG_FIFOPAGE_CTRL_2_8814A+3); - *pval = (BIT(7) & val8) ? _TRUE:_FALSE; - } - else -#endif //CONFIG_CONCURRENT_MODE - { - /* BCN_VALID, BIT15 of REG_FIFOPAGE_CTRL_2_8814A, write 1 to clear */ - val8 = rtw_read8(padapter, REG_FIFOPAGE_CTRL_2_8814A+1); - *pval = (BIT(7) & val8) ? _TRUE:_FALSE; - } - break; - - case HW_VAR_FWLPS_RF_ON: - //When we halt NIC, we should check if FW LPS is leave. - if(adapter_to_pwrctl(padapter)->rf_pwrstate == rf_off) - { - // If it is in HW/SW Radio OFF or IPS state, we do not check Fw LPS Leave, - // because Fw is unload. - *pval = _TRUE; - } - else - { - u32 valRCR; - valRCR = rtw_read32(padapter, REG_RCR); - valRCR &= 0x00070000; - if(valRCR) - *pval = _FALSE; - else - *pval = _TRUE; - } - - break; - -#ifdef CONFIG_ANTENNA_DIVERSITY - case HW_VAR_CURRENT_ANTENNA: - *pval = pHalData->CurAntenna; - break; -#endif //CONFIG_ANTENNA_DIVERSITY - - case HW_VAR_EFUSE_BYTES: // To get EFUE total used bytes, added by Roger, 2008.12.22. - *(u16*)pval = pHalData->EfuseUsedBytes; - break; - - case HW_VAR_APFM_ON_MAC: - *pval = pHalData->bMacPwrCtrlOn; - break; - - case HW_VAR_CHK_HI_QUEUE_EMPTY: - val16 = rtw_read16(padapter, REG_TXPKT_EMPTY); - *pval = (val16 & BIT(10)) ? _TRUE:_FALSE; - break; - - case HW_VAR_DUMP_MAC_QUEUE_INFO: - dump_mac_qinfo_8814a(pval, padapter); - break; - - default: - GetHwReg(padapter, variable, pval); - break; - } - -} - -/* - * Description: - * Change default setting of specified variable. - */ -u8 SetHalDefVar8814A(PADAPTER padapter, HAL_DEF_VARIABLE variable, void *pval) -{ - PHAL_DATA_TYPE pHalData; - u8 bResult; - - - pHalData = GET_HAL_DATA(padapter); - bResult = _SUCCESS; - - switch (variable) - { - case HAL_DEF_EFUSE_BYTES: - pHalData->EfuseUsedBytes = *((u16*)pval); - break; - case HAL_DEF_EFUSE_USAGE: - pHalData->EfuseUsedPercentage = *((u8*)pval); - break; - default: - bResult = SetHalDefVar(padapter, variable, pval); - break; - } - - return bResult; -} - -/* - * Description: - * Query setting of specified variable. - */ -u8 GetHalDefVar8814A(PADAPTER padapter, HAL_DEF_VARIABLE variable, void *pval) -{ - PHAL_DATA_TYPE pHalData; - u8 bResult; - - - pHalData = GET_HAL_DATA(padapter); - bResult = _SUCCESS; - - switch (variable) - { - - -#ifdef CONFIG_ANTENNA_DIVERSITY - case HAL_DEF_IS_SUPPORT_ANT_DIV: - *((u8*)pval) = (pHalData->AntDivCfg==0) ? _FALSE : _TRUE; - break; -#endif //CONFIG_ANTENNA_DIVERSITY - -#ifdef CONFIG_ANTENNA_DIVERSITY - case HAL_DEF_CURRENT_ANTENNA: - *((u8*)pval) = pHalData->CurAntenna; - break; -#endif //CONFIG_ANTENNA_DIVERSITY - - case HAL_DEF_DRVINFO_SZ: - *((u32*)pval) = DRVINFO_SZ; - break; - - case HAL_DEF_MAX_RECVBUF_SZ: - *((u32*)pval) = MAX_RECVBUF_SZ; - break; - - case HAL_DEF_RX_PACKET_OFFSET: - *((u32*)pval) = RXDESC_SIZE + DRVINFO_SZ*8; - break; - - case HW_VAR_MAX_RX_AMPDU_FACTOR: - *((u32*)pval) = MAX_AMPDU_FACTOR_64K; - break; - - case HW_VAR_BEST_AMPDU_DENSITY: - *((u32 *)pval) = AMPDU_DENSITY_VALUE_4; - break; - - case HAL_DEF_TX_LDPC: - *(u8*)pval = _TRUE; - break; - - case HAL_DEF_RX_LDPC: - *(u8*)pval = _TRUE; - break; - - case HAL_DEF_TX_STBC: - if (pHalData->rf_type == RF_1T2R || pHalData->rf_type == RF_1T1R) - *(u8 *)pval = 0; - else - *(u8 *)pval = 1; - break; - - case HAL_DEF_RX_STBC: - *(u8*)pval = 4; - break; - - case HAL_DEF_EXPLICIT_BEAMFORMER: - if (pHalData->rf_type != RF_1T2R || pHalData->rf_type != RF_1T1R)/*1T?R not support mer*/ - *((PBOOLEAN)pval) = _TRUE; - else - *((PBOOLEAN)pval) = _FALSE; - break; - case HAL_DEF_EXPLICIT_BEAMFORMEE: - *((PBOOLEAN)pval) = _TRUE; - break; - - case HW_DEF_RA_INFO_DUMP: -#if 0 - { - u8 mac_id = *(u8*)pval; - u32 cmd ; - u32 ra_info1, ra_info2; - u32 rate_mask1, rate_mask2; - u8 curr_tx_rate,curr_tx_sgi,hight_rate,lowest_rate; - - RTW_INFO("============ RA status check Mac_id:%d ===================\n", mac_id); - - cmd = 0x40000100 |mac_id; - rtw_write32(padapter,REG_HMEBOX_E2_E3_8812,cmd); - rtw_msleep_os(10); - ra_info1 = rtw_read32(padapter,REG_RSVD5_8812); - curr_tx_rate = ra_info1&0x7F; - curr_tx_sgi = (ra_info1>>7)&0x01; - RTW_INFO("[ ra_info1:0x%08x ] =>cur_tx_rate= %s,cur_sgi:%d, PWRSTS = 0x%02x \n", - ra_info1, - HDATA_RATE(curr_tx_rate), - curr_tx_sgi, - (ra_info1>>8) & 0x07); - - cmd = 0x40000400 | mac_id; - rtw_write32(padapter, REG_HMEBOX_E2_E3_8812,cmd); - rtw_msleep_os(10); - ra_info1 = rtw_read32(padapter, REG_RSVD5_8812); - ra_info2 = rtw_read32(padapter, REG_RSVD6_8812); - rate_mask1 = rtw_read32(padapter,REG_RSVD7_8812); - rate_mask2 = rtw_read32(padapter,REG_RSVD8_8812); - hight_rate = ra_info2&0xFF; - lowest_rate = (ra_info2>>8) & 0xFF; - RTW_INFO("[ ra_info1:0x%08x ] =>RSSI=%d, BW_setting=0x%02x, DISRA=0x%02x, VHT_EN=0x%02x\n", - ra_info1, - ra_info1&0xFF, - (ra_info1>>8) & 0xFF, - (ra_info1>>16) & 0xFF, - (ra_info1>>24) & 0xFF); - - RTW_INFO("[ ra_info2:0x%08x ] =>hight_rate=%s, lowest_rate=%s, SGI=0x%02x, RateID=%d\n", - ra_info2, - HDATA_RATE(hight_rate), - HDATA_RATE(lowest_rate), - (ra_info2>>16) & 0xFF, - (ra_info2>>24) & 0xFF); - RTW_INFO("rate_mask2=0x%08x, rate_mask1=0x%08x\n", rate_mask2, rate_mask1); - } -#else //0 - RTW_INFO("%s,%d, 8814 need to fix \n", __FUNCTION__,__LINE__); -#endif //0 - break; - - case HAL_DEF_TX_PAGE_SIZE: - *(u32*)pval = PAGE_SIZE_128; - break; - - case HAL_DEF_TX_PAGE_BOUNDARY: - if (!padapter->registrypriv.wifi_spec) - { - *(u16*)pval = TX_PAGE_BOUNDARY_8814A; - } - else - { - *(u16*)pval = WMM_NORMAL_TX_PAGE_BOUNDARY_8814A; - } - break; - - case HAL_DEF_TX_PAGE_BOUNDARY_WOWLAN: - *(u16*)pval = TX_PAGE_BOUNDARY_WOWLAN_8814A; - break; - - case HAL_DEF_EFUSE_BYTES: - *((u16*)(pval)) = pHalData->EfuseUsedBytes; - break; - case HAL_DEF_EFUSE_USAGE: - *((u32*)(pval)) = (pHalData->EfuseUsedPercentage<<16)|(pHalData->EfuseUsedBytes); - break; - case HAL_DEF_RX_DMA_SZ_WOW: - *((u32 *)pval) = RX_DMA_BOUNDARY_8814A + 1; - break; - case HAL_DEF_RX_DMA_SZ: - *((u32 *)pval) = RX_DMA_BOUNDARY_8814A + 1; - break; - case HAL_DEF_RX_PAGE_SIZE: - *((u32 *)pval) = 8; - break; - default: - bResult = GetHalDefVar(padapter, variable, pval); - break; - } - - return bResult; -} - - -#ifdef CONFIG_BT_COEXIST -void rtl8812a_combo_card_WifiOnlyHwInit(PADAPTER pdapter) -{ - u8 u1Tmp; - RTW_INFO("%s !\n", __FUNCTION__); - if(IS_HARDWARE_TYPE_8812(pdapter)) - { - //0x790[5:0]=0x5 - u1Tmp = rtw_read8(pdapter,0x790); - u1Tmp = (u1Tmp & 0xb0) | 0x05 ; - rtw_write8(pdapter,0x790,u1Tmp); - // PTA parameter - //pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x6cc, 0x0); - //pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c8, 0xffffff); - //pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c4, 0x55555555); - //pBtCoexist->fBtcWrite4Byte(pBtCoexist, 0x6c0, 0x55555555); - rtw_write8(pdapter,0x6cc,0x0); - rtw_write32(pdapter,0x6c8,0xffffff); - rtw_write32(pdapter,0x6c4,0x55555555); - rtw_write32(pdapter,0x6c0,0x55555555); - - // coex parameters - //pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x778, 0x3); - rtw_write8(pdapter,0x778,0x3); - - // enable counter statistics - //pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x76e, 0xc); - rtw_write8(pdapter,0x76e,0xc); - - // enable PTA - //pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x40, 0x20); - rtw_write8(pdapter,0x40, 0x20); - - // bt clock related - //u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x4); - //u1Tmp |= BIT7; - //pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x4, u1Tmp); - u1Tmp = rtw_read8(pdapter,0x4); - u1Tmp |= BIT7; - rtw_write8(pdapter,0x4, u1Tmp); - - // bt clock related - //u1Tmp = pBtCoexist->fBtcRead1Byte(pBtCoexist, 0x7); - //u1Tmp |= BIT1; - //pBtCoexist->fBtcWrite1Byte(pBtCoexist, 0x7, u1Tmp); - u1Tmp = rtw_read8(pdapter,0x7); - u1Tmp |= BIT1; - rtw_write8(pdapter,0x7, u1Tmp); - } - - -} -#endif //CONFIG_BT_COEXIST - -void rtl8814_set_hal_ops(struct hal_ops *pHalFunc) -{ - pHalFunc->dm_init = &rtl8814_init_dm_priv; - pHalFunc->dm_deinit = &rtl8814_deinit_dm_priv; - - pHalFunc->SetBeaconRelatedRegistersHandler = &SetBeaconRelatedRegisters8814A; - - pHalFunc->read_chip_version = read_chip_version_8814a; - -// pHalFunc->set_bwmode_handler = &PHY_SetBWMode8814; -// pHalFunc->set_channel_handler = &PHY_SwChnl8814; - pHalFunc->set_chnl_bw_handler = &PHY_SetSwChnlBWMode8814; - - pHalFunc->set_tx_power_level_handler = &PHY_SetTxPowerLevel8814; - pHalFunc->get_tx_power_level_handler = &PHY_GetTxPowerLevel8814; - pHalFunc->set_tx_power_index_handler = &PHY_SetTxPowerIndex_8814A; - pHalFunc->get_tx_power_index_handler = &PHY_GetTxPowerIndex8814A; - - pHalFunc->hal_dm_watchdog = &rtl8814_HalDmWatchDog; - -// pHalFunc->Add_RateATid = &rtl8814_Add_RateATid; - - pHalFunc->run_thread= &rtl8814_start_thread; - pHalFunc->cancel_thread= &rtl8814_stop_thread; - -#ifdef CONFIG_ANTENNA_DIVERSITY - pHalFunc->AntDivBeforeLinkHandler = &AntDivBeforeLink8812; - pHalFunc->AntDivCompareHandler = &AntDivCompare8812; -#endif //CONFIG_ANTENNA_DIVERSITY - - pHalFunc->read_bbreg = &PHY_QueryBBReg8814A; - pHalFunc->write_bbreg = &PHY_SetBBReg8814A; - pHalFunc->read_rfreg = &PHY_QueryRFReg8814A; - pHalFunc->write_rfreg = &PHY_SetRFReg8814A; - - - // Efuse related function - pHalFunc->EfusePowerSwitch = &rtl8814_EfusePowerSwitch; - pHalFunc->ReadEFuse = &rtl8814_ReadEFuse; - pHalFunc->EFUSEGetEfuseDefinition = &rtl8814_EFUSE_GetEfuseDefinition; - pHalFunc->EfuseGetCurrentSize = &rtl8814_EfuseGetCurrentSize; - pHalFunc->Efuse_PgPacketRead = &rtl8814_Efuse_PgPacketRead; - pHalFunc->Efuse_PgPacketWrite = &rtl8814_Efuse_PgPacketWrite; - pHalFunc->Efuse_WordEnableDataWrite = &rtl8814_Efuse_WordEnableDataWrite; - -#ifdef DBG_CONFIG_ERROR_DETECT - pHalFunc->sreset_init_value = &sreset_init_value; - pHalFunc->sreset_reset_value = &sreset_reset_value; - pHalFunc->silentreset = &sreset_reset; - pHalFunc->sreset_xmit_status_check = &rtl8814_sreset_xmit_status_check; - pHalFunc->sreset_linked_status_check = &rtl8814_sreset_linked_status_check; - pHalFunc->sreset_get_wifi_status = &sreset_get_wifi_status; - pHalFunc->sreset_inprogress= &sreset_inprogress; -#endif //DBG_CONFIG_ERROR_DETECT - - pHalFunc->GetHalODMVarHandler = GetHalODMVar; - pHalFunc->SetHalODMVarHandler = SetHalODMVar; - pHalFunc->hal_notch_filter = &hal_notch_filter_8814; - - pHalFunc->c2h_handler = c2h_handler_8814a; - - pHalFunc->fill_h2c_cmd = &FillH2CCmd_8814; - pHalFunc->fill_fake_txdesc = &rtl8814a_fill_fake_txdesc; -#ifdef CONFIG_WOWLAN - pHalFunc->hal_set_wowlan_fw = &SetFwRelatedForWoWLAN8814; -#endif //CONFIG_WOWLAN - pHalFunc->fw_dl = &FirmwareDownload8814A; - pHalFunc->hal_get_tx_buff_rsvd_page_num = &GetTxBufferRsvdPageNum8814; -} - - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/rtl8814a_phycfg.c b/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/rtl8814a_phycfg.c deleted file mode 100644 index 1c212540c1ef47..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/rtl8814a_phycfg.c +++ /dev/null @@ -1,3027 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#define _RTL8814A_PHYCFG_C_ - -//#include - -#include -#include "hal_com_h2c.h" - -/*---------------------Define local function prototype-----------------------*/ - -/*----------------------------Function Body----------------------------------*/ -//1 1. BB register R/W API - -u32 -PHY_QueryBBReg8814A( - IN PADAPTER Adapter, - IN u32 RegAddr, - IN u32 BitMask - ) -{ - u32 ReturnValue = 0, OriginalValue, BitShift; - -#if (DISABLE_BB_RF == 1) - return 0; -#endif - -#if(SIC_ENABLE == 1) - return SIC_QueryBBReg(Adapter, RegAddr, BitMask); -#endif - - OriginalValue = rtw_read32(Adapter, RegAddr); - BitShift = PHY_CalculateBitShift(BitMask); - ReturnValue = (OriginalValue & BitMask) >> BitShift; - - //RTW_INFO("BBR MASK=0x%x Addr[0x%x]=0x%x\n", BitMask, RegAddr, OriginalValue); - - return (ReturnValue); -} - - -VOID -PHY_SetBBReg8814A( - IN PADAPTER Adapter, - IN u32 RegAddr, - IN u32 BitMask, - IN u32 Data - ) -{ - u32 OriginalValue, BitShift; - -#if (DISABLE_BB_RF == 1) - return; -#endif - -#if(SIC_ENABLE == 1) - SIC_SetBBReg(Adapter, RegAddr, BitMask, Data); - return; -#endif - - if(BitMask!= bMaskDWord) - {//if not "double word" write - OriginalValue = rtw_read32(Adapter, RegAddr); - BitShift = PHY_CalculateBitShift(BitMask); - Data = ((OriginalValue) & (~BitMask)) |( ((Data << BitShift)) & BitMask); - } - - rtw_write32(Adapter, RegAddr, Data); - - //RTW_INFO("BBW MASK=0x%x Addr[0x%x]=0x%x\n", BitMask, RegAddr, Data); -} - - - -static u32 -phy_RFRead_8814A( - IN PADAPTER Adapter, - IN u8 eRFPath, - IN u32 RegAddr, - IN u32 BitMask - ) -{ - u32 DataAndAddr = 0; - u32 Readback_Value, Direct_Addr; - - RegAddr &= 0xff; - switch(eRFPath){ - case RF_PATH_A: - Direct_Addr = 0x2800+RegAddr*4; - break; - case RF_PATH_B: - Direct_Addr = 0x2c00+RegAddr*4; - break; - case RF_PATH_C: - Direct_Addr = 0x3800+RegAddr*4; - break; - case RF_PATH_D: - Direct_Addr = 0x3c00+RegAddr*4; - break; - default: //pathA - Direct_Addr = 0x2800+RegAddr*4; - break; - } - - - BitMask &= bRFRegOffsetMask; - - Readback_Value = phy_query_bb_reg(Adapter, Direct_Addr, BitMask); - //RTW_INFO("RFR-%d Addr[0x%x]=0x%x\n", eRFPath, RegAddr, Readback_Value); - - return Readback_Value; -} - - -static VOID -phy_RFWrite_8814A( - IN PADAPTER Adapter, - IN u8 eRFPath, - IN u32 Offset, - IN u32 Data - ) -{ - u32 DataAndAddr = 0; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - BB_REGISTER_DEFINITION_T *pPhyReg = &pHalData->PHYRegDef[eRFPath]; - - // 2009/06/17 MH We can not execute IO for power save or other accident mode. - //if(RT_CANNOT_IO(Adapter)) - //{ - //RT_DISP(FPHY, PHY_RFW, ("phy_RFSerialWrite stop\n")); - //return; - //} - - Offset &= 0xff; - - // Shadow Update - //PHY_RFShadowWrite(Adapter, eRFPath, Offset, Data); - - // Put write addr in [27:20] and write data in [19:00] - DataAndAddr = ((Offset<<20) | (Data&0x000fffff)) & 0x0fffffff; - - // Write Operation - phy_set_bb_reg(Adapter, pPhyReg->rf3wireOffset, bMaskDWord, DataAndAddr); - //RTW_INFO("RFW-%d Addr[0x%x]=0x%x\n", eRFPath, pPhyReg->rf3wireOffset, DataAndAddr); -} - - -u32 -PHY_QueryRFReg8814A( - IN PADAPTER Adapter, - IN enum rf_path eRFPath, - IN u32 RegAddr, - IN u32 BitMask - ) -{ - u32 Readback_Value; - -#if (DISABLE_BB_RF == 1) - return 0; -#endif - - Readback_Value = phy_RFRead_8814A(Adapter, eRFPath, RegAddr, BitMask); - - return (Readback_Value); -} - - -VOID -PHY_SetRFReg8814A( - IN PADAPTER Adapter, - IN enum rf_path eRFPath, - IN u32 RegAddr, - IN u32 BitMask, - IN u32 Data - ) -{ - -#if (DISABLE_BB_RF == 1) - return; -#endif - - if(BitMask == 0) - return; - - RegAddr &= 0xff; - // RF data is 20 bits only - if (BitMask != bLSSIWrite_data_Jaguar) { - u32 Original_Value, BitShift; - - Original_Value = phy_RFRead_8814A(Adapter, eRFPath, RegAddr, bLSSIWrite_data_Jaguar); - BitShift = PHY_CalculateBitShift(BitMask); - Data = ((Original_Value) & (~BitMask)) | (Data<< BitShift); - } - - phy_RFWrite_8814A(Adapter, eRFPath, RegAddr, Data); - - -} - -// -// 3. Initial MAC/BB/RF config by reading MAC/BB/RF txt. -// - -s32 PHY_MACConfig8814(PADAPTER Adapter) -{ - int rtStatus = _FAIL; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - // - // Config MAC - // -#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE - rtStatus = phy_ConfigMACWithParaFile(Adapter, PHY_FILE_MAC_REG); - if (rtStatus == _FAIL) -#endif //CONFIG_LOAD_PHY_PARA_FROM_FILE - { -#ifdef CONFIG_EMBEDDED_FWIMG - odm_config_mac_with_header_file(&pHalData->odmpriv); - rtStatus = _SUCCESS; -#endif//CONFIG_EMBEDDED_FWIMG - } - - return rtStatus; -} - - -static VOID -phy_InitBBRFRegisterDefinition( - IN PADAPTER Adapter -) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - // RF Interface Sowrtware Control - pHalData->PHYRegDef[RF_PATH_A].rfintfs = rFPGA0_XAB_RFInterfaceSW; // 16 LSBs if read 32-bit from 0x870 - pHalData->PHYRegDef[RF_PATH_B].rfintfs = rFPGA0_XAB_RFInterfaceSW; // 16 MSBs if read 32-bit from 0x870 (16-bit for 0x872) - - // RF Interface Output (and Enable) - pHalData->PHYRegDef[RF_PATH_A].rfintfo = rFPGA0_XA_RFInterfaceOE; // 16 LSBs if read 32-bit from 0x860 - pHalData->PHYRegDef[RF_PATH_B].rfintfo = rFPGA0_XB_RFInterfaceOE; // 16 LSBs if read 32-bit from 0x864 - - // RF Interface (Output and) Enable - pHalData->PHYRegDef[RF_PATH_A].rfintfe = rFPGA0_XA_RFInterfaceOE; // 16 MSBs if read 32-bit from 0x860 (16-bit for 0x862) - pHalData->PHYRegDef[RF_PATH_B].rfintfe = rFPGA0_XB_RFInterfaceOE; // 16 MSBs if read 32-bit from 0x864 (16-bit for 0x866) - - if(IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(Adapter)) - { - pHalData->PHYRegDef[RF_PATH_A].rf3wireOffset = rA_LSSIWrite_Jaguar; //LSSI Parameter - pHalData->PHYRegDef[RF_PATH_B].rf3wireOffset = rB_LSSIWrite_Jaguar; - - pHalData->PHYRegDef[RF_PATH_A].rfHSSIPara2 = rHSSIRead_Jaguar; //wire control parameter2 - pHalData->PHYRegDef[RF_PATH_B].rfHSSIPara2 = rHSSIRead_Jaguar; //wire control parameter2 - } - else - { - pHalData->PHYRegDef[RF_PATH_A].rf3wireOffset = rFPGA0_XA_LSSIParameter; //LSSI Parameter - pHalData->PHYRegDef[RF_PATH_B].rf3wireOffset = rFPGA0_XB_LSSIParameter; - - pHalData->PHYRegDef[RF_PATH_A].rfHSSIPara2 = rFPGA0_XA_HSSIParameter2; //wire control parameter2 - pHalData->PHYRegDef[RF_PATH_B].rfHSSIPara2 = rFPGA0_XB_HSSIParameter2; //wire control parameter2 - } - - if(IS_HARDWARE_TYPE_8814A(Adapter)) - { - pHalData->PHYRegDef[RF_PATH_C].rf3wireOffset = rC_LSSIWrite_Jaguar2; //LSSI Parameter - pHalData->PHYRegDef[RF_PATH_D].rf3wireOffset = rD_LSSIWrite_Jaguar2; - - pHalData->PHYRegDef[RF_PATH_C].rfHSSIPara2 = rHSSIRead_Jaguar; //wire control parameter2 - pHalData->PHYRegDef[RF_PATH_D].rfHSSIPara2 = rHSSIRead_Jaguar; //wire control parameter2 - } - - if(IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(Adapter)) - { - // Tranceiver Readback LSSI/HSPI mode - pHalData->PHYRegDef[RF_PATH_A].rfLSSIReadBack = rA_SIRead_Jaguar; - pHalData->PHYRegDef[RF_PATH_B].rfLSSIReadBack = rB_SIRead_Jaguar; - pHalData->PHYRegDef[RF_PATH_A].rfLSSIReadBackPi = rA_PIRead_Jaguar; - pHalData->PHYRegDef[RF_PATH_B].rfLSSIReadBackPi = rB_PIRead_Jaguar; - } - else - { - // Tranceiver Readback LSSI/HSPI mode - pHalData->PHYRegDef[RF_PATH_A].rfLSSIReadBack = rFPGA0_XA_LSSIReadBack; - pHalData->PHYRegDef[RF_PATH_B].rfLSSIReadBack = rFPGA0_XB_LSSIReadBack; - pHalData->PHYRegDef[RF_PATH_A].rfLSSIReadBackPi = TransceiverA_HSPI_Readback; - pHalData->PHYRegDef[RF_PATH_B].rfLSSIReadBackPi = TransceiverB_HSPI_Readback; - } - - if(IS_HARDWARE_TYPE_8814A(Adapter)) - { - // Tranceiver Readback LSSI/HSPI mode - pHalData->PHYRegDef[RF_PATH_C].rfLSSIReadBack = rC_SIRead_Jaguar2; - pHalData->PHYRegDef[RF_PATH_D].rfLSSIReadBack = rD_SIRead_Jaguar2; - pHalData->PHYRegDef[RF_PATH_C].rfLSSIReadBackPi = rC_PIRead_Jaguar2; - pHalData->PHYRegDef[RF_PATH_D].rfLSSIReadBackPi = rD_PIRead_Jaguar2; - } - - //pHalData->bPhyValueInitReady=TRUE; -} - - -int -PHY_BBConfig8814( - IN PADAPTER Adapter - ) -{ - int rtStatus = _SUCCESS; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 TmpU1B=0; - - phy_InitBBRFRegisterDefinition(Adapter); - - // . APLL_EN,,APLL_320_GATEB,APLL_320BIAS, auto config by hw fsm after pfsm_go (0x4 bit 8) set - TmpU1B = PlatformEFIORead1Byte(Adapter, REG_SYS_FUNC_EN_8814A); - - if(IS_HARDWARE_TYPE_8814AU(Adapter)) - TmpU1B |= FEN_USBA; - else if(IS_HARDWARE_TYPE_8814AE(Adapter)) - TmpU1B |= FEN_PCIEA; - - PlatformEFIOWrite1Byte(Adapter, REG_SYS_FUNC_EN, TmpU1B); - - TmpU1B = PlatformEFIORead1Byte(Adapter, 0x1002); - PlatformEFIOWrite1Byte(Adapter, 0x1002, (TmpU1B|FEN_BB_GLB_RSTn|FEN_BBRSTB));//same with 8812 - - //6. 0x1f[7:0] = 0x07 PathA RF Power On - PlatformEFIOWrite1Byte(Adapter, REG_RF_CTRL0_8814A , 0x07);//RF_SDMRSTB,RF_RSTB,RF_EN same with 8723a - //7. 0x20[7:0] = 0x07 PathB RF Power On - //8. 0x21[7:0] = 0x07 PathC RF Power On - PlatformEFIOWrite2Byte(Adapter, REG_RF_CTRL1_8814A , 0x0707);//RF_SDMRSTB,RF_RSTB,RF_EN same with 8723a - //9. 0x76[7:0] = 0x07 PathD RF Power On - PlatformEFIOWrite1Byte(Adapter, REG_RF_CTRL3_8814A , 0x7); - - // - // Config BB and AGC - // - rtStatus = phy_BB8814A_Config_ParaFile(Adapter); - - hal_set_crystal_cap(Adapter, pHalData->crystal_cap); - - switch (Adapter->registrypriv.rf_config) { - case RF_1T1R: - case RF_2T4R: - case RF_3T3R: - /*RX CCK disable 2R CCA*/ - phy_set_bb_reg(Adapter, rCCK0_FalseAlarmReport+2, BIT2|BIT6, 0); - /*pathB tx on, path A/C/D tx off*/ - phy_set_bb_reg(Adapter, rCCK_RX_Jaguar, 0xf0000000, 0x4); - /*pathB rx*/ - phy_set_bb_reg(Adapter, rCCK_RX_Jaguar, 0x0f000000, 0x5); - break; - default: - /*RX CCK disable 2R CCA*/ - phy_set_bb_reg(Adapter, rCCK0_FalseAlarmReport+2, BIT2|BIT6, 0); - /*pathB tx on, path A/C/D tx off*/ - phy_set_bb_reg(Adapter, rCCK_RX_Jaguar, 0xf0000000, 0x4); - /*pathB rx*/ - phy_set_bb_reg(Adapter, rCCK_RX_Jaguar, 0x0f000000, 0x5); - RTW_INFO("%s, unknown rf_config: %d\n", __func__, Adapter->registrypriv.rf_config); - break; - } - - return rtStatus; -} - -int phy_BB8814A_Config_ParaFile( - IN PADAPTER Adapter -) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - int rtStatus = _SUCCESS; - - /* Read PHY_REG.TXT BB INIT!! */ -#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE - if (phy_ConfigBBWithParaFile(Adapter, PHY_FILE_PHY_REG, CONFIG_BB_PHY_REG) == _FAIL) -#endif - { -#ifdef CONFIG_EMBEDDED_FWIMG - if (HAL_STATUS_SUCCESS != odm_config_bb_with_header_file(&pHalData->odmpriv, CONFIG_BB_PHY_REG)) - rtStatus = _FAIL; -#endif - } - - if (rtStatus != _SUCCESS) { - RTW_INFO("%s(): CONFIG_BB_PHY_REG Fail!!\n", __FUNCTION__); - goto phy_BB_Config_ParaFile_Fail; - } - - /* Read PHY_REG_MP.TXT BB INIT!! */ -#if (MP_DRIVER == 1) - if (Adapter->registrypriv.mp_mode == 1) { -#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE - if (phy_ConfigBBWithMpParaFile(Adapter, PHY_FILE_PHY_REG_MP) == _FAIL) -#endif - { -#ifdef CONFIG_EMBEDDED_FWIMG - if (HAL_STATUS_SUCCESS != odm_config_bb_with_header_file(&pHalData->odmpriv, CONFIG_BB_PHY_REG_MP)) - rtStatus = _FAIL; -#endif - } - - if (rtStatus != _SUCCESS) { - RTW_INFO("phy_BB8814_Config_ParaFile():Write BB Reg MP Fail!!\n"); - goto phy_BB_Config_ParaFile_Fail; - } - } -#endif /* #if (MP_DRIVER == 1) */ - - /* BB AGC table Initialization */ -#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE - if (phy_ConfigBBWithParaFile(Adapter, PHY_FILE_AGC_TAB, CONFIG_BB_AGC_TAB) == _FAIL) -#endif - { -#ifdef CONFIG_EMBEDDED_FWIMG - if (HAL_STATUS_SUCCESS != odm_config_bb_with_header_file(&pHalData->odmpriv, CONFIG_BB_AGC_TAB)) - rtStatus = _FAIL; -#endif - } - - if (rtStatus != _SUCCESS) - RTW_INFO("%s(): CONFIG_BB_AGC_TAB Fail!!\n", __FUNCTION__); - -phy_BB_Config_ParaFile_Fail: - - return rtStatus; -} - - -VOID -phy_ADC_CLK_8814A( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u32 MAC_REG_520, BB_REG_8FC, BB_REG_808, RXIQC[4]; - u32 Search_index = 0, MAC_Active = 1; - u32 RXIQC_REG[2][4] = {{0xc10, 0xe10, 0x1810, 0x1a10}, {0xc14, 0xe14, 0x1814, 0x1a14}} ; - - if (GET_CVID_CUT_VERSION(pHalData->version_id) != A_CUT_VERSION) - return; - -//1 Step1. MAC TX pause - MAC_REG_520 = phy_query_bb_reg( Adapter, 0x520, bMaskDWord); - BB_REG_8FC = phy_query_bb_reg( Adapter, 0x8fc, bMaskDWord); - BB_REG_808 = phy_query_bb_reg( Adapter, 0x808, bMaskDWord); - phy_set_bb_reg(Adapter, 0x520, bMaskByte2, 0x3f); - -//1 Step 2. Backup RXIQC & RXIQC = 0 - for(Search_index = 0; Search_index<4; Search_index++){ - RXIQC[Search_index] = phy_query_bb_reg( Adapter, RXIQC_REG[0][Search_index], bMaskDWord); - phy_set_bb_reg(Adapter, RXIQC_REG[0][Search_index], bMaskDWord, 0x0); - phy_set_bb_reg(Adapter, RXIQC_REG[1][Search_index], bMaskDWord, 0x0); - } - phy_set_bb_reg(Adapter, 0xa14, 0x00000300, 0x3); - Search_index = 0; - -//1 Step 3. Monitor MAC IDLE - phy_set_bb_reg(Adapter, 0x8fc, bMaskDWord, 0x0); - while(MAC_Active){ - MAC_Active = phy_query_bb_reg( Adapter, 0xfa0, bMaskDWord) & (0x803e0008); - Search_index++; - if(Search_index>1000){ - break; - } - } - -//1 Step 4. ADC clk flow - phy_set_bb_reg(Adapter, 0x808, bMaskByte0, 0x11); - phy_set_bb_reg(Adapter, 0x90c, BIT(13), 0x1); - phy_set_bb_reg(Adapter, 0x764, BIT(10)|BIT(9), 0x3); - phy_set_bb_reg(Adapter, 0x804, BIT(2), 0x1); - - // 0xc1c/0xe1c/0x181c/0x1a1c[4] must=1 to ensure table can be written when bbrstb=0 - // 0xc60/0xe60/0x1860/0x1a60[15] always = 1 after this line - // 0xc60/0xe60/0x1860/0x1a60[14] always = 0 bcz its error in A-cut - - // power_off/clk_off @ anapar_state=idle mode - phy_set_bb_reg(Adapter, 0xc60, bMaskDWord, 0x15800002); //0xc60 0x15808002 - phy_set_bb_reg(Adapter, 0xc60, bMaskDWord, 0x01808003); //0xc60 0x01808003 - phy_set_bb_reg(Adapter, 0xe60, bMaskDWord, 0x15800002); //0xe60 0x15808002 - phy_set_bb_reg(Adapter, 0xe60, bMaskDWord, 0x01808003); //0xe60 0x01808003 - phy_set_bb_reg(Adapter, 0x1860, bMaskDWord, 0x15800002); //0x1860 0x15808002 - phy_set_bb_reg(Adapter, 0x1860, bMaskDWord, 0x01808003); //0x1860 0x01808003 - phy_set_bb_reg(Adapter, 0x1a60, bMaskDWord, 0x15800002); //0x1a60 0x15808002 - phy_set_bb_reg(Adapter, 0x1a60, bMaskDWord, 0x01808003); //0x1a60 0x01808003 - - phy_set_bb_reg(Adapter, 0x764, BIT(10), 0x0); - phy_set_bb_reg(Adapter, 0x804, BIT(2), 0x0); - phy_set_bb_reg(Adapter, 0xc5c, bMaskDWord, 0x0D080058); //0xc5c 0x00080058 // [19] =1 to turn off ADC - phy_set_bb_reg(Adapter, 0xe5c, bMaskDWord, 0x0D080058); //0xe5c 0x00080058 // [19] =1 to turn off ADC - phy_set_bb_reg(Adapter, 0x185c, bMaskDWord, 0x0D080058); //0x185c 0x00080058 // [19] =1 to turn off ADC - phy_set_bb_reg(Adapter, 0x1a5c, bMaskDWord, 0x0D080058); //0x1a5c 0x00080058 // [19] =1 to turn off ADC - - // power_on/clk_off - //phy_set_bb_reg(Adapter, 0x764, BIT(10), 0x1); - phy_set_bb_reg(Adapter, 0xc5c, bMaskDWord, 0x0D000058); //0xc5c 0x0D000058 // [19] =0 to turn on ADC - phy_set_bb_reg(Adapter, 0xe5c, bMaskDWord, 0x0D000058); //0xe5c 0x0D000058 // [19] =0 to turn on ADC - phy_set_bb_reg(Adapter, 0x185c, bMaskDWord, 0x0D000058); //0x185c 0x0D000058 // [19] =0 to turn on ADC - phy_set_bb_reg(Adapter, 0x1a5c, bMaskDWord, 0x0D000058); //0x1a5c 0x0D000058 // [19] =0 to turn on ADC - - // power_on/clk_on @ anapar_state=BT mode - phy_set_bb_reg(Adapter, 0xc60, bMaskDWord, 0x05808032); //0xc60 0x05808002 - phy_set_bb_reg(Adapter, 0xe60, bMaskDWord, 0x05808032); //0xe60 0x05808002 - phy_set_bb_reg(Adapter, 0x1860, bMaskDWord, 0x05808032); //0x1860 0x05808002 - phy_set_bb_reg(Adapter, 0x1a60, bMaskDWord, 0x05808032); //0x1a60 0x05808002 - phy_set_bb_reg(Adapter, 0x764, BIT(10), 0x1); - phy_set_bb_reg(Adapter, 0x804, BIT(2), 0x1); - - // recover original setting @ anapar_state=BT mode - phy_set_bb_reg(Adapter, 0xc60, bMaskDWord, 0x05808032); //0xc60 0x05808036 - phy_set_bb_reg(Adapter, 0xe60, bMaskDWord, 0x05808032); //0xe60 0x05808036 - phy_set_bb_reg(Adapter, 0x1860, bMaskDWord, 0x05808032); //0x1860 0x05808036 - phy_set_bb_reg(Adapter, 0x1a60, bMaskDWord, 0x05808032); //0x1a60 0x05808036 - - phy_set_bb_reg(Adapter, 0xc60, bMaskDWord, 0x05800002); //0xc60 0x05800002 - phy_set_bb_reg(Adapter, 0xc60, bMaskDWord, 0x07808003); //0xc60 0x07808003 - phy_set_bb_reg(Adapter, 0xe60, bMaskDWord, 0x05800002); //0xe60 0x05800002 - phy_set_bb_reg(Adapter, 0xe60, bMaskDWord, 0x07808003); //0xe60 0x07808003 - phy_set_bb_reg(Adapter, 0x1860, bMaskDWord, 0x05800002); //0x1860 0x05800002 - phy_set_bb_reg(Adapter, 0x1860, bMaskDWord, 0x07808003); //0x1860 0x07808003 - phy_set_bb_reg(Adapter, 0x1a60, bMaskDWord, 0x05800002); //0x1a60 0x05800002 - phy_set_bb_reg(Adapter, 0x1a60, bMaskDWord, 0x07808003); //0x1a60 0x07808003 - - phy_set_bb_reg(Adapter, 0x764, BIT(10)|BIT(9), 0x0); - phy_set_bb_reg(Adapter, 0x804, BIT(2), 0x0); - phy_set_bb_reg(Adapter, 0x90c, BIT(13), 0x0); - -//1 Step 5. Recover MAC TX & IQC - phy_set_bb_reg(Adapter, 0x520, bMaskDWord, MAC_REG_520); - phy_set_bb_reg(Adapter, 0x8fc, bMaskDWord, BB_REG_8FC); - phy_set_bb_reg(Adapter, 0x808, bMaskDWord, BB_REG_808); - for(Search_index = 0; Search_index<4; Search_index++){ - phy_set_bb_reg(Adapter, RXIQC_REG[0][Search_index], bMaskDWord, RXIQC[Search_index]); - phy_set_bb_reg(Adapter, RXIQC_REG[1][Search_index], bMaskDWord, 0x01000000); - } - phy_set_bb_reg(Adapter, 0xa14, 0x00000300, 0x0); -} - -VOID -PHY_ConfigBB_8814A( - IN PADAPTER Adapter - ) -{ - - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - RTW_DBG(" ===> PHY_ConfigBB_8814A() \n"); - phy_set_bb_reg(Adapter, rOFDMCCKEN_Jaguar, bOFDMEN_Jaguar|bCCKEN_Jaguar, 0x3); -} - - - -//2 3.3 RF Config - -s32 -PHY_RFConfig8814A( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - int rtStatus = _SUCCESS; - - //vivi added this, 20100610 - if (rtw_is_surprise_removed(Adapter)) - return _FAIL; - - switch(pHalData->rf_chip) - { - case RF_PSEUDO_11N: - RTW_INFO("%s(): RF_PSEUDO_11N\n",__FUNCTION__); - break; - default: - rtStatus = PHY_RF6052_Config_8814A(Adapter); - break; - } - - return rtStatus; -} - -//1 4. RF State setting API - -/* todo -#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) - -// -// 2009/11/03 MH add for LPS mode power save sequence. -// 2009/11/03 According to document V10. -// 2009/11/24 According to document V11. by tynli. -// -VOID -phy_SetRTL8814ERfOn( - IN PADAPTER Adapter -) -{ - rtw_write8(Adapter, REG_SPS0_CTRL_8814A, 0x2b); - - // c. For PCIE: SYS_FUNC_EN 0x02[7:0] = 0xE3 //enable BB TRX function - // For USB: SYS_FUNC_EN 0x02[7:0] = 0x17 -#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) - rtw_write8(Adapter, REG_SYS_FUNC_EN_8814A, 0xE3); -#else - rtw_write8(Adapter, REG_SYS_FUNC_EN_8814A, 0x17); -#endif - - // RF_ON_EXCEP(d~g): - // d. APSD_CTRL 0x600[7:0] = 0x00 - //rtw_write8(Adapter, REG_APSD_CTRL, 0x00); - - // e. For PCIE: SYS_FUNC_EN 0x02[7:0] = 0xE2 //reset BB TRX function again - //f. For PCIE: SYS_FUNC_EN 0x02[7:0] = 0xE3 //enable BB TRX function -#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) - rtw_write8(Adapter, REG_SYS_FUNC_EN_8814A, 0xE2); - rtw_write8(Adapter, REG_SYS_FUNC_EN_8814A, 0xE3); -#else - // e.For USB: SYS_FUNC_EN 0x02[7:0] = 0x16 - rtw_write8(Adapter, REG_SYS_FUNC_EN_8814A, 0x16); - // f. For USB: SYS_FUNC_EN 0x02[7:0] = 0x17 - rtw_write8(Adapter, REG_SYS_FUNC_EN_8814A, 0x17); -#endif - - // g. TXPAUSE 0x522[7:0] = 0x00 //enable MAC TX queue - rtw_write8(Adapter, REG_TXPAUSE_8814A, 0x00); -} // phy_SetRTL8188EERfSleep - - -BOOLEAN -phy_SetRFPowerState_8814E( - IN PADAPTER Adapter, - IN rt_rf_power_state eRFPowerState - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - BOOLEAN bResult = TRUE; - u8 i, QueueID; - PRT_POWER_SAVE_CONTROL pPSC = GET_POWER_SAVE_CONTROL(pMgntInfo); - - pHalData->SetRFPowerStateInProgress = TRUE; - - switch( eRFPowerState ) - { - // - // SW radio on/IPS site survey call will execute all flow - // HW radio on - // - case eRfOn: - { - #if(MUTUAL_AUTHENTICATION == 1) - if(pHalData->MutualAuthenticationFail) - break; - #endif - if((pHalData->eRFPowerState == eRfOff) && RT_IN_PS_LEVEL(Adapter, RT_RF_OFF_LEVL_HALT_NIC)) - { // The current RF state is OFF and the RF OFF level is halting the NIC, re-initialize the NIC. - s32 rtstatus; - u32 InitializeCount = 0; - do - { - InitializeCount++; - rtstatus = NicIFEnableNIC( Adapter ); - }while( (rtstatus != _SUCCESS) &&(InitializeCount <10) ); - RT_ASSERT(rtstatus == _SUCCESS,("Nic Initialize Fail\n")); - RT_CLEAR_PS_LEVEL(Adapter, RT_RF_OFF_LEVL_HALT_NIC); - } - else - { // This is the normal case, we just turn on the RF. - phy_SetRTL8814ERfOn(Adapter); - } - - // Turn on RF we are still linked, which might happen when - // we quickly turn off and on HW RF. 2006.05.12, by rcnjko. - if( pMgntInfo->bMediaConnect == TRUE ) - Adapter->HalFunc.LedControlHandler(Adapter, LED_CTL_LINK); - else // Turn off LED if RF is not ON. - Adapter->HalFunc.LedControlHandler(Adapter, LED_CTL_NO_LINK); - } - break; - - // Card Disable/SW radio off/HW radio off/IPS enter call - case eRfOff: - { - // Make sure BusyQueue is empty befor turn off RFE pwoer. - for(QueueID = 0, i = 0; QueueID < MAX_TX_QUEUE; ) - { - if(RTIsListEmpty(&Adapter->TcbBusyQueue[QueueID])) - { - QueueID++; - continue; - } - else if(IsLowPowerState(Adapter)) - { - RT_TRACE((COMP_POWER|COMP_RF), DBG_LOUD, - ("eRf Off/Sleep: %d times TcbBusyQueue[%d] !=0 but lower power state!\n", (i+1), QueueID)); - break; - } - else - { - RT_TRACE((COMP_POWER|COMP_RF), DBG_LOUD, - ("eRf Off/Sleep: %d times TcbBusyQueue[%d] !=0 before doze!\n", (i+1), QueueID)); - PlatformStallExecution(10); - i++; - } - - if(i >= MAX_DOZE_WAITING_TIMES_9x) - { - RT_TRACE((COMP_POWER|COMP_RF), DBG_WARNING, ("\n\n\n SetZebraRFPowerState8185B(): eRfOff: %d times TcbBusyQueue[%d] != 0 !!!\n\n\n", MAX_DOZE_WAITING_TIMES_9x, QueueID)); - break; - } - } - - if(pPSC->RegRfPsLevel & RT_RF_OFF_LEVL_HALT_NIC) - { // Disable all components. - NicIFDisableNIC(Adapter); - - if(IS_HARDWARE_TYPE_8814AE(Adapter)) - NicIFEnableInterrupt(Adapter); - RT_SET_PS_LEVEL(Adapter, RT_RF_OFF_LEVL_HALT_NIC); - } - else - { // Normal case. - //If Rf off reason is from IPS, Led should blink with no link, by Maddest 071015 - if(pMgntInfo->RfOffReason==RF_CHANGE_BY_IPS ) - Adapter->HalFunc.LedControlHandler(Adapter,LED_CTL_NO_LINK); - else // Turn off LED if RF is not ON. - Adapter->HalFunc.LedControlHandler(Adapter, LED_CTL_POWER_OFF); - } - } - break; - - default: - case eRfSleep:// Not used LPS is running on FW - bResult = FALSE; - RT_ASSERT(FALSE, ("phy_SetRFPowerState_8814E(): unknow state to set: 0x%X!!!\n", eRFPowerState)); - break; - } - - if(bResult) - { - // Update current RF state variable. - pHalData->eRFPowerState = eRFPowerState; - } - - pHalData->SetRFPowerStateInProgress = FALSE; - - return bResult; -} - -#elif (DEV_BUS_TYPE == RT_USB_INTERFACE) - -BOOLEAN -phy_SetRFPowerState_8814U( - IN PADAPTER Adapter, - IN rt_rf_power_state eRFPowerState - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - BOOLEAN bResult = TRUE; - u8 i, QueueID; - PRT_USB_DEVICE pDevice = GET_RT_USB_DEVICE(Adapter); - - if(pHalData->SetRFPowerStateInProgress == TRUE) - return FALSE; - - pHalData->SetRFPowerStateInProgress = TRUE; - RTW_DBG("======> phy_SetRFPowerState_8814U .\n"); - - switch( eRFPowerState ) - { - case eRfOn: - if((pHalData->eRFPowerState == eRfOff) && - RT_IN_PS_LEVEL(Adapter, RT_RF_OFF_LEVL_HALT_NIC)) - { // The current RF state is OFF and the RF OFF level is halting the NIC, re-initialize the NIC. - RT_TRACE(COMP_RF, DBG_LOUD, ("======> phy_SetRFPowerState_8814U-eRfOn .\n")); - - if(!Adapter->bInHctTest) - { - // 2010/09/01 MH For 92CU, we do not make sure the RF B short initialize sequence - // So disable the different RF on/off sequence for hidden AP. - NicIFEnableNIC(Adapter); - RT_CLEAR_PS_LEVEL(Adapter, RT_RF_OFF_LEVL_HALT_NIC); - } - } - break; - - // - // In current solution, RFSleep=RFOff in order to save power under 802.11 power save. - // By Bruce, 2008-01-16. - // - case eRfSleep: - { - // ToDo: - } - break; - - case eRfOff: - // HW setting had been configured. - // Both of these RF configures are the same, configuring twice may cause HW abnormal. - if(pHalData->eRFPowerState == eRfSleep || pHalData->eRFPowerState== eRfOff) - break; - rtw_write8(Adapter, 0xf015, 0x40); //page added for usb3 bus - // Make sure BusyQueue is empty befor turn off RFE pwoer. - for(QueueID = 0, i = 0; QueueID < MAX_TX_QUEUE; ) - { - if(RTIsListEmpty(&Adapter->TcbBusyQueue[QueueID])) - { - QueueID++; - continue; - } - else - { - RT_TRACE(COMP_POWER, DBG_LOUD, ("eRf Off/Sleep: %d times TcbBusyQueue[%d] !=0 before doze!\n", (i+1), QueueID)); - PlatformSleepUs(10); - i++; - } - - if(i >= MAX_DOZE_WAITING_TIMES_9x) - { - RT_TRACE(COMP_POWER, DBG_LOUD, ("\n\n\n SetZebraRFPowerState8185B(): eRfOff: %d times TcbBusyQueue[%d] != 0 !!!\n\n\n", MAX_DOZE_WAITING_TIMES_9x, QueueID)); - break; - } - } - - // - //RF Off/Sleep sequence. Designed/tested from SD4 Scott, SD1 Grent and Jonbon. - // Added by - // - //================================================================== - // CU will call card disable flow to set RF off, such that we call halt directly - // and set the PS_LEVEL to HALT_NIC or we might call halt twice in N6usbHalt in some cases. - // 2010.03.05. Added by tynli. - if(pMgntInfo->RfOffReason & RF_CHANGE_BY_IPS || - pMgntInfo->RfOffReason & RF_CHANGE_BY_HW || - pMgntInfo->RfOffReason & RF_CHANGE_BY_SW) - { //for HW/Sw radio off and IPS flow - //RT_TRACE(COMP_INIT, DBG_LOUD, ("======> CardDisableWithoutHWSM -eRfOff.\n")); - if(!Adapter->bInHctTest) - { - // 2010/09/01 MH For 92CU, we do not make sure the RF B short initialize sequence - // So disable the different RF on/off sequence for hidden AP. - NicIFDisableNIC(Adapter); - RT_SET_PS_LEVEL(Adapter, RT_RF_OFF_LEVL_HALT_NIC); - } - } - break; - - default: - bResult = FALSE; - RT_ASSERT(FALSE, ("phy_SetRFPowerState_8814U(): unknow state to set: 0x%X!!!\n", eRFPowerState)); - break; - } - - if(bResult) - { - // Update current RF state variable. - pHalData->eRFPowerState = eRFPowerState; - - switch(pHalData->rf_chip ) - { - default: - switch(pHalData->eRFPowerState) - { - case eRfOff: - // - //If Rf off reason is from IPS, Led should blink with no link, by Maddest 071015 - // - if(pMgntInfo->RfOffReason==RF_CHANGE_BY_IPS ) - Adapter->HalFunc.LedControlHandler(Adapter,LED_CTL_NO_LINK); - else // Turn off LED if RF is not ON. - Adapter->HalFunc.LedControlHandler(Adapter, LED_CTL_POWER_OFF); - break; - - case eRfOn: - // Turn on RF we are still linked, which might happen when - // we quickly turn off and on HW RF. 2006.05.12, by rcnjko. - if( pMgntInfo->bMediaConnect == TRUE ) - Adapter->HalFunc.LedControlHandler(Adapter, LED_CTL_LINK); - else // Turn off LED if RF is not ON. - Adapter->HalFunc.LedControlHandler(Adapter, LED_CTL_NO_LINK); - break; - - default: - // do nothing. - break; - }// Switch RF state - - break; - }// Switch rf_chip - } - - pHalData->SetRFPowerStateInProgress = FALSE; - RT_TRACE(COMP_INIT, DBG_LOUD, ("<====== phy_SetRFPowerState_8814U .\n")); - return bResult; -} - -#elif DEV_BUS_TYPE == RT_SDIO_INTERFACE - -BOOLEAN -phy_SetRFPowerState_8814Sdio( - IN PADAPTER Adapter, - IN rt_rf_power_state eRFPowerState - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - BOOLEAN bResult = TRUE; - u8 i, QueueID; - PRT_SDIO_DEVICE pDevice = GET_RT_SDIO_DEVICE(Adapter); - - if(pHalData->SetRFPowerStateInProgress == TRUE) - return FALSE; - - pHalData->SetRFPowerStateInProgress = TRUE; - RT_TRACE(COMP_INIT, DBG_LOUD, ("======> phy_SetRFPowerState_8814Sdio .\n")) - - switch( eRFPowerState ) - { - case eRfOn: - if((pHalData->eRFPowerState == eRfOff) && - RT_IN_PS_LEVEL(Adapter, RT_RF_OFF_LEVL_HALT_NIC)) - { // The current RF state is OFF and the RF OFF level is halting the NIC, re-initialize the NIC. - RT_TRACE(COMP_RF, DBG_LOUD, ("======> phy_SetRFPowerState_8814Sdio-eRfOn .\n")); - - if(!Adapter->bInHctTest) - { - // 2010/09/01 MH For 92CU, we do not make sure the RF B short initialize sequence - // So disable the different RF on/off sequence for hidden AP. - NicIFEnableNIC(Adapter); - RT_CLEAR_PS_LEVEL(Adapter, RT_RF_OFF_LEVL_HALT_NIC); - } - } - - // 2010/08/26 MH Prevent IQK to send out packet. - if(pHalData->bIQKInitialized ) - phy_iq_calibrate_8814a(Adapter, TRUE); - else - { - phy_iq_calibrate_8814a(Adapter,FALSE); - pHalData->bIQKInitialized = _TRUE; - } - break; - - // - // In current solution, RFSleep=RFOff in order to save power under 802.11 power save. - // By Bruce, 2008-01-16. - // - case eRfSleep: - { - // ToDo: - } - break; - - case eRfOff: - // HW setting had been configured. - // Both of these RF configures are the same, configuring twice may cause HW abnormal. - if(pHalData->eRFPowerState == eRfSleep || pHalData->eRFPowerState== eRfOff) - break; - - // Make sure BusyQueue is empty befor turn off RFE pwoer. - for(QueueID = 0, i = 0; QueueID < MAX_TX_QUEUE; ) - { - if(RTIsListEmpty(&Adapter->TcbBusyQueue[QueueID])) - { - //DbgPrint("QueueID = %d", QueueID); - QueueID++; - continue; - } - else - { - RT_TRACE(COMP_POWER, DBG_LOUD, ("eRf Off/Sleep: %d times TcbBusyQueue[%d] !=0 before doze!\n", (i+1), QueueID)); - PlatformSleepUs(10); - i++; - } - - if(i >= MAX_DOZE_WAITING_TIMES_9x) - { - RT_TRACE(COMP_POWER, DBG_LOUD, ("\n\n\n SetZebraRFPowerState8185B(): eRfOff: %d times TcbBusyQueue[%d] != 0 !!!\n\n\n", MAX_DOZE_WAITING_TIMES_9x, QueueID)); - break; - } - } - - // - //RF Off/Sleep sequence. Designed/tested from SD4 Scott, SD1 Grent and Jonbon. - // Added by - // - //================================================================== - // CU will call card disable flow to set RF off, such that we call halt directly - // and set the PS_LEVEL to HALT_NIC or we might call halt twice in N6usbHalt in some cases. - // 2010.03.05. Added by tynli. - if(pMgntInfo->RfOffReason & RF_CHANGE_BY_IPS || - pMgntInfo->RfOffReason & RF_CHANGE_BY_HW || - pMgntInfo->RfOffReason & RF_CHANGE_BY_SW) - { //for HW/Sw radio off and IPS flow - //RT_TRACE(COMP_INIT, DBG_LOUD, ("======> CardDisableWithoutHWSM -eRfOff.\n")); - if(!Adapter->bInHctTest) - { - // 2010/09/01 MH For 92CU, we do not make sure the RF B short initialize sequence - // So disable the different RF on/off sequence for hidden AP. - NicIFDisableNIC(Adapter); - - RT_SET_PS_LEVEL(Adapter, RT_RF_OFF_LEVL_HALT_NIC); - } - } - break; - - default: - bResult = FALSE; - RT_ASSERT(FALSE, ("phy_SetRFPowerState_8814Sdio(): unknow state to set: 0x%X!!!\n", eRFPowerState)); - break; - } - - if(bResult) - { - // Update current RF state variable. - pHalData->eRFPowerState = eRFPowerState; - - switch(pHalData->rf_chip ) - { - default: - switch(pHalData->eRFPowerState) - { - case eRfOff: - // - //If Rf off reason is from IPS, Led should blink with no link, by Maddest 071015 - // - if(pMgntInfo->RfOffReason==RF_CHANGE_BY_IPS ) - Adapter->HalFunc.LedControlHandler(Adapter,LED_CTL_NO_LINK); - else // Turn off LED if RF is not ON. - Adapter->HalFunc.LedControlHandler(Adapter, LED_CTL_POWER_OFF); - break; - - case eRfOn: - // Turn on RF we are still linked, which might happen when - // we quickly turn off and on HW RF. 2006.05.12, by rcnjko. - if( pMgntInfo->bMediaConnect == TRUE ) - Adapter->HalFunc.LedControlHandler(Adapter, LED_CTL_LINK); - else // Turn off LED if RF is not ON. - Adapter->HalFunc.LedControlHandler(Adapter, LED_CTL_NO_LINK); - break; - - default: - // do nothing. - break; - }// Switch RF state - - break; - }// Switch rf_chip - } - - pHalData->SetRFPowerStateInProgress = FALSE; - - return bResult; -} - -#endif - - - -BOOLEAN -PHY_SetRFPowerState8814A( - IN PADAPTER Adapter, - IN rt_rf_power_state eRFPowerState - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - BOOLEAN bResult = FALSE; - - RT_TRACE(COMP_RF, DBG_LOUD, ("---------> PHY_SetRFPowerState8814(): eRFPowerState(%d)\n", eRFPowerState)); - if(eRFPowerState == pHalData->eRFPowerState) - { - RT_TRACE(COMP_RF, DBG_LOUD, ("<--------- PHY_SetRFPowerState8814(): discard the request for eRFPowerState(%d) is the same.\n", eRFPowerState)); - return bResult; - } -#if (DEV_BUS_TYPE == RT_PCI_INTERFACE) - bResult = phy_SetRFPowerState_8814E(Adapter, eRFPowerState); -#elif (DEV_BUS_TYPE == RT_USB_INTERFACE) - bResult = phy_SetRFPowerState_8814U(Adapter, eRFPowerState); -#elif (DEV_BUS_TYPE == RT_SDIO_INTERFACE) - bResult = phy_SetRFPowerState_8814Sdio(Adapter, eRFPowerState); -#endif - - RT_TRACE(COMP_RF, DBG_LOUD, ("<--------- PHY_SetRFPowerState8814(): bResult(%d)\n", bResult)); - - return bResult; -} -todo */ -//1 5. Tx Power setting API - -VOID -phy_TxPwrAdjInPercentage( - IN PADAPTER Adapter, - OUT u8* pTxPwrIdx) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - int txPower = *pTxPwrIdx + pHalData->CurrentTxPwrIdx - 18; - - *pTxPwrIdx = txPower > RF6052_MAX_TX_PWR ? RF6052_MAX_TX_PWR : txPower; -} - -VOID -PHY_GetTxPowerLevel8814( - IN PADAPTER Adapter, - OUT s32* powerlevel - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - *powerlevel = pHalData->CurrentTxPwrIdx; -#if 0 - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - s4Byte TxPwrDbm = 13; - - if ( pMgntInfo->ClientConfigPwrInDbm != UNSPECIFIED_PWR_DBM ) - *powerlevel = pMgntInfo->ClientConfigPwrInDbm; - else - *powerlevel = TxPwrDbm; -#endif //0 -/* - //PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.mpt_ctx); - //u8 mgn_rate = mpt_to_mgnt_rate(HwRateToMPTRate(Adapter->mppriv.rateidx)); - *powerlevel=PHY_GetTxPowerIndex8814A(Adapter,RF_PATH_A ,MGN_MCS7, pHalData->current_channel_bw, pHalData->current_channel, NULL); - *powerlevel/=2; -*/ -} - -VOID -PHY_SetTxPowerLevel8814( - IN PADAPTER Adapter, - IN u8 Channel - ) -{ - u32 i, j, k = 0; - u32 value[264]={0}; - u32 path = 0, PowerIndex, txagc_table_wd = 0x00801000; - - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - u8 jaguar2Rates[][4] = { {MGN_1M, MGN_2M, MGN_5_5M, MGN_11M}, - {MGN_6M, MGN_9M, MGN_12M, MGN_18M}, - {MGN_24M, MGN_36M, MGN_48M, MGN_54M}, - {MGN_MCS0, MGN_MCS1, MGN_MCS2, MGN_MCS3}, - {MGN_MCS4, MGN_MCS5, MGN_MCS6, MGN_MCS7}, - {MGN_MCS8, MGN_MCS9, MGN_MCS10, MGN_MCS11}, - {MGN_MCS12, MGN_MCS13, MGN_MCS14, MGN_MCS15}, - {MGN_MCS16, MGN_MCS17, MGN_MCS18, MGN_MCS19}, - {MGN_MCS20, MGN_MCS21, MGN_MCS22, MGN_MCS23}, - {MGN_VHT1SS_MCS0, MGN_VHT1SS_MCS1, MGN_VHT1SS_MCS2, MGN_VHT1SS_MCS3}, - {MGN_VHT1SS_MCS4, MGN_VHT1SS_MCS5, MGN_VHT1SS_MCS6, MGN_VHT1SS_MCS7}, - {MGN_VHT2SS_MCS8, MGN_VHT2SS_MCS9, MGN_VHT2SS_MCS0, MGN_VHT2SS_MCS1}, - {MGN_VHT2SS_MCS2, MGN_VHT2SS_MCS3, MGN_VHT2SS_MCS4, MGN_VHT2SS_MCS5}, - {MGN_VHT2SS_MCS6, MGN_VHT2SS_MCS7, MGN_VHT2SS_MCS8, MGN_VHT2SS_MCS9}, - {MGN_VHT3SS_MCS0, MGN_VHT3SS_MCS1, MGN_VHT3SS_MCS2, MGN_VHT3SS_MCS3}, - {MGN_VHT3SS_MCS4, MGN_VHT3SS_MCS5, MGN_VHT3SS_MCS6, MGN_VHT3SS_MCS7}, - {MGN_VHT3SS_MCS8, MGN_VHT3SS_MCS9, 0, 0}}; - - - for( path = RF_PATH_A; path <= RF_PATH_D; ++path ) - { - phy_set_tx_power_level_by_path(Adapter, Channel, (u8)path); - } -#if 0 //todo H2C_TXPOWER_INDEX_OFFLOAD ? - if(Adapter->MgntInfo.bScanInProgress == FALSE && pHalData->RegFWOffload == 2) - { - HalDownloadTxPowerLevel8814(Adapter, value); - } -#endif //0 -} - -/************************************************************************************************************** - * Description: - * The low-level interface to get the FINAL Tx Power Index , called by both MP and Normal Driver. - * - * <20120830, Kordan> - **************************************************************************************************************/ -u8 -PHY_GetTxPowerIndex8814A( - IN PADAPTER pAdapter, - IN enum rf_path RFPath, - IN u8 Rate, - IN u8 BandWidth, - IN u8 Channel, - struct txpwr_idx_comp *tic - ) -{ - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter); - struct hal_spec_t *hal_spec = GET_HAL_SPEC(pAdapter); - s8 powerDiffByRate = 0; - s8 txPower = 0, limit = 0; - u8 ntx_idx = MgntQuery_NssTxRate(Rate ); - BOOLEAN bIn24G = FALSE; - s8 tpt_offset = 0; - - /* RTW_INFO( "===>%s\n", __FUNCTION__ ); */ - if(pAdapter->mppriv.bSetTxPower) - { - PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.mpt_ctx); - txPower = pMptCtx->TxPwrLevel[RFPath]; - } - else - { - txPower = (s8) PHY_GetTxPowerIndexBase( pAdapter, RFPath, Rate, ntx_idx, BandWidth, Channel, &bIn24G ); - - powerDiffByRate = PHY_GetTxPowerByRate( pAdapter, (u8)(!bIn24G), RFPath, Rate ); - - limit = PHY_GetTxPowerLimit( pAdapter, NULL, (u8)(!bIn24G), pHalData->current_channel_bw, RFPath, Rate,ntx_idx, pHalData->current_channel); - tpt_offset = PHY_GetTxPowerTrackingOffset(pAdapter, RFPath, Rate); - - powerDiffByRate = powerDiffByRate > limit ? limit : powerDiffByRate; - /*RTW_INFO("Rate-0x%x: (TxPower, PowerDiffByRate Path-%c) = (0x%X, %d)\n", Rate, ((RFPath==0)?'A':(RFPath==1)?'B':(RFPath==2)?'C':'D'), txPower, powerDiffByRate);*/ - - txPower += powerDiffByRate; - - //txPower += PHY_GetTxPowerTrackingOffset( pAdapter, RFPath, Rate ); - #if 0 //todo ? - #if CCX_SUPPORT - CCX_CellPowerLimit( pAdapter, Channel, Rate, &txPower ); - #endif - #endif - phy_TxPwrAdjInPercentage(pAdapter, (u8 *)&txPower); - } - if (tic) { - tic->ntx_idx = ntx_idx; - tic->base = txPower; - tic->by_rate = powerDiffByRate; - tic->limit = limit; - tic->tpt = tpt_offset; - tic->ebias = 0; - } - - if(txPower > hal_spec->txgi_max) - txPower = hal_spec->txgi_max; - - //if (Adapter->registrypriv.mp_mode==0 && - //(pHalData->bautoload_fail_flag || pHalData->EfuseMap[EFUSE_INIT_MAP][EEPROM_TX_PWR_INX_JAGUAR] == 0xFF)) - //txPower = 0x12; - - /*RTW_INFO("Final Tx Power(RF-%c, Channel: %d) = %d(0x%X)\n", ((RFPath==0)?'A':(RFPath==1)?'B':(RFPath==2)?'C':'D'), Channel, - txPower, txPower);*/ - - return (u8) txPower; -} - - -VOID -PHY_SetTxPowerIndex_8814A( - IN PADAPTER Adapter, - IN u32 PowerIndex, - IN enum rf_path RFPath, - IN u8 Rate - ) -{ - u32 txagc_table_wd = 0x00801000; - - txagc_table_wd |= (RFPath << 8) | MRateToHwRate(Rate) | (PowerIndex << 24); - phy_set_bb_reg(Adapter, 0x1998, bMaskDWord, txagc_table_wd); - /* RTW_INFO("txagc_table_wd %x\n", txagc_table_wd); */ - if (Rate == MGN_1M) { - phy_set_bb_reg(Adapter, 0x1998, bMaskDWord, txagc_table_wd); /* first time to turn on the txagc table */ - /* second to write the addr0 */ - } -} - - -BOOLEAN -PHY_UpdateTxPowerDbm8814A( - IN PADAPTER Adapter, - IN s4Byte powerInDbm - ) -{ - return TRUE; -} - - -u32 -PHY_GetTxBBSwing_8814A( - IN PADAPTER Adapter, - IN BAND_TYPE Band, - IN enum rf_path RFPath - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(GetDefaultAdapter(Adapter)); - struct dm_struct * pDM_Odm = &pHalData->odmpriv; - struct dm_rf_calibration_struct * pRFCalibrateInfo = &(pDM_Odm->rf_calibrate_info); - s8 bbSwing_2G = -1 * GetRegTxBBSwing_2G(Adapter); - s8 bbSwing_5G = -1 * GetRegTxBBSwing_5G(Adapter); - u32 out = 0x200; - const s8 AUTO = -1; - - RTW_DBG("===> PHY_GetTxBBSwing_8814A, bbSwing_2G: %d, bbSwing_5G: %d\n", - (s4Byte)bbSwing_2G, (s4Byte)bbSwing_5G); - - if ( pHalData->bautoload_fail_flag ) - { - if ( Band == BAND_ON_2_4G ) - { - pRFCalibrateInfo->bb_swing_diff_2g = bbSwing_2G; - if (bbSwing_2G == 0) out = 0x200; // 0 dB - else if (bbSwing_2G == -3) out = 0x16A; // -3 dB - else if (bbSwing_2G == -6) out = 0x101; // -6 dB - else if (bbSwing_2G == -9) out = 0x0B6; // -9 dB - else - { - if ( pHalData->ExternalPA_2G ) - { - pRFCalibrateInfo->bb_swing_diff_2g = -3; - out = 0x16A; - } - else - { - pRFCalibrateInfo->bb_swing_diff_2g = 0; - out = 0x200; - } - } - } - else if ( Band == BAND_ON_5G ) - { - pRFCalibrateInfo->bb_swing_diff_5g = bbSwing_5G; - if(bbSwing_5G == 0) out = 0x200; // 0 dB - else if (bbSwing_5G == -3) out = 0x16A; // -3 dB - else if (bbSwing_5G == -6) out = 0x101; // -6 dB - else if (bbSwing_5G == -9) out = 0x0B6; // -9 dB - else - { - if (pHalData->external_pa_5g) - { - pRFCalibrateInfo->bb_swing_diff_5g = -3; - out = 0x16A; - } - else - { - pRFCalibrateInfo->bb_swing_diff_5g = 0; - out = 0x200; - } - } - } - else - { - pRFCalibrateInfo->bb_swing_diff_2g = -3; - pRFCalibrateInfo->bb_swing_diff_5g = -3; - out = 0x16A; // -3 dB - } - } - else - { - u32 swing = 0, onePathSwing = 0; - - if (Band == BAND_ON_2_4G) - { - if (GetRegTxBBSwing_2G(Adapter) == AUTO) - { - EFUSE_ShadowRead(Adapter, 1, EEPROM_TX_BBSWING_2G_8814, (u32 *)&swing); - if (swing == 0xFF) - { - if(bbSwing_2G == 0) swing = 0x00; // 0 dB - else if (bbSwing_2G == -3) swing = 0x55; // -3 dB - else if (bbSwing_2G == -6) swing = 0xAA; // -6 dB - else if (bbSwing_2G == -9) swing = 0xFF; // -9 dB - else swing = 0x00; - } - } - else if (bbSwing_2G == 0) swing = 0x00; // 0 dB - else if (bbSwing_2G == -3) swing = 0x55; // -3 dB - else if (bbSwing_2G == -6) swing = 0xAA; // -6 dB - else if (bbSwing_2G == -9) swing = 0xFF; // -9 dB - else swing = 0x00; - } - else - { - if (GetRegTxBBSwing_5G(Adapter) == AUTO) - { - EFUSE_ShadowRead(Adapter, 1, EEPROM_TX_BBSWING_5G_8814, (u32 *)&swing); - if (swing == 0xFF) - { - if(bbSwing_5G == 0) swing = 0x00; // 0 dB - else if (bbSwing_5G == -3) swing = 0x55; // -3 dB - else if (bbSwing_5G == -6) swing = 0xAA; // -6 dB - else if (bbSwing_5G == -9) swing = 0xFF; // -9 dB - else swing = 0x00; - } - } - else if (bbSwing_5G == 0) swing = 0x00; // 0 dB - else if (bbSwing_5G == -3) swing = 0x55; // -3 dB - else if (bbSwing_5G == -6) swing = 0xAA; // -6 dB - else if (bbSwing_5G == -9) swing = 0xFF; // -9 dB - else swing = 0x00; - } - - if (RFPath == RF_PATH_A) - onePathSwing = (swing & 0x3) >> 0; // 0xC6/C7[1:0] - else if(RFPath == RF_PATH_B) - onePathSwing = (swing & 0xC) >> 2; // 0xC6/C7[3:2] - else if(RFPath == RF_PATH_C) - onePathSwing = (swing & 0x30) >> 4; // 0xC6/C7[5:4] - else if(RFPath == RF_PATH_D) - onePathSwing = (swing & 0xC0) >> 6; // 0xC6/C7[7:6] - - if (onePathSwing == 0x0) - { - if (Band == BAND_ON_2_4G) - pRFCalibrateInfo->bb_swing_diff_2g = 0; - else - pRFCalibrateInfo->bb_swing_diff_5g = 0; - out = 0x200; // 0 dB - } - else if (onePathSwing == 0x1) - { - if (Band == BAND_ON_2_4G) - pRFCalibrateInfo->bb_swing_diff_2g = -3; - else - pRFCalibrateInfo->bb_swing_diff_5g = -3; - out = 0x16A; // -3 dB - } - else if (onePathSwing == 0x2) - { - if (Band == BAND_ON_2_4G) - pRFCalibrateInfo->bb_swing_diff_2g = -6; - else - pRFCalibrateInfo->bb_swing_diff_5g = -6; - out = 0x101; // -6 dB - } - else if (onePathSwing == 0x3) - { - if (Band == BAND_ON_2_4G) - pRFCalibrateInfo->bb_swing_diff_2g = -9; - else - pRFCalibrateInfo->bb_swing_diff_5g = -9; - out = 0x0B6; // -9 dB - } - } - RTW_DBG("<=== PHY_GetTxBBSwing_8814A, out = 0x%X\n", out); - return out; -} - - -//1 7. BandWidth setting API - -VOID -phy_SetBwRegAdc_8814A( - IN PADAPTER Adapter, - IN u8 Band, - IN enum channel_width CurrentBW -) -{ - switch(CurrentBW) - { - case CHANNEL_WIDTH_20: - if(Band == BAND_ON_5G) - { - phy_set_bb_reg(Adapter, rRFMOD_Jaguar, BIT(1)|BIT(0), 0x0); // 0x8ac[28, 21,20,16, 9:6,1,0]=10'b10_0011_0000 - } - else - { - phy_set_bb_reg(Adapter, rRFMOD_Jaguar, BIT(1)|BIT(0), 0x0); // 0x8ac[28, 21,20,16, 9:6,1,0]=10'b10_0101_0000 - } - break; - - case CHANNEL_WIDTH_40: - if(Band == BAND_ON_5G) - { - phy_set_bb_reg(Adapter, rRFMOD_Jaguar, BIT(1)|BIT(0), 0x1); // 0x8ac[17, 11, 10, 7:6,1,0]=7'b100_0001 - } - else - { - phy_set_bb_reg(Adapter, rRFMOD_Jaguar, BIT(1)|BIT(0), 0x1); // 0x8ac[17, 11, 10, 7:6,1,0]=7'b101_0001 - } - break; - - case CHANNEL_WIDTH_80: - phy_set_bb_reg(Adapter, rRFMOD_Jaguar, BIT(1)|BIT(0), 0x02); // 0x8ac[7:6,1,0]=4'b0010 - break; - - default: - RT_DISP(FPHY, PHY_BBW, ("phy_SetBwRegAdc_8814A(): unknown Bandwidth: %#X\n",CurrentBW)); - break; - } -} - - -VOID -phy_SetBwRegAgc_8814A( - IN PADAPTER Adapter, - IN u8 Band, - IN enum channel_width CurrentBW -) -{ - u32 AgcValue = 7; - switch(CurrentBW) - { - case CHANNEL_WIDTH_20: - if(Band == BAND_ON_5G) - AgcValue = 6; - else - AgcValue = 6; - break; - - case CHANNEL_WIDTH_40: - if(Band == BAND_ON_5G) - AgcValue = 8; - else - AgcValue = 7; - break; - - case CHANNEL_WIDTH_80: - AgcValue = 3; - break; - - default: - RT_DISP(FPHY, PHY_BBW, ("phy_SetBwRegAgc_8814A(): unknown Bandwidth: %#X\n",CurrentBW)); - break; - } - - phy_set_bb_reg(Adapter, rAGC_table_Jaguar, 0xf000, AgcValue); // 0x82C[15:12] = AgcValue -} - - -BOOLEAN -phy_SwBand8814A( - IN PADAPTER pAdapter, - IN u8 channelToSW) -{ - u8 u1Btmp; - BOOLEAN ret_value = _TRUE; - u8 Band = BAND_ON_5G, BandToSW; - - u1Btmp = rtw_read8(pAdapter, REG_CCK_CHECK_8814A); - if(u1Btmp & BIT7) - Band = BAND_ON_5G; - else - Band = BAND_ON_2_4G; - - // Use current channel to judge Band Type and switch Band if need. - if(channelToSW > 14) - { - BandToSW = BAND_ON_5G; - } - else - { - BandToSW = BAND_ON_2_4G; - } - - if(BandToSW != Band) - { - PHY_SwitchWirelessBand8814A(pAdapter,BandToSW); - } - - return ret_value; -} - - -VOID -PHY_SetRFEReg8814A( - IN PADAPTER Adapter, - IN BOOLEAN bInit, - IN u8 Band -) -{ - u8 u1tmp = 0; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - if(bInit) - { - switch(pHalData->rfe_type){ - case 2:case 1: - phy_set_bb_reg(Adapter, 0x1994, 0xf, 0xf); // 0x1994[3:0] = 0xf - u1tmp = PlatformEFIORead1Byte(Adapter, REG_GPIO_IO_SEL_8814A); - rtw_write8(Adapter, REG_GPIO_IO_SEL_8814A, u1tmp | 0xf0); // 0x40[23:20] = 0xf - break; - case 0: - phy_set_bb_reg(Adapter, 0x1994, 0xf, 0xf); // 0x1994[3:0] = 0xf - u1tmp = PlatformEFIORead1Byte(Adapter, REG_GPIO_IO_SEL_8814A); - rtw_write8(Adapter, REG_GPIO_IO_SEL_8814A, u1tmp | 0xc0); // 0x40[23:22] = 2b'11 - break; - } - } - else if(Band == BAND_ON_2_4G) - { - switch(pHalData->rfe_type){ - case 2: - phy_set_bb_reg(Adapter, rA_RFE_Pinmux_Jaguar, bMaskDWord, 0x72707270); // 0xCB0 = 0x72707270 - phy_set_bb_reg(Adapter, rB_RFE_Pinmux_Jaguar, bMaskDWord, 0x72707270); // 0xEB0 = 0x72707270 - phy_set_bb_reg(Adapter, rC_RFE_Pinmux_Jaguar, bMaskDWord, 0x72707270); // 0x18B4 = 0x72707270 - phy_set_bb_reg(Adapter, rD_RFE_Pinmux_Jaguar, bMaskDWord, 0x77707770); // 0x1AB4 = 0x77707770 - phy_set_bb_reg(Adapter, 0x1ABC, 0x0ff00000, 0x72); // 0x1ABC[27:20] = 0x72 - break; - - case 1: - phy_set_bb_reg(Adapter, rA_RFE_Pinmux_Jaguar, bMaskDWord, 0x77777777); // 0xCB0 = 0x77777777 - phy_set_bb_reg(Adapter, rB_RFE_Pinmux_Jaguar, bMaskDWord, 0x77777777); // 0xEB0 = 0x77777777 - phy_set_bb_reg(Adapter, rC_RFE_Pinmux_Jaguar, bMaskDWord, 0x77777777); // 0x18B4 = 0x77777777 - phy_set_bb_reg(Adapter, rD_RFE_Pinmux_Jaguar, bMaskDWord, 0x77777777); // 0x1AB4 = 0x77777777 - phy_set_bb_reg(Adapter, 0x1ABC, 0x0ff00000, 0x77); // 0x1ABC[27:20] = 0x77 - break; - - case 0: - default: - phy_set_bb_reg(Adapter, rA_RFE_Pinmux_Jaguar, bMaskDWord, 0x77777777); // 0xCB0 = 0x77777777 - phy_set_bb_reg(Adapter, rB_RFE_Pinmux_Jaguar, bMaskDWord, 0x77777777); // 0xEB0 = 0x77777777 - phy_set_bb_reg(Adapter, rC_RFE_Pinmux_Jaguar, bMaskDWord, 0x77777777); // 0x18B4 = 0x77777777 - phy_set_bb_reg(Adapter, 0x1ABC, 0x0ff00000, 0x77); // 0x1ABC[27:20] = 0x77 - break; - - } - } - else - { - switch(pHalData->rfe_type){ - case 2: - phy_set_bb_reg(Adapter, rA_RFE_Pinmux_Jaguar, bMaskDWord, 0x33173717); // 0xCB0 = 0x33173717 - phy_set_bb_reg(Adapter, rB_RFE_Pinmux_Jaguar, bMaskDWord, 0x33173717); // 0xEB0 = 0x33173717 - phy_set_bb_reg(Adapter, rC_RFE_Pinmux_Jaguar, bMaskDWord, 0x33173717); // 0x18B4 = 0x33173717 - phy_set_bb_reg(Adapter, rD_RFE_Pinmux_Jaguar, bMaskDWord, 0x77177717); // 0x1AB4 = 0x77177717 - phy_set_bb_reg(Adapter, 0x1ABC, 0x0ff00000, 0x37); // 0x1ABC[27:20] = 0x37 - break; - - case 1: - phy_set_bb_reg(Adapter, rA_RFE_Pinmux_Jaguar, bMaskDWord, 0x33173317); // 0xCB0 = 0x33173317 - phy_set_bb_reg(Adapter, rB_RFE_Pinmux_Jaguar, bMaskDWord, 0x33173317); // 0xEB0 = 0x33173317 - phy_set_bb_reg(Adapter, rC_RFE_Pinmux_Jaguar, bMaskDWord, 0x33173317); // 0x18B4 = 0x33173317 - phy_set_bb_reg(Adapter, rD_RFE_Pinmux_Jaguar, bMaskDWord, 0x77177717); // 0x1AB4 = 0x77177717 - phy_set_bb_reg(Adapter, 0x1ABC, 0x0ff00000, 0x33); // 0x1ABC[27:20] = 0x33 - break; - - case 0: - default: - phy_set_bb_reg(Adapter, rA_RFE_Pinmux_Jaguar, bMaskDWord, 0x54775477); // 0xCB0 = 0x54775477 - phy_set_bb_reg(Adapter, rB_RFE_Pinmux_Jaguar, bMaskDWord, 0x54775477); // 0xEB0 = 0x54775477 - phy_set_bb_reg(Adapter, rC_RFE_Pinmux_Jaguar, bMaskDWord, 0x54775477); // 0x18B4 = 0x54775477 - phy_set_bb_reg(Adapter, rD_RFE_Pinmux_Jaguar, bMaskDWord, 0x54775477); // 0x1AB4 = 0x54775477 - phy_set_bb_reg(Adapter, 0x1ABC, 0x0ff00000, 0x54); // 0x1ABC[27:20] = 0x54 - break; - } - } -} - -VOID -phy_SetBBSwingByBand_8814A( - IN PADAPTER Adapter, - IN u8 Band, - IN u8 PreviousBand - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - s8 BBDiffBetweenBand = 0; - struct dm_struct * pDM_Odm = &pHalData->odmpriv; - struct dm_rf_calibration_struct * pRFCalibrateInfo = &(pDM_Odm->rf_calibrate_info); - - phy_set_bb_reg(Adapter, rA_TxScale_Jaguar, 0xFFE00000, - PHY_GetTxBBSwing_8814A(Adapter, (BAND_TYPE)Band, RF_PATH_A)); // 0xC1C[31:21] - phy_set_bb_reg(Adapter, rB_TxScale_Jaguar, 0xFFE00000, - PHY_GetTxBBSwing_8814A(Adapter, (BAND_TYPE)Band, RF_PATH_B)); // 0xE1C[31:21] - phy_set_bb_reg(Adapter, rC_TxScale_Jaguar2, 0xFFE00000, - PHY_GetTxBBSwing_8814A(Adapter, (BAND_TYPE)Band, RF_PATH_C)); // 0x181C[31:21] - phy_set_bb_reg(Adapter, rD_TxScale_Jaguar2, 0xFFE00000, - PHY_GetTxBBSwing_8814A(Adapter, (BAND_TYPE)Band, RF_PATH_D)); // 0x1A1C[31:21] - - // <20121005, Kordan> When TxPowerTrack is ON, we should take care of the change of BB swing. - // That is, reset all info to trigger Tx power tracking. - - if (Band != PreviousBand) - { - BBDiffBetweenBand = (pRFCalibrateInfo->bb_swing_diff_2g - pRFCalibrateInfo->bb_swing_diff_5g); - BBDiffBetweenBand = (Band == BAND_ON_2_4G) ? BBDiffBetweenBand : (-1 * BBDiffBetweenBand); - pRFCalibrateInfo->default_ofdm_index += BBDiffBetweenBand*2; - } - - odm_clear_txpowertracking_state(pDM_Odm); -} - - -s32 -PHY_SwitchWirelessBand8814A( - IN PADAPTER Adapter, - IN u8 Band -) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 PreBand = pHalData->current_band_type, tepReg = 0; - - RTW_INFO("==>PHY_SwitchWirelessBand8814() %s\n", ((Band==0)?"2.4G":"5G")); - - pHalData->current_band_type =(BAND_TYPE)Band; - - /*clear 0x1000[16], When this bit is set to 0, CCK and OFDM are disabled, and clock are gated. Otherwise, CCK and OFDM are enabled. */ - tepReg = rtw_read8(Adapter, REG_SYS_CFG3_8814A+2); - rtw_write8(Adapter, REG_SYS_CFG3_8814A+2, tepReg & (~BIT0)); - - // STOP Tx/Rx - //phy_set_bb_reg(Adapter, rOFDMCCKEN_Jaguar, bOFDMEN_Jaguar|bCCKEN_Jaguar, 0x00); - - if(Band == BAND_ON_2_4G) - {// 2.4G band - - // AGC table select - phy_set_bb_reg(Adapter, rAGC_table_Jaguar2, 0x1F, 0); // 0x958[4:0] = 5b'00000 - - PHY_SetRFEReg8814A(Adapter, FALSE, Band); - - // cck_enable - //phy_set_bb_reg(Adapter, rOFDMCCKEN_Jaguar, bOFDMEN_Jaguar|bCCKEN_Jaguar, 0x3); - - if(Adapter->registrypriv.mp_mode == 0) - { - // 0x80C & 0xa04 should use same antenna. - phy_set_bb_reg(Adapter, rTxPath_Jaguar, 0xf0, 0x2); - phy_set_bb_reg(Adapter, rCCK_RX_Jaguar, 0x0f000000, 0x5); - } - - phy_set_bb_reg(Adapter, rOFDMCCKEN_Jaguar, bOFDMEN_Jaguar|bCCKEN_Jaguar, 0x3); - - - // CCK_CHECK_en - rtw_write8(Adapter, REG_CCK_CHECK_8814A, 0x0); - /* after 5G swicth 2G , set A82[2] = 0 */ - phy_set_bb_reg(Adapter, 0xa80, BIT18, 0x0); - - } - else //5G band - { - // CCK_CHECK_en - rtw_write8(Adapter, REG_CCK_CHECK_8814A, 0x80); - /* Enable CCK Tx function, even when CCK is off */ - phy_set_bb_reg(Adapter, 0xa80, BIT18, 0x1); - - // AGC table select - // Postpone to channel switch - //phy_set_bb_reg(Adapter, rAGC_table_Jaguar2, 0x1F, 1); // 0x958[4:0] = 5b'00001 - - PHY_SetRFEReg8814A(Adapter, FALSE, Band); - - if(Adapter->registrypriv.mp_mode == 0) - { - phy_set_bb_reg(Adapter, rTxPath_Jaguar, 0xf0, 0x0); - phy_set_bb_reg(Adapter, rCCK_RX_Jaguar, 0x0f000000, 0xF); - } - - phy_set_bb_reg(Adapter, rOFDMCCKEN_Jaguar, bOFDMEN_Jaguar|bCCKEN_Jaguar, 0x02); - //RTW_INFO("==>PHY_SwitchWirelessBand8814() BAND_ON_5G settings OFDM index 0x%x\n", pHalData->OFDM_index[0]); - } - - phy_SetBBSwingByBand_8814A(Adapter, Band, PreBand); - phy_SetBwRegAdc_8814A(Adapter, Band, pHalData->current_channel_bw); - phy_SetBwRegAgc_8814A(Adapter, Band, pHalData->current_channel_bw); - /* set 0x1000[16], When this bit is set to 0, CCK and OFDM are disabled, and clock are gated. Otherwise, CCK and OFDM are enabled.*/ - tepReg = rtw_read8(Adapter, REG_SYS_CFG3_8814A+2); - rtw_write8(Adapter, REG_SYS_CFG3_8814A+2, tepReg | BIT0); - - RTW_INFO("<==PHY_SwitchWirelessBand8814():Switch Band OK.\n"); - return _SUCCESS; -} - - -u8 -phy_GetSecondaryChnl_8814A( - IN PADAPTER Adapter -) -{ - u8 SCSettingOf40 = 0, SCSettingOf20 = 0; - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - - //RTW_INFO("SCMapping: Case: pHalData->current_channel_bw %d, pHalData->nCur80MhzPrimeSC %d, pHalData->nCur40MhzPrimeSC %d \n",pHalData->current_channel_bw,pHalData->nCur80MhzPrimeSC,pHalData->nCur40MhzPrimeSC); - if(pHalData->current_channel_bw== CHANNEL_WIDTH_80) - { - if(pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) - SCSettingOf40 = VHT_DATA_SC_40_LOWER_OF_80MHZ; - else if(pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) - SCSettingOf40 = VHT_DATA_SC_40_UPPER_OF_80MHZ; - else - RTW_INFO("SCMapping: DONOT CARE Mode Setting\n"); - - if((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER)) - SCSettingOf20 = VHT_DATA_SC_20_LOWEST_OF_80MHZ; - else if((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER)) - SCSettingOf20 = VHT_DATA_SC_20_LOWER_OF_80MHZ; - else if((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER)) - SCSettingOf20 = VHT_DATA_SC_20_UPPER_OF_80MHZ; - else if((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER)) - SCSettingOf20 = VHT_DATA_SC_20_UPPERST_OF_80MHZ; - else - { - if(pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) - SCSettingOf20 = VHT_DATA_SC_40_LOWER_OF_80MHZ; - else if(pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) - SCSettingOf20 = VHT_DATA_SC_40_UPPER_OF_80MHZ; - else - RTW_INFO("SCMapping: DONOT CARE Mode Setting\n"); - } - } - else if(pHalData->current_channel_bw == CHANNEL_WIDTH_40) - { - RTW_INFO("SCMapping: pHalData->current_channel_bw %d, pHalData->nCur40MhzPrimeSC %d \n",pHalData->current_channel_bw,pHalData->nCur40MhzPrimeSC); - - if(pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) - SCSettingOf20 = VHT_DATA_SC_20_UPPER_OF_80MHZ; - else if(pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) - SCSettingOf20 = VHT_DATA_SC_20_LOWER_OF_80MHZ; - else - RTW_INFO("SCMapping: DONOT CARE Mode Setting\n"); - } - - /*RTW_INFO("SCMapping: SC Value %x\n", ((SCSettingOf40 << 4) | SCSettingOf20));*/ - return ( (SCSettingOf40 << 4) | SCSettingOf20); -} - - -VOID -phy_SetBwRegMac_8814A( - IN PADAPTER Adapter, - enum channel_width CurrentBW -) -{ - u16 RegRfMod_BW, u2tmp = 0; - RegRfMod_BW = PlatformEFIORead2Byte(Adapter, REG_TRXPTCL_CTL_8814A); - - switch(CurrentBW) - { - case CHANNEL_WIDTH_20: - PlatformEFIOWrite2Byte(Adapter, REG_TRXPTCL_CTL_8814A, (RegRfMod_BW & 0xFE7F)); // BIT 7 = 0, BIT 8 = 0 - break; - - case CHANNEL_WIDTH_40: - u2tmp = RegRfMod_BW | BIT7; - PlatformEFIOWrite2Byte(Adapter, REG_TRXPTCL_CTL_8814A, (u2tmp & 0xFEFF)); // BIT 7 = 1, BIT 8 = 0 - break; - - case CHANNEL_WIDTH_80: - u2tmp = RegRfMod_BW | BIT8; - PlatformEFIOWrite2Byte(Adapter, REG_TRXPTCL_CTL_8814A, (u2tmp & 0xFF7F)); // BIT 7 = 0, BIT 8 = 1 - break; - - default: - RT_DISP(FPHY, PHY_BBW, ("phy_SetBwRegMac_8814A(): unknown Bandwidth: %#X\n",CurrentBW)); - break; - } -} - -void PHY_Set_SecCCATH_by_RXANT_8814A(PADAPTER pAdapter,u4Byte ulAntennaRx) -{ - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter); - - if ((pHalData->bSWToBW40M == TRUE) && (pHalData->current_channel_bw != CHANNEL_WIDTH_40)) { - phy_set_bb_reg(pAdapter, rPwed_TH_Jaguar, 0x007c0000,pHalData->BackUp_BB_REG_4_2nd_CCA[0]); - phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x0000ff00,pHalData->BackUp_BB_REG_4_2nd_CCA[1]); - phy_set_bb_reg(pAdapter, r_L1_SBD_start_time, 0x0f000000,pHalData->BackUp_BB_REG_4_2nd_CCA[2]); - pHalData->bSWToBW40M = FALSE; - } - - if ((pHalData->bSWToBW80M == TRUE) && (pHalData->current_channel_bw != CHANNEL_WIDTH_80)) { - phy_set_bb_reg(pAdapter, r_L1_SBD_start_time, 0x0f000000, pHalData->BackUp_BB_REG_4_2nd_CCA[2]); - pHalData->bSWToBW80M = FALSE; - } - - /*1 Setting CCA TH 2nd CCA parameter by Rx Antenna*/ - if (pHalData->current_channel_bw == CHANNEL_WIDTH_80) { - if (pHalData->bSWToBW80M == FALSE) { - pHalData->BackUp_BB_REG_4_2nd_CCA[2] = phy_query_bb_reg(pAdapter, r_L1_SBD_start_time, 0x0f000000); - } - - pHalData->bSWToBW80M = TRUE; - - switch (ulAntennaRx) { - case ANTENNA_A: - case ANTENNA_B: - case ANTENNA_C: - case ANTENNA_D: - phy_set_bb_reg(pAdapter, r_L1_SBD_start_time, 0x0f000000,0x0b);/* 0x844[27:24] = 0xb */ - phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x00000001, 0x1); /* 0x838 Enable 2ndCCA */ - phy_set_bb_reg(pAdapter, rAGC_table_Jaguar, 0x00FF0000, 0x89); /* 0x82C[23:20] = 8, PWDB_TH_QB, 0x82C[19:16] = 9, PWDB_TH_HB*/ - phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x0FFF0000, 0x887); /* 838[27:24]=8, RF80_secondary40, 838[23:20]=8, RF80_secondary20, 838[19:16]=7, RF80_primary*/ - phy_set_bb_reg(pAdapter, rL1_Weight_Jaguar, 0x0000F000, 0x7); /* 840[15:12]=7, L1_square_Pk_weight_80M*/ - break; - - case ANTENNA_AB: - case ANTENNA_AC: - case ANTENNA_AD: - case ANTENNA_BC: - case ANTENNA_BD: - case ANTENNA_CD: - phy_set_bb_reg(pAdapter, r_L1_SBD_start_time, 0x0f000000,0x0d); - phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x00000001, 0x1); /* Enable 2ndCCA*/ - phy_set_bb_reg(pAdapter, rAGC_table_Jaguar, 0x00FF0000, 0x78); /* 0x82C[23:20] = 7, PWDB_TH_QB, 0x82C[19:16] = 8, PWDB_TH_HB*/ - phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x0FFF0000, 0x444); /* 838[27:24]=4, RF80_secondary40, 838[23:20]=4, RF80_secondary20, 838[19:16]=4, RF80_primary*/ - phy_set_bb_reg(pAdapter, rL1_Weight_Jaguar, 0x0000F000, 0x6); /* 840[15:12]=6, L1_square_Pk_weight_80M*/ - break; - - case ANTENNA_ABC: - case ANTENNA_ABD: - case ANTENNA_ACD: - case ANTENNA_BCD: - phy_set_bb_reg(pAdapter, r_L1_SBD_start_time, 0x0f000000,0x0d); - phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x00000001, 0x1); /* Enable 2ndCCA*/ - phy_set_bb_reg(pAdapter, rAGC_table_Jaguar, 0x00FF0000, 0x98); /* 0x82C[23:20] = 9, PWDB_TH_QB, 0x82C[19:16] = 8, PWDB_TH_HB*/ - phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x0FFF0000, 0x666); /* 838[27:24]=6, RF80_secondary40, 838[23:20]=6, RF80_secondary20, 838[19:16]=6, RF80_primary*/ - phy_set_bb_reg(pAdapter, rL1_Weight_Jaguar, 0x0000F000, 0x6); /* 840[15:12]=6, L1_square_Pk_weight_80M*/ - break; - - case ANTENNA_ABCD: - phy_set_bb_reg(pAdapter, r_L1_SBD_start_time, 0x0f000000,0x0d); - phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x00000001, 0x1); /*Enable 2ndCCA*/ - phy_set_bb_reg(pAdapter, rAGC_table_Jaguar, 0x00FF0000, 0x98); /* 0x82C[23:20] = 9, PWDB_TH_QB, 0x82C[19:16] = 8, PWDB_TH_HB*/ - phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x0FFF0000, 0x666); /* 838[27:24]=6, RF80_secondary40, 838[23:20]=6, RF80_secondary20, 838[19:16]=6, RF80_primary*/ - phy_set_bb_reg(pAdapter, rL1_Weight_Jaguar, 0x0000F000, 0x7); /*840[15:12]=7, L1_square_Pk_weight_80M*/ - break; - - default: - RTW_INFO("Unknown Rx antenna.\n"); - break; - } - } else if(pHalData->current_channel_bw == CHANNEL_WIDTH_40) { - if (pHalData->bSWToBW40M == FALSE) { - pHalData->BackUp_BB_REG_4_2nd_CCA[0] = phy_query_bb_reg(pAdapter, rPwed_TH_Jaguar, 0x007c0000); - pHalData->BackUp_BB_REG_4_2nd_CCA[1] = phy_query_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x0000ff00); - pHalData->BackUp_BB_REG_4_2nd_CCA[2] = phy_query_bb_reg(pAdapter, r_L1_SBD_start_time, 0x0f000000); - } - - switch (ulAntennaRx) { - case ANTENNA_A: /* xT1R*/ - case ANTENNA_B: - case ANTENNA_C: - case ANTENNA_D: - phy_set_bb_reg(pAdapter, r_L1_SBD_start_time, 0x0f000000,0x0b); - phy_set_bb_reg(pAdapter, rPwed_TH_Jaguar, 0x007c0000, 0xe); - phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x0000ff00, 0x43); - phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x00000001, 0x1); - break; - case ANTENNA_AB: /* xT2R*/ - case ANTENNA_AC: - case ANTENNA_AD: - case ANTENNA_BC: - case ANTENNA_BD: - case ANTENNA_CD: - phy_set_bb_reg(pAdapter, r_L1_SBD_start_time, 0x0f000000,0x0d); - phy_set_bb_reg(pAdapter, rPwed_TH_Jaguar, 0x007c0000, 0x8); - phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x0000ff00, 0x43); - phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x00000001, 0x1); - break; - case ANTENNA_ABC: /* xT3R*/ - case ANTENNA_ABD: - case ANTENNA_ACD: - case ANTENNA_BCD: - case ANTENNA_ABCD: /* xT4R*/ - phy_set_bb_reg(pAdapter, r_L1_SBD_start_time, 0x0f000000,0x0d); - phy_set_bb_reg(pAdapter, rPwed_TH_Jaguar, 0x007c0000, 0xa); - phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x0000ff00, 0x43); - phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x00000001, 0x1); - break; - default: - break; - } - pHalData->bSWToBW40M = TRUE; - } else { - phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x00000001, 0x0); /* Enable 2ndCCA*/ - phy_set_bb_reg(pAdapter, rAGC_table_Jaguar, 0x00FF0000, 0x43); /* 0x82C[23:20] = 9, PWDB_TH_QB, 0x82C[19:16] = 8, PWDB_TH_HB*/ - phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x0FFF0000, 0x7aa); /* 838[27:24]=6, RF80_secondary40, 838[23:20]=6, RF80_secondary20, 838[19:16]=6, RF80_primary*/ - phy_set_bb_reg(pAdapter, rL1_Weight_Jaguar, 0x0000F000, 0x7); /* 840[15:12]=7, L1_square_Pk_weight_80M*/ - } - -} - - -VOID PHY_SetRXSC_by_TXSC_8814A(PADAPTER Adapter, u1Byte SubChnlNum) -{ - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - - if (pHalData->current_channel_bw == CHANNEL_WIDTH_80) { - if (SubChnlNum == 0) - phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x1); - else if (SubChnlNum == 1) - phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x1); - else if (SubChnlNum == 2) - phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x2); - else if (SubChnlNum == 4) - phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x4); - else if (SubChnlNum == 3) - phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x3); - else if (SubChnlNum == 9) - phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x1); - else if (SubChnlNum == 10) - phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x2); - } else if (pHalData->current_channel_bw == CHANNEL_WIDTH_40) { - if (SubChnlNum == 1) - phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x1); - else if (SubChnlNum == 2) - phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x2); - } else - phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x0); -} - - -/* <20141230, James> A workaround to eliminate the 5280MHz & 5600MHz & 5760MHzspur of 8814A. (Asked by BBSD Neil.)*/ -VOID phy_SpurCalibration_8814A(PADAPTER Adapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - BOOLEAN Reset_NBI_CSI = TRUE; - struct dm_struct * pDM_Odm = &pHalData->odmpriv; - - /*RTW_INFO("%s(),RFE Type =%d, CurrentCh = %d ,ChannelBW =%d\n", __func__, pHalData->rfe_type, pHalData->current_channel, pHalData->current_channel_bw);*/ - /*RTW_INFO("%s(),Before RrNBI_Setting_Jaguar= %x\n", __func__, phy_query_bb_reg(Adapter, rNBI_Setting_Jaguar, bMaskDWord));*/ - - if (pHalData->rfe_type == 0) { - switch (pHalData->current_channel_bw) { - case CHANNEL_WIDTH_40: - if (pHalData->current_channel == 54 || pHalData->current_channel == 118) { - phy_set_bb_reg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0x3e >> 1); - phy_set_bb_reg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 1); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask0_Jaguar, bMaskDWord, 0); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask1_Jaguar, BIT(0), 1); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask6_Jaguar, bMaskDWord, 0); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask7_Jaguar, bMaskDWord, 0); - Reset_NBI_CSI = FALSE; - } else if (pHalData->current_channel == 151) { - phy_set_bb_reg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0x1e >> 1); - phy_set_bb_reg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 1); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask0_Jaguar, BIT(16), 1); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask1_Jaguar, bMaskDWord, 0); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask6_Jaguar, bMaskDWord, 0); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask7_Jaguar, bMaskDWord, 0); - Reset_NBI_CSI = FALSE; - } - break; - - case CHANNEL_WIDTH_80: - if (pHalData->current_channel == 58 || pHalData->current_channel == 122) { - phy_set_bb_reg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0x3a >> 1); - phy_set_bb_reg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 1); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask0_Jaguar, bMaskDWord, 0); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask1_Jaguar, bMaskDWord, 0); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask6_Jaguar, bMaskDWord, 0); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask7_Jaguar, BIT(0), 1); - Reset_NBI_CSI = FALSE; - } else if (pHalData->current_channel == 155) { - phy_set_bb_reg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0x5a >> 1); - phy_set_bb_reg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 1); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask0_Jaguar, bMaskDWord, 0); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask1_Jaguar, bMaskDWord, 0); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask6_Jaguar, BIT(16), 1); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask7_Jaguar, bMaskDWord, 0); - Reset_NBI_CSI = FALSE; - } - break; - case CHANNEL_WIDTH_20: - if (pHalData->current_channel == 153) { - phy_set_bb_reg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0x1e >> 1); - phy_set_bb_reg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 1); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask0_Jaguar, bMaskDWord, 0); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask1_Jaguar, bMaskDWord, 0); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask6_Jaguar, bMaskDWord, 0); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask7_Jaguar, BIT(16), 1); - Reset_NBI_CSI = FALSE; - } - break; - - default: - break; - } - } else if (pHalData->rfe_type == 1 || pHalData->rfe_type == 2) { - switch (pHalData->current_channel_bw) { - case CHANNEL_WIDTH_20: - if (pHalData->current_channel == 153) { - phy_set_bb_reg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0x1E >> 1); - phy_set_bb_reg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 1); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask0_Jaguar, bMaskDWord, 0); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask1_Jaguar, bMaskDWord, 0); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask6_Jaguar, bMaskDWord, 0); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask7_Jaguar, BIT(16), 1); - Reset_NBI_CSI = FALSE; - } - break; - case CHANNEL_WIDTH_40: - if (pHalData->current_channel == 151) { - phy_set_bb_reg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0x1e >> 1); - phy_set_bb_reg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 1); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask0_Jaguar, BIT(16), 1); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask1_Jaguar, bMaskDWord, 0); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask6_Jaguar, bMaskDWord, 0); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask7_Jaguar, bMaskDWord, 0); - Reset_NBI_CSI = FALSE; - } - break; - case CHANNEL_WIDTH_80: - if (pHalData->current_channel == 155) { - phy_set_bb_reg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0x5a >> 1); - phy_set_bb_reg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 1); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask0_Jaguar, bMaskDWord, 0); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask1_Jaguar, bMaskDWord, 0); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask6_Jaguar, BIT(16), 1); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask7_Jaguar, bMaskDWord, 0); - Reset_NBI_CSI = FALSE; - } - break; - - default: - break; - } - } - - if (Reset_NBI_CSI) { - phy_set_bb_reg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0xfc >> 1); - phy_set_bb_reg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 0); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask0_Jaguar, bMaskDWord, 0); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask1_Jaguar, bMaskDWord, 0); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask6_Jaguar, bMaskDWord, 0); - phy_set_bb_reg(Adapter, rCSI_Fix_Mask7_Jaguar, bMaskDWord, 0); - } - - phydm_spur_nbi_setting_8814a(pDM_Odm); - /*RTW_INFO("%s(),After RrNBI_Setting_Jaguar= %x\n", __func__, phy_query_bb_reg(Adapter, rNBI_Setting_Jaguar, bMaskDWord));*/ -} - - -void phy_ModifyInitialGain_8814A( - PADAPTER Adapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 channel = pHalData->current_channel; - s1Byte offset[4]; /*{A,B,C,D}*/ - u8 i = 0; - u8 chnl_section = 0xff; - - if (channel <= 14 && channel > 0) - chnl_section = 0; /*2G*/ - else if (channel <= 64 && channel >= 36) - chnl_section = 1; /*5GL*/ - else if (channel <= 144 && channel >= 100) - chnl_section = 2; /*5GM*/ - else if (channel <= 177 && channel >= 149) - chnl_section = 3; /*5GH*/ - - if (chnl_section > 3) { - RTW_INFO("%s: worng channel section\n", __func__); - return; - } - - for (i = 0; i < 4; i++) { - u1Byte hex_offset; - - hex_offset = (u1Byte)(pHalData->RxGainOffset[chnl_section] >> (12-4*i))&0x0f; - RTW_INFO("%s: pHalData->RxGainOffset[%d] = %x\n", __func__, chnl_section, pHalData->RxGainOffset[chnl_section]); - RTW_INFO("%s: hex_offset = %x\n", __func__, hex_offset); - - if (hex_offset == 0xf) - offset[i] = 0; - else if (hex_offset >= 0x8) - offset[i] = 0x11 - hex_offset; - else - offset[i] = 0x0 - hex_offset; - offset[i] = (offset[i] / 2) * 2; - RTW_INFO("%s: offset[%d] = %x\n", __func__, i, offset[i]); - RTW_INFO("%s: BackUp_IG_REG_4_Chnl_Section[%d] = %x\n", __func__, i, pHalData->BackUp_IG_REG_4_Chnl_Section[i]); - } - - if (pHalData->BackUp_IG_REG_4_Chnl_Section[0] != 0 && - pHalData->BackUp_IG_REG_4_Chnl_Section[1] != 0 && - pHalData->BackUp_IG_REG_4_Chnl_Section[2] != 0 && - pHalData->BackUp_IG_REG_4_Chnl_Section[3] != 0 - ) { - phy_set_bb_reg(Adapter, rA_IGI_Jaguar, 0x000000ff, pHalData->BackUp_IG_REG_4_Chnl_Section[0] + offset[0]); - phy_set_bb_reg(Adapter, rB_IGI_Jaguar, 0x000000ff, pHalData->BackUp_IG_REG_4_Chnl_Section[1] + offset[1]); - phy_set_bb_reg(Adapter, rC_IGI_Jaguar2, 0x000000ff, pHalData->BackUp_IG_REG_4_Chnl_Section[2] + offset[2]); - phy_set_bb_reg(Adapter, rD_IGI_Jaguar2, 0x000000ff, pHalData->BackUp_IG_REG_4_Chnl_Section[3] + offset[3]); - } -} - - -VOID phy_SetBwMode8814A(PADAPTER Adapter) -{ - u8 SubChnlNum = 0; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - //3 Set Reg668 BW - phy_SetBwRegMac_8814A(Adapter, pHalData->current_channel_bw); - - //3 Set Reg483 - SubChnlNum = phy_GetSecondaryChnl_8814A(Adapter); - rtw_write8(Adapter, REG_DATA_SC_8814A, SubChnlNum); - - if(pHalData->rf_chip == RF_PSEUDO_11N) - { - RTW_INFO("phy_SetBwMode8814A: return for PSEUDO \n"); - return; - } - - //3 Set Reg8AC Reg8C4 Reg8C8 - phy_SetBwRegAdc_8814A(Adapter, pHalData->current_band_type, pHalData->current_channel_bw); - //3 Set Reg82C - phy_SetBwRegAgc_8814A(Adapter, pHalData->current_band_type, pHalData->current_channel_bw); - - //3 Set Reg848 RegA00 - switch(pHalData->current_channel_bw) - { - case CHANNEL_WIDTH_20: - break; - - case CHANNEL_WIDTH_40: - phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x3C, SubChnlNum); // 0x8ac[5:2]=1/2 - - if(SubChnlNum == VHT_DATA_SC_20_UPPER_OF_80MHZ) // 0xa00[4]=1/0 - phy_set_bb_reg(Adapter, rCCK_System_Jaguar, bCCK_System_Jaguar, 1); - else - phy_set_bb_reg(Adapter, rCCK_System_Jaguar, bCCK_System_Jaguar, 0); - break; - - case CHANNEL_WIDTH_80: - phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x3C, SubChnlNum); // 0x8ac[5:2]=1/2/3/4/9/10 - break; - - default: - RTW_INFO("%s():unknown Bandwidth:%#X\n", __func__, pHalData->current_channel_bw); - break; - } - -#if (MP_DRIVER == 1) -if (Adapter->registrypriv.mp_mode == 1) { - /* 2 Set Reg 0x8AC */ - PHY_SetRXSC_by_TXSC_8814A(Adapter, (SubChnlNum & 0xf)); - PHY_Set_SecCCATH_by_RXANT_8814A(Adapter, pHalData->AntennaRxPath); -} -#endif - /* 3 Set RF related register */ - PHY_RF6052SetBandwidth8814A(Adapter, pHalData->current_channel_bw); - - phy_ADC_CLK_8814A(Adapter); - phy_SpurCalibration_8814A(Adapter); -} - - - -//1 6. Channel setting API - -// Add for KFree Feature Requested by RF David. -// We need support ABCD four path Kfree -#if 0 /* no equivalent in 5.2.20... maybe not needed */ -VOID -phy_SetKfreeToRF_8814A( - IN PADAPTER Adapter, - IN u8 eRFPath, - IN u8 Data - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(GetDefaultAdapter(Adapter)); - struct dm_struct * pDM_Odm = &pHalData->odmpriv; - BOOLEAN bOdd; - struct dm_rf_calibration_struct * pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo); - if((Data%2) != 0) //odd -> positive - { - Data = Data - 1; - phy_set_rf_reg(Adapter, eRFPath, rRF_TxGainOffset, BIT19, 1); - bOdd = TRUE; - } - else // even -> negative - { - phy_set_rf_reg(Adapter, eRFPath, rRF_TxGainOffset, BIT19, 0); - bOdd = FALSE; - } - RT_TRACE(COMP_MP, DBG_LOUD, ("phy_ConfigKFree8814A(): RF_0x55[19]= %d\n", bOdd)); - switch(Data) - { - case 2: - phy_set_rf_reg(Adapter, eRFPath, rRF_TxGainOffset, BIT14, 1); - pRFCalibrateInfo->KfreeOffset[eRFPath] = 0; - break; - case 4: - phy_set_rf_reg(Adapter, eRFPath, rRF_TxGainOffset, BIT17|BIT16|BIT15, 1); - pRFCalibrateInfo->KfreeOffset[eRFPath] = 1; - break; - case 6: - phy_set_rf_reg(Adapter, eRFPath, rRF_TxGainOffset, BIT14, 1); - phy_set_rf_reg(Adapter, eRFPath, rRF_TxGainOffset, BIT17|BIT16|BIT15, 1); - pRFCalibrateInfo->KfreeOffset[eRFPath] = 1; - break; - case 8: - phy_set_rf_reg(Adapter, eRFPath, rRF_TxGainOffset, BIT17|BIT16|BIT15, 2); - pRFCalibrateInfo->KfreeOffset[eRFPath] = 2; - break; - case 10: - phy_set_rf_reg(Adapter, eRFPath, rRF_TxGainOffset, BIT14, 1); - phy_set_rf_reg(Adapter, eRFPath, rRF_TxGainOffset, BIT17|BIT16|BIT15, 2); - pRFCalibrateInfo->KfreeOffset[eRFPath] = 2; - break; - case 12: - phy_set_rf_reg(Adapter, eRFPath, rRF_TxGainOffset, BIT17|BIT16|BIT15, 3); - pRFCalibrateInfo->KfreeOffset[eRFPath] = 3; - break; - case 14: - phy_set_rf_reg(Adapter, eRFPath, rRF_TxGainOffset, BIT14, 1); - phy_set_rf_reg(Adapter, eRFPath, rRF_TxGainOffset, BIT17|BIT16|BIT15, 3); - pRFCalibrateInfo->KfreeOffset[eRFPath] = 3; - break; - case 16: - phy_set_rf_reg(Adapter, eRFPath, rRF_TxGainOffset, BIT17|BIT16|BIT15, 4); - pRFCalibrateInfo->KfreeOffset[eRFPath] = 4; - break; - case 18: - phy_set_rf_reg(Adapter, eRFPath, rRF_TxGainOffset, BIT14, 1); - phy_set_rf_reg(Adapter, eRFPath, rRF_TxGainOffset, BIT17|BIT16|BIT15, 4); - pRFCalibrateInfo->KfreeOffset[eRFPath] = 4; - break; - case 20: - phy_set_rf_reg(Adapter, eRFPath, rRF_TxGainOffset, BIT17|BIT16|BIT15, 5); - pRFCalibrateInfo->KfreeOffset[eRFPath] = 5; - break; - - default: - break; - } - - if(bOdd == FALSE) // that means Kfree offset is negative, we need to record it. - { - pRFCalibrateInfo->KfreeOffset[eRFPath] = (-1)*pRFCalibrateInfo->KfreeOffset[eRFPath]; - RT_TRACE(COMP_MP, DBG_LOUD, ("phy_ConfigKFree8814A(): KfreeOffset = %d\n", pRFCalibrateInfo->KfreeOffset[eRFPath])); - } - else - RT_TRACE(COMP_MP, DBG_LOUD, ("phy_ConfigKFree8814A(): KfreeOffset = %d\n", pRFCalibrateInfo->KfreeOffset[eRFPath])); - -} - - -VOID -phy_ConfigKFree8814A( - IN PADAPTER Adapter, - IN u8 channelToSW, - IN BAND_TYPE bandType - ) -{ - u8 targetval_A = 0xFF; - u8 targetval_B = 0xFF; - u8 targetval_C = 0xFF; - u8 targetval_D = 0xFF; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - //RTW_INFO("===>phy_ConfigKFree8814A()\n"); - - if (Adapter->registrypriv.RegPwrTrimEnable == 2) - { - //RTW_INFO("phy_ConfigKFree8814A(): RegPwrTrimEnable == 2, Disable \n"); - return; - } - else if (Adapter->registrypriv.RegPwrTrimEnable == 1 || Adapter->registrypriv.RegPwrTrimEnable == 0) - { - RTW_INFO("phy_ConfigKFree8814A(): RegPwrTrimEnable == TRUE \n"); - if (bandType == BAND_ON_2_4G) // 2G - { - RTW_INFO("phy_ConfigKFree8814A(): bandType == BAND_ON_2_4G, channelToSW= %d \n", channelToSW); - if (channelToSW <= 14 && channelToSW >= 1) - { - efuse_OneByteRead(Adapter, 0x3F4, &targetval_A, FALSE); // for Path A and B - efuse_OneByteRead(Adapter, 0x3F5, &targetval_B, FALSE); // for Path C and D - } - - } - else if (bandType == BAND_ON_5G) - { - RTW_INFO("phy_ConfigKFree8814A(): bandType == BAND_ON_5G, channelToSW= %d \n", channelToSW); - if (channelToSW >= 36 && channelToSW < 50) // 5GLB_1 - { - efuse_OneByteRead(Adapter, 0x3E0, &targetval_A, FALSE); - efuse_OneByteRead(Adapter, 0x3E1, &targetval_B, FALSE); - efuse_OneByteRead(Adapter, 0x3E2, &targetval_C, FALSE); - efuse_OneByteRead(Adapter, 0x3E3, &targetval_D, FALSE); - } - else if (channelToSW >= 50 && channelToSW <= 64) // 5GLB_2 - { - efuse_OneByteRead(Adapter, 0x3E4, &targetval_A, FALSE); - efuse_OneByteRead(Adapter, 0x3E5, &targetval_B, FALSE); - efuse_OneByteRead(Adapter, 0x3E6, &targetval_C, FALSE); - efuse_OneByteRead(Adapter, 0x3E7, &targetval_D, FALSE); - } - else if (channelToSW >= 100 && channelToSW <= 118) // 5GMB_1 - { - efuse_OneByteRead(Adapter, 0x3E8, &targetval_A, FALSE); - efuse_OneByteRead(Adapter, 0x3E9, &targetval_B, FALSE); - efuse_OneByteRead(Adapter, 0x3EA, &targetval_C, FALSE); - efuse_OneByteRead(Adapter, 0x3EB, &targetval_D, FALSE); - } - else if (channelToSW >= 120 && channelToSW <= 140) // 5GMB_2 - { - efuse_OneByteRead(Adapter, 0x3EC, &targetval_A, FALSE); - efuse_OneByteRead(Adapter, 0x3ED, &targetval_B, FALSE); - efuse_OneByteRead(Adapter, 0x3EE, &targetval_C, FALSE); - efuse_OneByteRead(Adapter, 0x3EF, &targetval_D, FALSE); - } - else if (channelToSW >= 149 && channelToSW <= 165) // 5GHB - { - efuse_OneByteRead(Adapter, 0x3F0, &targetval_A, FALSE); - efuse_OneByteRead(Adapter, 0x3F1, &targetval_B, FALSE); - efuse_OneByteRead(Adapter, 0x3F2, &targetval_C, FALSE); - efuse_OneByteRead(Adapter, 0x3F3, &targetval_D, FALSE); - } - } - RTW_INFO("phy_ConfigKFree8814A(): targetval_A= %#x \n", targetval_A); - RTW_INFO("phy_ConfigKFree8814A(): targetval_B= %#x \n", targetval_B); - RTW_INFO("phy_ConfigKFree8814A(): targetval_C= %#x \n", targetval_C); - RTW_INFO("phy_ConfigKFree8814A(): targetval_D= %#x \n", targetval_D); - - // Make sure the targetval is defined - if ((Adapter->registrypriv.RegPwrTrimEnable == 1) && ((targetval_A != 0xFF) || (pHalData->RfKFreeEnable == TRUE))) - { - if (bandType == BAND_ON_2_4G) // 2G - { - RT_TRACE(COMP_MP, DBG_LOUD, ("phy_ConfigKFree8814A(): PATH_A: %#x \n", targetval_A&0x0F)); - phy_SetKfreeToRF_8814A(Adapter, RF_PATH_A, targetval_A&0x0F); - RT_TRACE(COMP_MP, DBG_LOUD, ("phy_ConfigKFree8814A(): PATH_B: %#x \n", (targetval_A&0xF0)>>4)); - phy_SetKfreeToRF_8814A(Adapter, RF_PATH_B, (targetval_A&0xF0)>>4); - RT_TRACE(COMP_MP, DBG_LOUD, ("phy_ConfigKFree8814A(): PATH_C: %#x \n", targetval_B&0x0F)); - phy_SetKfreeToRF_8814A(Adapter, RF_PATH_C, targetval_B&0x0F); - RT_TRACE(COMP_MP, DBG_LOUD, ("phy_ConfigKFree8814A(): PATH_D: %#x \n", (targetval_B&0xF0)>>4)); - phy_SetKfreeToRF_8814A(Adapter, RF_PATH_D, (targetval_B&0xF0)>>4); - } - else if(bandType == BAND_ON_5G) - { - RT_TRACE(COMP_MP, DBG_LOUD, ("phy_ConfigKFree8814A(): PATH_A: %#x \n", targetval_A&0x1F)); - phy_SetKfreeToRF_8814A(Adapter, RF_PATH_A, targetval_A&0x1F); - RT_TRACE(COMP_MP, DBG_LOUD, ("phy_ConfigKFree8814A(): PATH_B: %#x \n", targetval_B&0x1F)); - phy_SetKfreeToRF_8814A(Adapter, RF_PATH_B, targetval_B&0x1F); - RT_TRACE(COMP_MP, DBG_LOUD, ("phy_ConfigKFree8814A(): PATH_C: %#x \n", targetval_C&0x1F)); - phy_SetKfreeToRF_8814A(Adapter, RF_PATH_C, targetval_C&0x1F); - RT_TRACE(COMP_MP, DBG_LOUD, ("phy_ConfigKFree8814A(): PATH_D: %#x \n", targetval_D&0x1F)); - phy_SetKfreeToRF_8814A(Adapter, RF_PATH_D, targetval_D&0x1F); - } - } - else - { - RT_TRACE(COMP_MP, DBG_LOUD, ("phy_ConfigKFree8814A(): targetval not defined, Don't execute KFree Process.\n")); - return; - } - } - RT_TRACE(COMP_MP, DBG_LOUD, ("<===phy_ConfigKFree8814A()\n")); -} -#endif -VOID -phy_SwChnl8814A( - IN PADAPTER pAdapter - ) -{ - u8 eRFPath = 0 , channelIdx = 0; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); -#ifdef CONFIG_RF_GAIN_OFFSET - struct kfree_data_t *kfree_data = &pHalData->kfree_data; -#endif - u8 channelToSW = pHalData->current_channel; - u32 RFValToWR , RFTmpVal, BitShift, BitMask; - - //RTW_INFO("[BW:CHNL], phy_SwChnl8814A(), switch to channel %d !!\n", channelToSW); - - if (phy_SwBand8814A(pAdapter, channelToSW) == FALSE) - { - RTW_INFO("error Chnl %d", channelToSW); - } - - if(pHalData->rf_chip == RF_PSEUDO_11N) - { - RTW_DBG("phy_SwChnl8814A: return for PSEUDO\n"); - return; - } - -#ifdef CONFIG_RF_GAIN_OFFSET - /* Add for KFree Feature Requested by RF David. */ - if (kfree_data->flag & KFREE_FLAG_ON) { - - channelIdx = rtw_ch_to_bb_gain_sel(channelToSW); - #if 0 - if (pHalData->RfKFree_ch_group != channelIdx) { - /* Todo: wait for new phydm ready */ - phy_ConfigKFree8814A(pAdapter, channelToSW, pHalData->current_band_type); - phydm_ConfigKFree(pDM_Odm, channelToSW, kfree_data->bb_gain); - RTW_INFO("RfKFree_ch_group =%d\n", channelIdx); - } - #endif - - pHalData->RfKFree_ch_group = channelIdx; - - } -#endif - if(pHalData->RegFWOffload == 2) - { - FillH2CCmd_8814(pAdapter, H2C_CHNL_SWITCH_OFFLOAD, 1, &channelToSW); - } - else - { - // fc_area - if (36 <= channelToSW && channelToSW <= 48) - phy_set_bb_reg(pAdapter, rFc_area_Jaguar, 0x1ffe0000, 0x494); - else if (50 <= channelToSW && channelToSW <= 64) - phy_set_bb_reg(pAdapter, rFc_area_Jaguar, 0x1ffe0000, 0x453); - else if (100 <= channelToSW && channelToSW <= 116) - phy_set_bb_reg(pAdapter, rFc_area_Jaguar, 0x1ffe0000, 0x452); - else if (118 <= channelToSW) - phy_set_bb_reg(pAdapter, rFc_area_Jaguar, 0x1ffe0000, 0x412); - else - phy_set_bb_reg(pAdapter, rFc_area_Jaguar, 0x1ffe0000, 0x96a); - - for(eRFPath = 0; eRFPath < pHalData->NumTotalRFPath; eRFPath++) - { - // RF_MOD_AG - if (36 <= channelToSW && channelToSW <= 64) - RFValToWR = 0x101; //5'b00101 - else if (100 <= channelToSW && channelToSW <= 140) - RFValToWR = 0x301; //5'b01101 - else if (140 < channelToSW) - RFValToWR = 0x501; //5'b10101 - else - RFValToWR = 0x000; //5'b00000 - - // Channel to switch - BitMask = BIT18|BIT17|BIT16|BIT9|BIT8; - BitShift = PHY_CalculateBitShift(BitMask); - RFTmpVal = channelToSW | (RFValToWR << BitShift); - - BitMask = BIT18|BIT17|BIT16|BIT9|BIT8|bMaskByte0; - - phy_set_rf_reg(pAdapter, eRFPath, RF_CHNLBW_Jaguar, BitMask, RFTmpVal); - } - - if (36 <= channelToSW && channelToSW <= 64) // Band 1 & Band 2 - phy_set_bb_reg(pAdapter, rAGC_table_Jaguar2, 0x1F, 1); // 0x958[4:0] = 0x1 - else if (100 <= channelToSW && channelToSW <= 144) // Band 3 - phy_set_bb_reg(pAdapter, rAGC_table_Jaguar2, 0x1F, 2); // 0x958[4:0] = 0x2 - else if(channelToSW >= 149) // Band 4 - phy_set_bb_reg(pAdapter, rAGC_table_Jaguar2, 0x1F, 3); // 0x958[4:0] = 0x3 - } - - if (pAdapter->registrypriv.mp_mode == 1) { - if (!pHalData->bSetChnlBW) - phy_ADC_CLK_8814A(pAdapter); - phy_SpurCalibration_8814A(pAdapter); - phy_ModifyInitialGain_8814A(pAdapter); - } - - /* 2.4G CCK TX DFIR */ - if (channelToSW >= 1 && channelToSW <= 11) { - phy_set_bb_reg(pAdapter, rCCK0_TxFilter1, bMaskDWord, 0x1a1b0030); - phy_set_bb_reg(pAdapter, rCCK0_TxFilter2, bMaskDWord, 0x090e1317); - phy_set_bb_reg(pAdapter, rCCK0_DebugPort, bMaskDWord, 0x00000204); - } else if (channelToSW >= 12 && channelToSW <= 13) { - phy_set_bb_reg(pAdapter, rCCK0_TxFilter1, bMaskDWord, 0x1a1b0030); - phy_set_bb_reg(pAdapter, rCCK0_TxFilter2, bMaskDWord, 0x090e1217); - phy_set_bb_reg(pAdapter, rCCK0_DebugPort, bMaskDWord, 0x00000305); - } else if (channelToSW == 14) { - phy_set_bb_reg(pAdapter, rCCK0_TxFilter1, bMaskDWord, 0x1a1b0030); - phy_set_bb_reg(pAdapter, rCCK0_TxFilter2, bMaskDWord, 0x00000E17); - phy_set_bb_reg(pAdapter, rCCK0_DebugPort, bMaskDWord, 0x00000000); - } - -} - -/* -VOID -PHY_SwChnlTimerCallback8814A( - IN PRT_TIMER pTimer - ) -{ - PADAPTER pAdapter = (PADAPTER)pTimer->Adapter; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - - RT_TRACE(COMP_SCAN, DBG_LOUD, ("==>PHY_SwChnlTimerCallback8814A(), switch to channel %d\n", pHalData->current_channel)); - - if (rtw_is_drv_stopped(padapter)) - return; - - if(pHalData->rf_chip == RF_PSEUDO_11N) - { - pHalData->SwChnlInProgress=FALSE; - return; //return immediately if it is peudo-phy - } - - - PlatformAcquireSpinLock(pAdapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK); - pHalData->SwChnlInProgress=TRUE; - PlatformReleaseSpinLock(pAdapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK); - - phy_SwChnl8814A(pAdapter); - - PlatformAcquireSpinLock(pAdapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK); - pHalData->SwChnlInProgress=FALSE; - PlatformReleaseSpinLock(pAdapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK); - - RT_TRACE(COMP_SCAN, DBG_LOUD, ("<==PHY_SwChnlTimerCallback8814()\n")); -} - - -VOID -PHY_SwChnlWorkItemCallback8814A( - IN PVOID pContext - ) -{ - PADAPTER pAdapter = (PADAPTER)pContext; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - RT_TRACE(COMP_SCAN, DBG_LOUD, ("==>PHY_SwChnlWorkItemCallback8814A(), switch to channel %d\n", pHalData->current_channel)); - - if(pAdapter->bInSetPower && RT_USB_CANNOT_IO(pAdapter)) - { - RT_TRACE(COMP_SCAN, DBG_LOUD, ("<== PHY_SwChnlWorkItemCallback8814A() SwChnlInProgress FALSE driver sleep or unload\n")); - - pHalData->SwChnlInProgress = FALSE; - return; - } - - if (rtw_is_drv_stopped(padapter)) - return; - - if(pHalData->rf_chip == RF_PSEUDO_11N) - { - pHalData->SwChnlInProgress=FALSE; - return; //return immediately if it is peudo-phy - } - - PlatformAcquireSpinLock(pAdapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK); - pHalData->SwChnlInProgress=TRUE; - PlatformReleaseSpinLock(pAdapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK); - - phy_SwChnl8814A(pAdapter); - - PlatformAcquireSpinLock(pAdapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK); - pHalData->SwChnlInProgress=FALSE; - PlatformReleaseSpinLock(pAdapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK); - - RT_TRACE(COMP_P2P, DBG_LOUD, ("PHY_SwChnlWorkItemCallback8814A(), switch to channel %d\n", pHalData->current_channel)); - RT_TRACE(COMP_SCAN, DBG_LOUD, ("<==PHY_SwChnlWorkItemCallback8814A()\n")); -} - - -VOID -HAL_HandleSwChnl8814A( // Call after initialization - IN PADAPTER pAdapter, - IN u8 channel - ) -{ - PADAPTER Adapter = GetDefaultAdapter(pAdapter); - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - RT_TRACE(COMP_SCAN | COMP_RM, DBG_LOUD, ("HAL_HandleSwChnl8814A()===>\n")); - pHalData->current_channel = channel; - phy_SwChnl8814A(Adapter); - - -#if (MP_DRIVER == 1) - // <20120712, Kordan> IQK on each channel, asked by James. - PHY_IQCalibrate_8814A(pAdapter, FALSE); -#endif - - RT_TRACE(COMP_SCAN | COMP_RM, DBG_LOUD, ("<==HAL_HandleSwChnl8814A()\n")); -} -*/ - -VOID -phy_SwChnlAndSetBwMode8814A( - IN PADAPTER Adapter -) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct dm_struct * pDM_Odm = &pHalData->odmpriv; - - //RTW_INFO("phy_SwChnlAndSetBwMode8814A(): bSwChnl %d, bSetChnlBW %d \n", pHalData->bSwChnl, pHalData->bSetChnlBW); - if ( Adapter->bNotifyChannelChange ) - { - RTW_INFO( "[%s] bSwChnl=%d, ch=%d, bSetChnlBW=%d, bw=%d\n", - __FUNCTION__, - pHalData->bSwChnl, - pHalData->current_channel, - pHalData->bSetChnlBW, - pHalData->current_channel_bw); - } - - if (RTW_CANNOT_RUN(Adapter)) { - pHalData->bSwChnlAndSetBWInProgress= FALSE; - return; - } - - if (pHalData->bSwChnl) - { - phy_SwChnl8814A(Adapter); - pHalData->bSwChnl = FALSE; - } - - if (pHalData->bSetChnlBW) - { - phy_SetBwMode8814A(Adapter); - pHalData->bSetChnlBW = FALSE; - } - - if (Adapter->registrypriv.mp_mode == 0) { - odm_clear_txpowertracking_state(pDM_Odm); - PHY_SetTxPowerLevel8814(Adapter, pHalData->current_channel); - if (pHalData->bNeedIQK == _TRUE) { - phy_iq_calibrate_8814a(pDM_Odm, _FALSE); - pHalData->bNeedIQK = _FALSE; - } - } else - phy_iq_calibrate_8814a(pDM_Odm, _FALSE); -#if 0 //todo -#if (AUTO_CHNL_SEL_NHM == 1) - if(IS_AUTO_CHNL_SUPPORT(Adapter) && - P2PIsSocialChannel(pHalData->current_channel)) - { - RT_TRACE(COMP_SCAN, DBG_TRACE, ("[ACS] phy_SwChnlAndSetBwMode8723B(): current_channel %d Reset NHM counter!!\n", pHalData->current_channel)); - RT_TRACE(COMP_SCAN, DBG_TRACE, ("[ACS] phy_SwChnlAndSetBwMode8723B(): AutoChnlSelPeriod(%d)\n", - GetDefaultAdapter(Adapter)->MgntInfo.AutoChnlSel.AutoChnlSelPeriod)); - - // Reset NHM counter - odm_AutoChannelSelectReset(GET_PDM_ODM(Adapter)); - - SET_AUTO_CHNL_STATE(Adapter, ACS_BEFORE_NHM);// Before NHM measurement - } -#endif -#endif //0 - pHalData->bSwChnlAndSetBWInProgress= FALSE; -} - - -VOID -PHY_SwChnlAndSetBWModeCallback8814A( - IN PVOID pContext -) -{ - PADAPTER Adapter = (PADAPTER)pContext; - phy_SwChnlAndSetBwMode8814A(Adapter); -} - -/* -// -// Description: -// Switch channel synchronously. Called by SwChnlByDelayHandler. -// -// Implemented by Bruce, 2008-02-14. -// The following procedure is operted according to SwChanlCallback8190Pci(). -// However, this procedure is performed synchronously which should be running under -// passive level. -// -VOID -PHY_SwChnlSynchronously8814A( // Only called during initialize - IN PADAPTER Adapter, - IN u8 channel - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - RT_TRACE(COMP_SCAN | COMP_RM, DBG_LOUD, ("==>PHY_SwChnlSynchronously(), switch from channel %d to channel %d.\n", pHalData->current_channel, channel)); - - // Cannot IO. - if(RT_CANNOT_IO(Adapter)) - return; - - // Channel Switching is in progress. - if(pHalData->bSwChnlAndSetBWInProgress) - return; - - //return immediately if it is peudo-phy - if(pHalData->rf_chip == RF_PSEUDO_11N) - { - pHalData->bSwChnlAndSetBWInProgress=FALSE; - return; - } - - switch(pHalData->CurrentWirelessMode) - { - case WIRELESS_MODE_A: - case WIRELESS_MODE_N_5G: - case WIRELESS_MODE_AC_5G: - //Get first channel error when change between 5G and 2.4G band. - //FIX ME!!! - if(channel <=14) - return; - RT_ASSERT((channel>14), ("WIRELESS_MODE_A but channel<=14")); - break; - - case WIRELESS_MODE_B: - case WIRELESS_MODE_G: - case WIRELESS_MODE_N_24G: - case WIRELESS_MODE_AC_24G: - //Get first channel error when change between 5G and 2.4G band. - //FIX ME!!! - if(channel > 14) - return; - RT_ASSERT((channel<=14), ("WIRELESS_MODE_G but channel>14")); - break; - - default: - RT_ASSERT(FALSE, ("Invalid WirelessMode(%#x)!!\n", pHalData->CurrentWirelessMode)); - break; - - } - - pHalData->bSwChnlAndSetBWInProgress = TRUE; - if( channel == 0) - channel = 1; - - pHalData->bSwChnl = TRUE; - pHalData->bSetChnlBW = FALSE; - pHalData->current_channel=channel; - - phy_SwChnlAndSetBwMode8814A(Adapter); - - RT_TRACE(COMP_SCAN | COMP_RM, DBG_LOUD, ("<==PHY_SwChnlSynchronously(), switch from channel %d to channel %d.\n", pHalData->current_channel, channel)); - -} -*/ - -VOID -PHY_HandleSwChnlAndSetBW8814A( - IN PADAPTER Adapter, - IN BOOLEAN bSwitchChannel, - IN BOOLEAN bSetBandWidth, - IN u8 ChannelNum, - enum channel_width ChnlWidth, - IN u8 ChnlOffsetOf40MHz, - IN u8 ChnlOffsetOf80MHz, - IN u8 CenterFrequencyIndex1 -) -{ - PADAPTER pDefAdapter = GetDefaultAdapter(Adapter); - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pDefAdapter); - u8 tmpChannel = pHalData->current_channel; - enum channel_width tmpBW= pHalData->current_channel_bw; - u8 tmpnCur40MhzPrimeSC = pHalData->nCur40MhzPrimeSC; - u8 tmpnCur80MhzPrimeSC = pHalData->nCur80MhzPrimeSC; - u8 tmpCenterFrequencyIndex1 =pHalData->CurrentCenterFrequencyIndex1; - struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv; - - //check is swchnl or setbw - if(!bSwitchChannel && !bSetBandWidth) - { - RTW_INFO("PHY_HandleSwChnlAndSetBW8812: not switch channel and not set bandwidth \n"); - return; - } - - //skip change for channel or bandwidth is the same - if(bSwitchChannel) - { - if(pHalData->current_channel != ChannelNum) - { - if (HAL_IsLegalChannel(Adapter, ChannelNum)) - pHalData->bSwChnl = _TRUE; - else - return; - } - } - - if(bSetBandWidth) - { - if(pHalData->bChnlBWInitialized == _FALSE) - { - pHalData->bChnlBWInitialized = _TRUE; - pHalData->bSetChnlBW = _TRUE; - } - else if((pHalData->current_channel_bw != ChnlWidth) || - (pHalData->nCur40MhzPrimeSC != ChnlOffsetOf40MHz) || - (pHalData->nCur80MhzPrimeSC != ChnlOffsetOf80MHz) || - (pHalData->CurrentCenterFrequencyIndex1!= CenterFrequencyIndex1)) - { - pHalData->bSetChnlBW = _TRUE; - } - } - - if(!pHalData->bSetChnlBW && !pHalData->bSwChnl) - { - //RTW_INFO("<= PHY_HandleSwChnlAndSetBW8812: bSwChnl %d, bSetChnlBW %d \n",pHalData->bSwChnl,pHalData->bSetChnlBW); - return; - } - - - if(pHalData->bSwChnl) - { - pHalData->current_channel=ChannelNum; - pHalData->CurrentCenterFrequencyIndex1 = ChannelNum; - } - - - if(pHalData->bSetChnlBW) - { - pHalData->current_channel_bw = ChnlWidth; -#if 0 - if(ExtChnlOffsetOf40MHz==EXTCHNL_OFFSET_LOWER) - pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_UPPER; - else if(ExtChnlOffsetOf40MHz==EXTCHNL_OFFSET_UPPER) - pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_LOWER; - else - pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_DONT_CARE; - - if(ExtChnlOffsetOf80MHz==EXTCHNL_OFFSET_LOWER) - pHalData->nCur80MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_UPPER; - else if(ExtChnlOffsetOf80MHz==EXTCHNL_OFFSET_UPPER) - pHalData->nCur80MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_LOWER; - else - pHalData->nCur80MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_DONT_CARE; -#else - pHalData->nCur40MhzPrimeSC = ChnlOffsetOf40MHz; - pHalData->nCur80MhzPrimeSC = ChnlOffsetOf80MHz; -#endif - - pHalData->CurrentCenterFrequencyIndex1 = CenterFrequencyIndex1; - } - - //Switch workitem or set timer to do switch channel or setbandwidth operation - if (!RTW_CANNOT_RUN(Adapter)) - phy_SwChnlAndSetBwMode8814A(Adapter); - else { - if(pHalData->bSwChnl) - { - pHalData->current_channel = tmpChannel; - pHalData->CurrentCenterFrequencyIndex1 = tmpChannel; - } - if(pHalData->bSetChnlBW) - { - pHalData->current_channel_bw = tmpBW; - pHalData->nCur40MhzPrimeSC = tmpnCur40MhzPrimeSC; - pHalData->nCur80MhzPrimeSC = tmpnCur80MhzPrimeSC; - pHalData->CurrentCenterFrequencyIndex1 = tmpCenterFrequencyIndex1; - } - } - - //RTW_INFO("Channel %d ChannelBW %d ",pHalData->current_channel, pHalData->current_channel_bw); - //RTW_INFO("40MhzPrimeSC %d 80MhzPrimeSC %d ",pHalData->nCur40MhzPrimeSC, pHalData->nCur80MhzPrimeSC); - //RTW_INFO("CenterFrequencyIndex1 %d \n",pHalData->CurrentCenterFrequencyIndex1); - - //RTW_INFO("<= PHY_HandleSwChnlAndSetBW8812: bSwChnl %d, bSetChnlBW %d \n",pHalData->bSwChnl,pHalData->bSetChnlBW); - -} - - -/* -// -// Description: -// Configure H/W functionality to enable/disable Monitor mode. -// Note, because we possibly need to configure BB and RF in this function, -// so caller should in PASSIVE_LEVEL. 080118, by rcnjko. -// -VOID -PHY_SetMonitorMode8814A( - IN PADAPTER pAdapter, - IN BOOLEAN bEnableMonitorMode - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - BOOLEAN bFilterOutNonAssociatedBSSID = FALSE; - - //2 Note: we may need to stop antenna diversity. - if(bEnableMonitorMode) - { - bFilterOutNonAssociatedBSSID = FALSE; - RT_TRACE(COMP_RM, DBG_LOUD, ("PHY_SetMonitorMode8814A(): enable monitor mode\n")); - - pHalData->bInMonitorMode = TRUE; - pAdapter->HalFunc.AllowAllDestAddrHandler(pAdapter, TRUE, TRUE); - rtw_hal_set_hwreg(pAdapter, HW_VAR_CHECK_BSSID, (u8*)&bFilterOutNonAssociatedBSSID); - } - else - { - bFilterOutNonAssociatedBSSID = TRUE; - RT_TRACE(COMP_RM, DBG_LOUD, ("PHY_SetMonitorMode8814A(): disable monitor mode\n")); - - pAdapter->HalFunc.AllowAllDestAddrHandler(pAdapter, FALSE, TRUE); - pHalData->bInMonitorMode = FALSE; - rtw_hal_set_hwreg(pAdapter, HW_VAR_CHECK_BSSID, (u8*)&bFilterOutNonAssociatedBSSID); - } -} -*/ - -BOOLEAN -SetAntennaConfig8814A( - IN PADAPTER pAdapter, - IN u8 DefaultAnt // 0: Main, 1: Aux. -) -{ - return TRUE; -} - -VOID -PHY_SetBWMode8814( - IN PADAPTER Adapter, - IN enum channel_width Bandwidth, // 20M or 40M - IN u8 Offset // Upper, Lower, or Don't care -) -{ - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - - //RTW_INFO("%s()===>\n",__FUNCTION__); - - PHY_HandleSwChnlAndSetBW8814A(Adapter, _FALSE, _TRUE, pHalData->current_channel, Bandwidth, Offset, Offset, pHalData->current_channel); - - //RTW_INFO("<==%s()\n",__FUNCTION__); -} - -VOID -PHY_SwChnl8814( - IN PADAPTER Adapter, - IN u8 channel - ) -{ - //RTW_INFO("%s()===>\n",__FUNCTION__); - - PHY_HandleSwChnlAndSetBW8814A(Adapter, _TRUE, _FALSE, channel, 0, 0, 0, channel); - - //RTW_INFO("<==%s()\n",__FUNCTION__); -} - -VOID -PHY_SetSwChnlBWMode8814( - IN PADAPTER Adapter, - IN u8 channel, - IN enum channel_width Bandwidth, - IN u8 Offset40, - IN u8 Offset80 -) -{ - //RTW_INFO("%s()===>\n",__FUNCTION__); - - PHY_HandleSwChnlAndSetBW8814A(Adapter, _TRUE, _TRUE, channel, Bandwidth, Offset40, Offset80, channel); - - //RTW_INFO("<==%s()\n",__FUNCTION__); -} - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/rtl8814a_rf6052.c b/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/rtl8814a_rf6052.c deleted file mode 100644 index f298471ad17234..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/rtl8814a_rf6052.c +++ /dev/null @@ -1,210 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#define _RTL8814A_RF6052_C_ - -//#include -#include - - -/*----------------------------------------------------------------------------- - * Function: PHY_RF6052SetBandwidth() - * - * Overview: This function is called by SetBWModeCallback8190Pci() only - * - * Input: PADAPTER Adapter - * WIRELESS_BANDWIDTH_E Bandwidth //20M or 40M - * - * Output: NONE - * - * Return: NONE - * - * Note: For RF type 0222D - *---------------------------------------------------------------------------*/ -VOID -PHY_RF6052SetBandwidth8814A( - IN PADAPTER Adapter, - IN enum channel_width Bandwidth) //20M or 40M -{ - switch(Bandwidth) - { - case CHANNEL_WIDTH_20: - /*RTW_INFO("PHY_RF6052SetBandwidth8814A(), set 20MHz\n");*/ - phy_set_rf_reg(Adapter, RF_PATH_A, RF_CHNLBW_Jaguar, BIT11|BIT10, 3); - phy_set_rf_reg(Adapter, RF_PATH_B, RF_CHNLBW_Jaguar, BIT11|BIT10, 3); - phy_set_rf_reg(Adapter, RF_PATH_C, RF_CHNLBW_Jaguar, BIT11|BIT10, 3); - phy_set_rf_reg(Adapter, RF_PATH_D, RF_CHNLBW_Jaguar, BIT11|BIT10, 3); - break; - - case CHANNEL_WIDTH_40: - /*RTW_INFO("PHY_RF6052SetBandwidth8814A(), set 40MHz\n");*/ - phy_set_rf_reg(Adapter, RF_PATH_A, RF_CHNLBW_Jaguar, BIT11|BIT10, 1); - phy_set_rf_reg(Adapter, RF_PATH_B, RF_CHNLBW_Jaguar, BIT11|BIT10, 1); - phy_set_rf_reg(Adapter, RF_PATH_C, RF_CHNLBW_Jaguar, BIT11|BIT10, 1); - phy_set_rf_reg(Adapter, RF_PATH_D, RF_CHNLBW_Jaguar, BIT11|BIT10, 1); - break; - - case CHANNEL_WIDTH_80: - /*RTW_INFO("PHY_RF6052SetBandwidth8814A(), set 80MHz\n");*/ - phy_set_rf_reg(Adapter, RF_PATH_A, RF_CHNLBW_Jaguar, BIT11|BIT10, 0); - phy_set_rf_reg(Adapter, RF_PATH_B, RF_CHNLBW_Jaguar, BIT11|BIT10, 0); - phy_set_rf_reg(Adapter, RF_PATH_C, RF_CHNLBW_Jaguar, BIT11|BIT10, 0); - phy_set_rf_reg(Adapter, RF_PATH_D, RF_CHNLBW_Jaguar, BIT11|BIT10, 0); - break; - - default: - RTW_INFO("PHY_RF6052SetBandwidth8814A(): unknown Bandwidth: %#X\n",Bandwidth ); - break; - } -} - -static int -phy_RF6052_Config_ParaFile_8814A( - IN PADAPTER Adapter - ) -{ - u32 u4RegValue=0; - u8 eRFPath; - int rtStatus = _SUCCESS; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - static char sz8814RadioAFile[] = PHY_FILE_RADIO_A; - static char sz8814RadioBFile[] = PHY_FILE_RADIO_B; - static char sz8814RadioCFile[] = PHY_FILE_RADIO_C; - static char sz8814RadioDFile[] = PHY_FILE_RADIO_D; - static char sz8814TxPwrTrack[] = PHY_FILE_TXPWR_TRACK; - char *pszRadioAFile = NULL, *pszRadioBFile = NULL, *pszRadioCFile = NULL, *pszRadioDFile = NULL, *pszTxPwrTrack = NULL; - - - pszRadioAFile = sz8814RadioAFile; - pszRadioBFile = sz8814RadioBFile; - pszRadioCFile = sz8814RadioCFile; - pszRadioDFile = sz8814RadioDFile; - pszTxPwrTrack = sz8814TxPwrTrack; - - //3//----------------------------------------------------------------- - //3// <2> Initialize RF - //3//----------------------------------------------------------------- - //for(eRFPath = RF_PATH_A; eRFPath NumTotalRFPath; eRFPath++) - for(eRFPath = 0; eRFPath NumTotalRFPath; eRFPath++) - { - /*----Initialize RF fom connfiguration file----*/ - switch(eRFPath) - { - case RF_PATH_A: -#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE - if (PHY_ConfigRFWithParaFile(Adapter, pszRadioAFile, eRFPath) == _FAIL) -#endif //CONFIG_LOAD_PHY_PARA_FROM_FILE - { -#ifdef CONFIG_EMBEDDED_FWIMG - if(HAL_STATUS_FAILURE ==odm_config_rf_with_header_file(&pHalData->odmpriv,CONFIG_RF_RADIO, (enum rf_path)eRFPath)) - rtStatus = _FAIL; -#endif //CONFIG_EMBEDDED_FWIMG - } - break; - case RF_PATH_B: -#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE - if (PHY_ConfigRFWithParaFile(Adapter, pszRadioBFile, eRFPath) == _FAIL) -#endif //CONFIG_LOAD_PHY_PARA_FROM_FILE - { -#ifdef CONFIG_EMBEDDED_FWIMG - if(HAL_STATUS_FAILURE ==odm_config_rf_with_header_file(&pHalData->odmpriv,CONFIG_RF_RADIO, (enum rf_path)eRFPath)) - rtStatus = _FAIL; -#endif //CONFIG_EMBEDDED_FWIMG - } - break; - case RF_PATH_C: -#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE - if (PHY_ConfigRFWithParaFile(Adapter, pszRadioCFile, eRFPath) == _FAIL) -#endif //CONFIG_LOAD_PHY_PARA_FROM_FILE - { -#ifdef CONFIG_EMBEDDED_FWIMG - if(HAL_STATUS_FAILURE ==odm_config_rf_with_header_file(&pHalData->odmpriv,CONFIG_RF_RADIO, (enum rf_path)eRFPath)) - rtStatus = _FAIL; -#endif //CONFIG_EMBEDDED_FWIMG - } - break; - case RF_PATH_D: -#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE - if (PHY_ConfigRFWithParaFile(Adapter, pszRadioDFile, eRFPath) == _FAIL) -#endif //CONFIG_LOAD_PHY_PARA_FROM_FILE - { -#ifdef CONFIG_EMBEDDED_FWIMG - if(HAL_STATUS_FAILURE ==odm_config_rf_with_header_file(&pHalData->odmpriv,CONFIG_RF_RADIO, (enum rf_path)eRFPath)) - rtStatus = _FAIL; -#endif //CONFIG_EMBEDDED_FWIMG - } - break; - default: - break; - } - - if(rtStatus != _SUCCESS){ - RTW_INFO("%s():Radio[%d] Fail!!", __FUNCTION__, eRFPath); - goto phy_RF6052_Config_ParaFile_Fail; - } - - } - - u4RegValue = phy_query_rf_reg(Adapter, RF_PATH_A, RF_RCK1_Jaguar, bRFRegOffsetMask); - phy_set_rf_reg(Adapter, RF_PATH_B, RF_RCK1_Jaguar, bRFRegOffsetMask, u4RegValue); - phy_set_rf_reg(Adapter, RF_PATH_C, RF_RCK1_Jaguar, bRFRegOffsetMask, u4RegValue); - phy_set_rf_reg(Adapter, RF_PATH_D, RF_RCK1_Jaguar, bRFRegOffsetMask, u4RegValue); - - //3 ----------------------------------------------------------------- - //3 Configuration of Tx Power Tracking - //3 ----------------------------------------------------------------- - -#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE - if (PHY_ConfigRFWithTxPwrTrackParaFile(Adapter, pszTxPwrTrack) == _FAIL) -#endif //CONFIG_LOAD_PHY_PARA_FROM_FILE - { -#ifdef CONFIG_EMBEDDED_FWIMG - odm_config_rf_with_tx_pwr_track_header_file(&pHalData->odmpriv); -#endif - } - - //RT_TRACE(COMP_INIT, DBG_LOUD, ("<---phy_RF6052_Config_ParaFile_8812()\n")); - -phy_RF6052_Config_ParaFile_Fail: - return rtStatus; -} - - -int -PHY_RF6052_Config_8814A( - IN PADAPTER Adapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - int rtStatus = _SUCCESS; - - // Initialize general global value - pHalData->NumTotalRFPath = 4; - - // - // Config BB and RF - // - rtStatus = phy_RF6052_Config_ParaFile_8814A(Adapter); - - return rtStatus; - -} - - -/* End of HalRf6052.c */ - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/rtl8814a_rxdesc.c b/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/rtl8814a_rxdesc.c deleted file mode 100644 index 7de802c6cae472..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/rtl8814a_rxdesc.c +++ /dev/null @@ -1,68 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#define _RTL8814A_RXDESC_C_ - -//#include -#include - -void rtl8814_query_rx_desc_status(union recv_frame *precvframe, u8 *pdesc) -{ - struct rx_pkt_attrib *pattrib = &precvframe->u.hdr.attrib; - - _rtw_memset(pattrib, 0, sizeof(struct rx_pkt_attrib)); - -#ifdef CONFIG_RADIOTAP_WITH_RXDESC - _rtw_memcpy(pattrib->rxdesc, pdesc, RXDESC_SIZE); -#endif - - //Offset 0 - pattrib->pkt_len = (u16)GET_RX_STATUS_DESC_PKT_LEN_8814A(pdesc);//(le32_to_cpu(pdesc->rxdw0)&0x00003fff) - pattrib->crc_err = (u8)GET_RX_STATUS_DESC_CRC32_8814A(pdesc);//((le32_to_cpu(pdesc->rxdw0) >> 14) & 0x1); - pattrib->icv_err = (u8)GET_RX_STATUS_DESC_ICV_8814A(pdesc);//((le32_to_cpu(pdesc->rxdw0) >> 15) & 0x1); - pattrib->drvinfo_sz = (u8)GET_RX_STATUS_DESC_DRVINFO_SIZE_8814A(pdesc) * 8;//((le32_to_cpu(pdesc->rxdw0) >> 16) & 0xf) * 8;//uint 2^3 = 8 bytes - pattrib->encrypt = (u8)GET_RX_STATUS_DESC_SECURITY_8814A(pdesc);//((le32_to_cpu(pdesc->rxdw0) >> 20) & 0x7); - pattrib->qos = (u8)GET_RX_STATUS_DESC_QOS_8814A(pdesc);//(( le32_to_cpu( pdesc->rxdw0 ) >> 23) & 0x1);// Qos data, wireless lan header length is 26 - pattrib->shift_sz = (u8)GET_RX_STATUS_DESC_SHIFT_8814A(pdesc);//((le32_to_cpu(pdesc->rxdw0) >> 24) & 0x3); - pattrib->physt = (u8)GET_RX_STATUS_DESC_PHY_STATUS_8814A(pdesc);//((le32_to_cpu(pdesc->rxdw0) >> 26) & 0x1); - pattrib->bdecrypted = !GET_RX_STATUS_DESC_SWDEC_8814A(pdesc);//(le32_to_cpu(pdesc->rxdw0) & BIT(27))? 0:1; - - //Offset 4 - pattrib->priority = (u8)GET_RX_STATUS_DESC_TID_8814A(pdesc);//((le32_to_cpu(pdesc->rxdw1) >> 8) & 0xf); - pattrib->mdata = (u8)GET_RX_STATUS_DESC_MORE_DATA_8814A(pdesc);//((le32_to_cpu(pdesc->rxdw1) >> 26) & 0x1); - pattrib->mfrag = (u8)GET_RX_STATUS_DESC_MORE_FRAG_8814A(pdesc);//((le32_to_cpu(pdesc->rxdw1) >> 27) & 0x1);//more fragment bit - - //Offset 8 - pattrib->seq_num = (u16)GET_RX_STATUS_DESC_SEQ_8814A(pdesc);//(le32_to_cpu(pdesc->rxdw2) & 0x00000fff); - pattrib->frag_num = (u8)GET_RX_STATUS_DESC_FRAG_8814A(pdesc);//((le32_to_cpu(pdesc->rxdw2) >> 12) & 0xf);//fragmentation number - - - if (GET_RX_STATUS_DESC_RPT_SEL_8814A(pdesc)) - pattrib->pkt_rpt_type = C2H_PACKET; - else - pattrib->pkt_rpt_type = NORMAL_RX; - - //Offset 12 - pattrib->data_rate=(u8)GET_RX_STATUS_DESC_RX_RATE_8814A(pdesc);//((le32_to_cpu(pdesc->rxdw3))&0x7f); - - //Offset 16 - //Offset 20 - -} - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/rtl8814a_sreset.c b/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/rtl8814a_sreset.c deleted file mode 100644 index 5d7e423ce73317..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/rtl8814a_sreset.c +++ /dev/null @@ -1,114 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#define _RTL8814A_SRESET_C_ - -//#include -#include - -#ifdef DBG_CONFIG_ERROR_DETECT -void rtl8814_sreset_xmit_status_check(_adapter *padapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct sreset_priv *psrtpriv = &pHalData->srestpriv; - - unsigned long current_time; - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - unsigned int diff_time; - u32 txdma_status; - - if( (txdma_status=rtw_read32(padapter, REG_TXDMA_STATUS)) !=0x00){ - RTW_INFO("%s REG_TXDMA_STATUS:0x%08x\n", __FUNCTION__, txdma_status); - rtw_hal_sreset_reset(padapter); - } -#ifdef CONFIG_USB_HCI - //total xmit irp = 4 - //DBG_8192C("==>%s free_xmitbuf_cnt(%d),txirp_cnt(%d)\n",__FUNCTION__,pxmitpriv->free_xmitbuf_cnt,pxmitpriv->txirp_cnt); - //if(pxmitpriv->txirp_cnt == NR_XMITBUFF+1) - current_time = rtw_get_current_time(); - - if (0 == pxmitpriv->free_xmitbuf_cnt || 0 == pxmitpriv->free_xmit_extbuf_cnt) { - - diff_time = rtw_get_passing_time_ms(psrtpriv->last_tx_time); - - if (diff_time > 2000) { - if (psrtpriv->last_tx_complete_time == 0) { - psrtpriv->last_tx_complete_time = current_time; - } - else{ - diff_time = rtw_get_passing_time_ms(psrtpriv->last_tx_complete_time); - if (diff_time > 4000) { - u32 ability = 0; - - //padapter->Wifi_Error_Status = WIFI_TX_HANG; - ability = rtw_phydm_ability_get(padapter); - - RTW_INFO("%s tx hang %s\n", __FUNCTION__, - (ability & ODM_BB_ADAPTIVITY)? "ODM_BB_ADAPTIVITY" : ""); - - if (!(ability & ODM_BB_ADAPTIVITY)) - rtw_hal_sreset_reset(padapter); - } - } - } - } -#endif //CONFIG_USB_HCI - - if (psrtpriv->dbg_trigger_point == SRESET_TGP_XMIT_STATUS) { - psrtpriv->dbg_trigger_point = SRESET_TGP_NULL; - rtw_hal_sreset_reset(padapter); - return; - } -} - -void rtl8814_sreset_linked_status_check(_adapter *padapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct sreset_priv *psrtpriv = &pHalData->srestpriv; - - u32 rx_dma_status = 0; - rx_dma_status = rtw_read32(padapter,REG_RXDMA_STATUS); - if(rx_dma_status!= 0x00){ - RTW_INFO("%s REG_RXDMA_STATUS:0x%08x\n",__FUNCTION__,rx_dma_status); - } -#if 0 - u32 regc50,regc58,reg824,reg800; - regc50 = rtw_read32(padapter,0xc50); - regc58 = rtw_read32(padapter,0xc58); - reg824 = rtw_read32(padapter,0x824); - reg800 = rtw_read32(padapter,0x800); - if( ((regc50&0xFFFFFF00)!= 0x69543400)|| - ((regc58&0xFFFFFF00)!= 0x69543400)|| - (((reg824&0xFFFFFF00)!= 0x00390000)&&(((reg824&0xFFFFFF00)!= 0x80390000)))|| - ( ((reg800&0xFFFFFF00)!= 0x03040000)&&((reg800&0xFFFFFF00)!= 0x83040000))) - { - DBG_8192C("%s regc50:0x%08x, regc58:0x%08x, reg824:0x%08x, reg800:0x%08x,\n", __FUNCTION__, - regc50, regc58, reg824, reg800); - rtw_hal_sreset_reset(padapter); - } -#endif - - if (psrtpriv->dbg_trigger_point == SRESET_TGP_LINK_STATUS) { - psrtpriv->dbg_trigger_point = SRESET_TGP_NULL; - rtw_hal_sreset_reset(padapter); - return; - } -} -#endif - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/rtl8814a_xmit.c b/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/rtl8814a_xmit.c deleted file mode 100644 index 8e9047b821fe4c..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/rtl8814a_xmit.c +++ /dev/null @@ -1,515 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#define _RTL8814A_XMIT_C_ - -//#include -#include - -/* - * Description: - * Aggregation packets and send to hardware - * - * Return: - * 0 Success - * -1 Hardware resource(TX FIFO) not ready - * -2 Software resource(xmitbuf) not ready - */ -#ifdef CONFIG_TX_EARLY_MODE - -//#define DBG_EMINFO - -#if RTL8188E_EARLY_MODE_PKT_NUM_10 == 1 - #define EARLY_MODE_MAX_PKT_NUM 10 -#else - #define EARLY_MODE_MAX_PKT_NUM 5 -#endif - - -struct EMInfo{ - u8 EMPktNum; - u16 EMPktLen[EARLY_MODE_MAX_PKT_NUM]; -}; - - -void -InsertEMContent_8814( - struct EMInfo *pEMInfo, - IN pu1Byte VirtualAddress) -{ - -#if RTL8188E_EARLY_MODE_PKT_NUM_10 == 1 - u1Byte index=0; - u4Byte dwtmp=0; -#endif - - _rtw_memset(VirtualAddress, 0, EARLY_MODE_INFO_SIZE); - if(pEMInfo->EMPktNum==0) - return; - - #ifdef DBG_EMINFO - { - int i; - RTW_INFO("\n%s ==> pEMInfo->EMPktNum =%d\n",__FUNCTION__,pEMInfo->EMPktNum); - for(i=0;i< EARLY_MODE_MAX_PKT_NUM;i++){ - RTW_INFO("%s ==> pEMInfo->EMPktLen[%d] =%d\n",__FUNCTION__,i,pEMInfo->EMPktLen[i]); - } - - } - #endif - -#if RTL8188E_EARLY_MODE_PKT_NUM_10 == 1 - SET_EARLYMODE_PKTNUM(VirtualAddress, pEMInfo->EMPktNum); - - if(pEMInfo->EMPktNum == 1){ - dwtmp = pEMInfo->EMPktLen[0]; - }else{ - dwtmp = pEMInfo->EMPktLen[0]; - dwtmp += ((dwtmp%4)?(4-dwtmp%4):0)+4; - dwtmp += pEMInfo->EMPktLen[1]; - } - SET_EARLYMODE_LEN0(VirtualAddress, dwtmp); - if(pEMInfo->EMPktNum <= 3){ - dwtmp = pEMInfo->EMPktLen[2]; - }else{ - dwtmp = pEMInfo->EMPktLen[2]; - dwtmp += ((dwtmp%4)?(4-dwtmp%4):0)+4; - dwtmp += pEMInfo->EMPktLen[3]; - } - SET_EARLYMODE_LEN1(VirtualAddress, dwtmp); - if(pEMInfo->EMPktNum <= 5){ - dwtmp = pEMInfo->EMPktLen[4]; - }else{ - dwtmp = pEMInfo->EMPktLen[4]; - dwtmp += ((dwtmp%4)?(4-dwtmp%4):0)+4; - dwtmp += pEMInfo->EMPktLen[5]; - } - SET_EARLYMODE_LEN2_1(VirtualAddress, dwtmp&0xF); - SET_EARLYMODE_LEN2_2(VirtualAddress, dwtmp>>4); - if(pEMInfo->EMPktNum <= 7){ - dwtmp = pEMInfo->EMPktLen[6]; - }else{ - dwtmp = pEMInfo->EMPktLen[6]; - dwtmp += ((dwtmp%4)?(4-dwtmp%4):0)+4; - dwtmp += pEMInfo->EMPktLen[7]; - } - SET_EARLYMODE_LEN3(VirtualAddress, dwtmp); - if(pEMInfo->EMPktNum <= 9){ - dwtmp = pEMInfo->EMPktLen[8]; - }else{ - dwtmp = pEMInfo->EMPktLen[8]; - dwtmp += ((dwtmp%4)?(4-dwtmp%4):0)+4; - dwtmp += pEMInfo->EMPktLen[9]; - } - SET_EARLYMODE_LEN4(VirtualAddress, dwtmp); -#else - SET_EARLYMODE_PKTNUM(VirtualAddress, pEMInfo->EMPktNum); - SET_EARLYMODE_LEN0(VirtualAddress, pEMInfo->EMPktLen[0]); - SET_EARLYMODE_LEN1(VirtualAddress, pEMInfo->EMPktLen[1]); - SET_EARLYMODE_LEN2_1(VirtualAddress, pEMInfo->EMPktLen[2]&0xF); - SET_EARLYMODE_LEN2_2(VirtualAddress, pEMInfo->EMPktLen[2]>>4); - SET_EARLYMODE_LEN3(VirtualAddress, pEMInfo->EMPktLen[3]); - SET_EARLYMODE_LEN4(VirtualAddress, pEMInfo->EMPktLen[4]); -#endif - //RT_PRINT_DATA(COMP_SEND, DBG_LOUD, "EMHdr:", VirtualAddress, 8); - -} - - - -void UpdateEarlyModeInfo8814(struct xmit_priv *pxmitpriv,struct xmit_buf *pxmitbuf ) -{ - //_adapter *padapter, struct xmit_frame *pxmitframe,struct tx_servq *ptxservq - int index,j; - u16 offset,pktlen; - PTXDESC_8814 ptxdesc; - - u8 *pmem,*pEMInfo_mem; - s8 node_num_0=0,node_num_1=0; - struct EMInfo eminfo; - struct agg_pkt_info *paggpkt; - struct xmit_frame *pframe = (struct xmit_frame*)pxmitbuf->priv_data; - pmem= pframe->buf_addr; - - #ifdef DBG_EMINFO - RTW_INFO("\n%s ==> agg_num:%d\n",__FUNCTION__, pframe->agg_num); - for(index=0;indexagg_num;index++){ - offset = pxmitpriv->agg_pkt[index].offset; - pktlen = pxmitpriv->agg_pkt[index].pkt_len; - RTW_INFO("%s ==> agg_pkt[%d].offset=%d\n",__FUNCTION__,index,offset); - RTW_INFO("%s ==> agg_pkt[%d].pkt_len=%d\n",__FUNCTION__,index,pktlen); - } - #endif - - if( pframe->agg_num > EARLY_MODE_MAX_PKT_NUM) - { - node_num_0 = pframe->agg_num; - node_num_1= EARLY_MODE_MAX_PKT_NUM-1; - } - - for(index=0;indexagg_num;index++){ - - offset = pxmitpriv->agg_pkt[index].offset; - pktlen = pxmitpriv->agg_pkt[index].pkt_len; - - _rtw_memset(&eminfo,0,sizeof(struct EMInfo)); - if( pframe->agg_num > EARLY_MODE_MAX_PKT_NUM){ - if(node_num_0 > EARLY_MODE_MAX_PKT_NUM){ - eminfo.EMPktNum = EARLY_MODE_MAX_PKT_NUM; - node_num_0--; - } - else{ - eminfo.EMPktNum = node_num_1; - node_num_1--; - } - } - else{ - eminfo.EMPktNum = pframe->agg_num-(index+1); - } - for(j=0;j< eminfo.EMPktNum ;j++){ - eminfo.EMPktLen[j] = pxmitpriv->agg_pkt[index+1+j].pkt_len+4;// 4 bytes CRC - } - - if(pmem){ - if(index==0){ - ptxdesc = (PTXDESC_8814)(pmem); - pEMInfo_mem = ((u8 *)ptxdesc)+TXDESC_SIZE; - } - else{ - pmem = pmem + pxmitpriv->agg_pkt[index-1].offset; - ptxdesc = (PTXDESC_8814)(pmem); - pEMInfo_mem = ((u8 *)ptxdesc)+TXDESC_SIZE; - } - - #ifdef DBG_EMINFO - RTW_INFO("%s ==> desc.pkt_len=%d\n",__FUNCTION__,ptxdesc->pktlen); - #endif - InsertEMContent_8814(&eminfo,pEMInfo_mem); - } - - - } - _rtw_memset(pxmitpriv->agg_pkt,0,sizeof(struct agg_pkt_info)*MAX_AGG_PKT_NUM); - -} -#endif - -#if ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE)) -void rtl8814a_cal_txdesc_chksum(u8 *ptxdesc) -{ - u16 *usPtr; - u32 count; - u32 index; - u16 checksum = 0; - - - usPtr = (u16*)ptxdesc; - // checksume is always calculated by first 32 bytes, - // and it doesn't depend on TX DESC length. - // Thomas,Lucas@SD4,20130515 - count = 16; - - // Clear first - SET_TX_DESC_TX_DESC_CHECKSUM_8814A(ptxdesc, 0); - - for(index = 0 ; index < count ; index++){ - checksum = checksum ^ le16_to_cpu(*(usPtr + index)); - } - - SET_TX_DESC_TX_DESC_CHECKSUM_8814A(ptxdesc, checksum); -} -#endif - -// -// Description: In normal chip, we should send some packet to Hw which will be used by Fw -// in FW LPS mode. The function is to fill the Tx descriptor of this packets, then -// Fw can tell Hw to send these packet derectly. -// -void rtl8814a_fill_fake_txdesc( - PADAPTER padapter, - u8* pDesc, - u32 BufferLen, - u8 IsPsPoll, - u8 IsBTQosNull, - u8 bDataFrame) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - - - // Clear all status - _rtw_memset(pDesc, 0, TXDESC_SIZE); - - SET_TX_DESC_LAST_SEG_8814A(pDesc, 1); - - SET_TX_DESC_OFFSET_8814A(pDesc, TXDESC_SIZE); - - SET_TX_DESC_PKT_SIZE_8814A(pDesc, BufferLen); - - SET_TX_DESC_QUEUE_SEL_8814A(pDesc, QSLT_MGNT); - - if (pmlmeext->cur_wireless_mode & WIRELESS_11B) { - SET_TX_DESC_RATE_ID_8814A(pDesc, RATEID_IDX_B); - } else { - SET_TX_DESC_RATE_ID_8814A(pDesc, RATEID_IDX_G); - } - - //Set NAVUSEHDR to prevent Ps-poll AId filed to be changed to error vlaue by Hw. - if (IsPsPoll) - { - SET_TX_DESC_NAV_USE_HDR_8814A(pDesc, 1); - } - else - { - SET_TX_DESC_HWSEQ_EN_8814A(pDesc, 1); // Hw set sequence number - } -#if 0 //todo - if(IsBTQosNull) - { - SET_TX_DESC_BT_INT_8812(pDesc, 1); - } -#endif //0 - - SET_TX_DESC_USE_RATE_8814A(pDesc, 1); - - //8814 no OWN bit? - //SET_TX_DESC_OWN_8812(pDesc, 1); - - // - // Encrypt the data frame if under security mode excepct null data. Suggested by CCW. - // - if (_TRUE ==bDataFrame) - { - u32 EncAlg; - - EncAlg = padapter->securitypriv.dot11PrivacyAlgrthm; - switch (EncAlg) - { - case _NO_PRIVACY_: - SET_TX_DESC_SEC_TYPE_8814A(pDesc, 0x0); - break; - case _WEP40_: - case _WEP104_: - case _TKIP_: - SET_TX_DESC_SEC_TYPE_8814A(pDesc, 0x1); - break; - case _SMS4_: - SET_TX_DESC_SEC_TYPE_8814A(pDesc, 0x2); - break; - case _AES_: - SET_TX_DESC_SEC_TYPE_8814A(pDesc, 0x3); - break; - default: - SET_TX_DESC_SEC_TYPE_8814A(pDesc, 0x0); - break; - } - } - SET_TX_DESC_TX_RATE_8814A(pDesc, MRateToHwRate(pmlmeext->tx_rate)); - -#if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) - // USB interface drop packet if the checksum of descriptor isn't correct. - // Using this checksum can let hardware recovery from packet bulk out error (e.g. Cancel URC, Bulk out error.). - rtl8814a_cal_txdesc_chksum(pDesc); -#endif -} - -void rtl8814a_fill_txdesc_sectype(struct pkt_attrib *pattrib, u8 *ptxdesc) -{ - if ((pattrib->encrypt > 0) && !pattrib->bswenc) - { - switch (pattrib->encrypt) - { - //SEC_TYPE : 0:NO_ENC,1:WEP40/TKIP,2:WAPI,3:AES - case _WEP40_: - case _WEP104_: - case _TKIP_: - case _TKIP_WTMIC_: - SET_TX_DESC_SEC_TYPE_8814A(ptxdesc, 0x1); - break; -#ifdef CONFIG_WAPI_SUPPORT - case _SMS4_: - SET_TX_DESC_SEC_TYPE_8814A(ptxdesc, 0x2); - break; -#endif - case _AES_: - SET_TX_DESC_SEC_TYPE_8814A(ptxdesc, 0x3); - break; - case _NO_PRIVACY_: - default: - SET_TX_DESC_SEC_TYPE_8814A(ptxdesc, 0x0); - break; - - } - - } - -} - -void rtl8814a_fill_txdesc_vcs(PADAPTER padapter, struct pkt_attrib *pattrib, u8 *ptxdesc) -{ - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - - //RTW_INFO("vcs_mode=%d\n", pattrib->vcs_mode); - - if (pattrib->vcs_mode) { - - switch(pattrib->vcs_mode) - { - case RTS_CTS: - SET_TX_DESC_RTS_ENABLE_8814A(ptxdesc, 1); - break; - case CTS_TO_SELF: - SET_TX_DESC_CTS2SELF_8814A(ptxdesc, 1); - break; - case NONE_VCS: - default: - break; - } - - if (pmlmeinfo->preamble_mode == PREAMBLE_SHORT) - SET_TX_DESC_RTS_SHORT_8814A(ptxdesc, 1); - - SET_TX_DESC_RTS_RATE_8814A(ptxdesc, 0x8);//RTS Rate=24M - - SET_TX_DESC_RTS_RATE_FB_LIMIT_8814A(ptxdesc, 0xf); - - } -} - - -u8 -BWMapping_8814( - IN PADAPTER Adapter, - IN struct pkt_attrib *pattrib -) -{ - u8 BWSettingOfDesc = 0; - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - - //RTW_INFO("BWMapping pHalData->current_channel_bw %d, pattrib->bwmode %d \n",pHalData->current_channel_bw,pattrib->bwmode); - - if(pHalData->current_channel_bw== CHANNEL_WIDTH_80) - { - if(pattrib->bwmode == CHANNEL_WIDTH_80) - BWSettingOfDesc= 2; - else if(pattrib->bwmode == CHANNEL_WIDTH_40) - BWSettingOfDesc = 1; - else - BWSettingOfDesc = 0; - } - else if(pHalData->current_channel_bw== CHANNEL_WIDTH_40) - { - if((pattrib->bwmode == CHANNEL_WIDTH_40) || (pattrib->bwmode == CHANNEL_WIDTH_80)) - BWSettingOfDesc = 1; - else - BWSettingOfDesc = 0; - } - else - BWSettingOfDesc = 0; - - return BWSettingOfDesc; -} - -u8 -SCMapping_8814( - IN PADAPTER Adapter, - IN struct pkt_attrib *pattrib -) -{ - u8 SCSettingOfDesc = 0; - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - //RTW_INFO("SCMapping: pHalData->current_channel_bw %d, pHalData->nCur80MhzPrimeSC %d, pHalData->nCur40MhzPrimeSC %d \n",pHalData->current_channel_bw,pHalData->nCur80MhzPrimeSC,pHalData->nCur40MhzPrimeSC); - - if(pHalData->current_channel_bw == CHANNEL_WIDTH_80) - { - if(pattrib->bwmode == CHANNEL_WIDTH_80) - { - SCSettingOfDesc = VHT_DATA_SC_DONOT_CARE; - } - else if(pattrib->bwmode == CHANNEL_WIDTH_40) - { - if(pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) - SCSettingOfDesc = VHT_DATA_SC_40_LOWER_OF_80MHZ; - else if(pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) - SCSettingOfDesc = VHT_DATA_SC_40_UPPER_OF_80MHZ; - else - RTW_INFO("SCMapping: DONOT CARE Mode Setting\n"); - } - else - { - if((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER)) - SCSettingOfDesc = VHT_DATA_SC_20_LOWEST_OF_80MHZ; - else if((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER)) - SCSettingOfDesc = VHT_DATA_SC_20_LOWER_OF_80MHZ; - else if((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER)) - SCSettingOfDesc = VHT_DATA_SC_20_UPPER_OF_80MHZ; - else if((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER)) - SCSettingOfDesc = VHT_DATA_SC_20_UPPERST_OF_80MHZ; - else - RTW_INFO("SCMapping: DONOT CARE Mode Setting\n"); - } - } - else if(pHalData->current_channel_bw== CHANNEL_WIDTH_40) - { - //RTW_INFO("SCMapping: HT Case: pHalData->current_channel_bw %d, pHalData->nCur40MhzPrimeSC %d \n",pHalData->current_channel_bw,pHalData->nCur40MhzPrimeSC); - - if(pattrib->bwmode == CHANNEL_WIDTH_40) - { - SCSettingOfDesc = VHT_DATA_SC_DONOT_CARE; - } - else if(pattrib->bwmode == CHANNEL_WIDTH_20) - { - if(pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) - { - SCSettingOfDesc = VHT_DATA_SC_20_UPPER_OF_80MHZ; - } - else if(pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) - { - SCSettingOfDesc = VHT_DATA_SC_20_LOWER_OF_80MHZ; - } - else - { - SCSettingOfDesc = VHT_DATA_SC_DONOT_CARE; - } - - } - } - else - { - SCSettingOfDesc = VHT_DATA_SC_DONOT_CARE; - } - - return SCSettingOfDesc; -} - - -void rtl8814a_fill_txdesc_phy(PADAPTER padapter, struct pkt_attrib *pattrib, u8 *ptxdesc) -{ - //RTW_INFO("bwmode=%d, ch_off=%d\n", pattrib->bwmode, pattrib->ch_offset); - - if(pattrib->ht_en) - { - // Set Bandwidth and sub-channel settings. - SET_TX_DESC_DATA_BW_8814A(ptxdesc, BWMapping_8814(padapter,pattrib)); - - SET_TX_DESC_DATA_SC_8814A(ptxdesc, SCMapping_8814(padapter,pattrib)); - } -} - - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/usb/rtl8814au_led.c b/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/usb/rtl8814au_led.c deleted file mode 100644 index 070f886e602ef3..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/usb/rtl8814au_led.c +++ /dev/null @@ -1,147 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. 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 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., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * - ******************************************************************************/ -#define _RTL8814AU_LED_C_ - -//#include -#include -#ifdef CONFIG_RTW_SW_LED -//================================================================================ -// LED object. -//================================================================================ - - -//================================================================================ -// Prototype of protected function. -//================================================================================ - - -//================================================================================ -// LED_819xUsb routines. -//================================================================================ - -// -// Description: -// Turn on LED according to LedPin specified. -// -static void -SwLedOn_8814AU( - PADAPTER padapter, - PLED_USB pLed -) -{ - u32 LedGpioCfg; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - - if (RTW_CANNOT_RUN(padapter)) - return; - - LedGpioCfg = rtw_read32(padapter , REG_GPIO_PIN_CTRL_2); /* 0x60. In 8814AU, the name should be REG_GPIO_EXT_CTRL */ - switch (pLed->LedPin) { - case LED_PIN_LED0: - LedGpioCfg |= (BIT16 | BIT17 | BIT21 | BIT22); /* config as gpo */ - LedGpioCfg &= ~(BIT8 | BIT9 | BIT13 | BIT14); /* set gpo value */ - LedGpioCfg &= ~(BIT0 | BIT1 | BIT5 | BIT6); /* set gpi value. TBD: may not need this */ - rtw_write32(padapter , REG_GPIO_PIN_CTRL_2 , LedGpioCfg); - break; - default: - break; - } - pLed->bLedOn = _TRUE; -} - - -// -// Description: -// Turn off LED according to LedPin specified. -// -static void -SwLedOff_8814AU( - PADAPTER padapter, - PLED_USB pLed -) -{ - u32 LedGpioCfg; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - - if (RTW_CANNOT_RUN(padapter)) - return; - LedGpioCfg = rtw_read32(padapter , REG_GPIO_PIN_CTRL_2); /* 0x60. In 8814AU, the name should be REG_GPIO_EXT_CTRL */ - switch (pLed->LedPin) { - case LED_PIN_LED0: - LedGpioCfg |= (BIT16 | BIT17 | BIT21 | BIT22); /* config as gpo */ - LedGpioCfg |= (BIT8 | BIT9 | BIT13 | BIT14); /* set gpo output value */ - rtw_write32(padapter , REG_GPIO_PIN_CTRL_2 , LedGpioCfg); - break; - default: - break; - } - - pLed->bLedOn = _FALSE; -} - -//================================================================================ -// Interface to manipulate LED objects. -//================================================================================ - - -//================================================================================ -// Default LED behavior. -//================================================================================ - -// -// Description: -// Initialize all LED_871x objects. -// -void -rtl8814au_InitSwLeds( - _adapter *padapter - ) -{ - struct led_priv *pledpriv = adapter_to_led(padapter); - - pledpriv->LedControlHandler = LedControlUSB; - - pledpriv->SwLedOn = SwLedOn_8814AU; - pledpriv->SwLedOff = SwLedOff_8814AU; - - InitLed(padapter, &(pledpriv->SwLed0), LED_PIN_LED0); - - InitLed(padapter, &(pledpriv->SwLed1), LED_PIN_LED1); - - InitLed(padapter, &(pledpriv->SwLed2), LED_PIN_LED2); -} - - -// -// Description: -// DeInitialize all LED_819xUsb objects. -// -void -rtl8814au_DeInitSwLeds( - _adapter *padapter - ) -{ - struct led_priv *ledpriv = adapter_to_led(padapter); - - DeInitLed( &(ledpriv->SwLed0) ); - DeInitLed( &(ledpriv->SwLed1) ); - DeInitLed( &(ledpriv->SwLed2) ); -} -#endif diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/usb/rtl8814au_xmit.c b/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/usb/rtl8814au_xmit.c deleted file mode 100644 index 482040b577ffd7..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/usb/rtl8814au_xmit.c +++ /dev/null @@ -1,1129 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2017 Realtek Corporation. - * - * 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 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 _RTL8812AU_XMIT_C_ - -/* #include */ -#include - - -s32 rtl8814au_init_xmit_priv(_adapter *padapter) -{ - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - -#ifdef PLATFORM_LINUX - tasklet_init(&pxmitpriv->xmit_tasklet, - (void(*)(unsigned long))rtl8814au_xmit_tasklet, - (unsigned long)padapter); -#endif -#ifdef CONFIG_TX_EARLY_MODE - pHalData->bEarlyModeEnable = padapter->registrypriv.early_mode; -#endif - - return _SUCCESS; -} - -void rtl8814au_free_xmit_priv(_adapter *padapter) -{ -} - -static s32 update_txdesc(struct xmit_frame *pxmitframe, u8 *pmem, s32 sz ,u8 bagg_pkt) -{ - int pull=0; - uint qsel; - u8 data_rate,pwr_status,offset; - _adapter *padapter = pxmitframe->padapter; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct pkt_attrib *pattrib = &pxmitframe->attrib; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - u8 *ptxdesc = pmem; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info); - sint bmcst = IS_MCAST(pattrib->ra); - u16 SWDefineContent = 0x0; - u8 DriverFixedRate = 0x0; - struct registry_priv *pregpriv = &(padapter->registrypriv); - -#ifndef CONFIG_USE_USB_BUFFER_ALLOC_TX - if (padapter->registrypriv.mp_mode == 0) - { - if((PACKET_OFFSET_SZ != 0) && (!bagg_pkt) &&(rtw_usb_bulk_size_boundary(padapter,TXDESC_SIZE+sz)==_FALSE)) - { - ptxdesc = (pmem+PACKET_OFFSET_SZ); - //RTW_INFO("==> non-agg-pkt,shift pointer...\n"); - pull = 1; - } - } -#endif // CONFIG_USE_USB_BUFFER_ALLOC_TX - - _rtw_memset(ptxdesc, 0, TXDESC_SIZE); - - //4 offset 0 - //SET_TX_DESC_FIRST_SEG_8812(ptxdesc, 1); - SET_TX_DESC_LAST_SEG_8814A(ptxdesc, 1); - //SET_TX_DESC_OWN_8812(ptxdesc, 1); - - //RTW_INFO("%s==> pkt_len=%d,bagg_pkt=%02x\n",__FUNCTION__,sz,bagg_pkt); - SET_TX_DESC_PKT_SIZE_8814A(ptxdesc, sz); - - offset = TXDESC_SIZE + OFFSET_SZ; - -#ifdef CONFIG_TX_EARLY_MODE - if(bagg_pkt){ - offset += EARLY_MODE_INFO_SIZE ;//0x28 - } -#endif - //RTW_INFO("%s==>offset(0x%02x) \n",__FUNCTION__,offset); - SET_TX_DESC_OFFSET_8814A(ptxdesc, offset); - - if (bmcst) { - SET_TX_DESC_BMC_8814A(ptxdesc, 1); - } - -#ifndef CONFIG_USE_USB_BUFFER_ALLOC_TX - if (padapter->registrypriv.mp_mode == 0) - { - if ((PACKET_OFFSET_SZ != 0) && (!bagg_pkt)) { - if ((pull) && (pxmitframe->pkt_offset>0)) { - pxmitframe->pkt_offset = pxmitframe->pkt_offset -1; - } - } - } -#endif - - //RTW_INFO("%s, pkt_offset=0x%02x\n",__FUNCTION__,pxmitframe->pkt_offset); - // pkt_offset, unit:8 bytes padding - if (pxmitframe->pkt_offset > 0) { - SET_TX_DESC_PKT_OFFSET_8814A(ptxdesc, pxmitframe->pkt_offset); - } - - SET_TX_DESC_MACID_8814A(ptxdesc, pattrib->mac_id); - SET_TX_DESC_RATE_ID_8814A(ptxdesc, pattrib->raid); - - SET_TX_DESC_QUEUE_SEL_8814A(ptxdesc, pattrib->qsel); - - //offset 12 - - if (pattrib->injected == _TRUE && !pregpriv->monitor_overwrite_seqnum) { - /* Prevent sequence number from being overwritten */ - SET_TX_DESC_HWSEQ_EN_8814A(ptxdesc, 0); /* Hw do not set sequence number */ - SET_TX_DESC_SEQ_8814A(ptxdesc, pattrib->seqnum); /* Copy inject sequence number to TxDesc */ - } - else if (!pattrib->qos_en) { - /* HW sequence, to fix to use 0 queue. todo: 4AC packets to use auto queue select */ - SET_TX_DESC_HWSEQ_EN_8814A(ptxdesc, 1); // Hw set sequence number - SET_TX_DESC_EN_HWEXSEQ_8814A(ptxdesc, 0); - SET_TX_DESC_DISQSELSEQ_8814A(ptxdesc, 1); - SET_TX_DESC_HW_SSN_SEL_8814A(ptxdesc, 0); - } else { - SET_TX_DESC_SEQ_8814A(ptxdesc, pattrib->seqnum); - } - - - - if ((pxmitframe->frame_tag&0x0f) == DATA_FRAMETAG) { - //RTW_INFO("pxmitframe->frame_tag == DATA_FRAMETAG\n"); - - rtl8814a_fill_txdesc_sectype(pattrib, ptxdesc); - - //offset 20 - -#ifdef CONFIG_USB_TX_AGGREGATION - if (pxmitframe->agg_num > 1){ - //RTW_INFO("%s agg_num:%d\n",__FUNCTION__,pxmitframe->agg_num ); - SET_TX_DESC_USB_TXAGG_NUM_8814A(ptxdesc, pxmitframe->agg_num); - } -#endif //CONFIG_USB_TX_AGGREGATION - - rtl8814a_fill_txdesc_vcs(padapter, pattrib, ptxdesc); - - if ((pattrib->ether_type != 0x888e) && - (pattrib->ether_type != 0x0806) && - (pattrib->ether_type != 0x88b4) && - (pattrib->dhcp_pkt != 1) -#ifdef CONFIG_AUTO_AP_MODE - && (pattrib->pctrl != _TRUE) -#endif - ) - { - //Non EAP & ARP & DHCP type data packet - - if (pattrib->ampdu_en==_TRUE) { - SET_TX_DESC_AGG_ENABLE_8814A(ptxdesc, 1); - SET_TX_DESC_MAX_AGG_NUM_8814A(ptxdesc, 0x1f); - // Set A-MPDU aggregation. - SET_TX_DESC_AMPDU_DENSITY_8814A(ptxdesc, pattrib->ampdu_spacing); - } - else { - SET_TX_DESC_BK_8814A(ptxdesc, 1); - } - - rtl8814a_fill_txdesc_phy(padapter, pattrib, ptxdesc); - - //DATA Rate FB LMT - //SET_TX_DESC_DATA_RATE_FB_LIMIT_8814A(ptxdesc, 0x1f); - if(pHalData->current_band_type == BAND_ON_5G) - { - SET_TX_DESC_DATA_RATE_FB_LIMIT_8814A(ptxdesc, 4); - } - else - { - SET_TX_DESC_DATA_RATE_FB_LIMIT_8814A(ptxdesc, 0); - } - - if (pHalData->fw_ractrl == _FALSE) { - SET_TX_DESC_USE_RATE_8814A(ptxdesc, 1); - DriverFixedRate = 0x01; - - if(pHalData->INIDATA_RATE[pattrib->mac_id] & BIT(7)) - SET_TX_DESC_DATA_SHORT_8814A(ptxdesc, 1); - - SET_TX_DESC_TX_RATE_8814A(ptxdesc, (pHalData->INIDATA_RATE[pattrib->mac_id] & 0x7F)); - } - - if (padapter->fix_rate != 0xFF) { // modify data rate by iwpriv - SET_TX_DESC_USE_RATE_8814A(ptxdesc, 1); - DriverFixedRate = 0x01; - if(padapter->fix_rate & BIT(7)) - SET_TX_DESC_DATA_SHORT_8814A(ptxdesc, 1); - - SET_TX_DESC_TX_RATE_8814A(ptxdesc, (padapter->fix_rate & 0x7F)); - if (!padapter->data_fb) - SET_TX_DESC_DISABLE_FB_8814A(ptxdesc,1); - } - - if (pattrib->ldpc) - SET_TX_DESC_DATA_LDPC_8814A(ptxdesc, 1); - if (pattrib->stbc) - SET_TX_DESC_DATA_STBC_8814A(ptxdesc, 1); - - //work arond before fixing RA - //SET_TX_DESC_USE_RATE_8814A(ptxdesc, 1); - //SET_TX_DESC_TX_RATE_8814A(ptxdesc, 0x10); - } - else - { - // EAP data packet and ARP packet and DHCP. - // Use the 1M data rate to send the EAP/ARP packet. - // This will maybe make the handshake smooth. - - SET_TX_DESC_USE_RATE_8814A(ptxdesc, 1); - DriverFixedRate = 0x01; - SET_TX_DESC_BK_8814A(ptxdesc, 1); - - // HW will ignore this setting if the transmission rate is legacy OFDM. - if (pmlmeinfo->preamble_mode == PREAMBLE_SHORT) { - SET_TX_DESC_DATA_SHORT_8814A(ptxdesc, 1); - } - - SET_TX_DESC_TX_RATE_8814A(ptxdesc, MRateToHwRate(pmlmeext->tx_rate)); - } - } - else if ((pxmitframe->frame_tag&0x0f)== MGNT_FRAMETAG) { - //RTW_INFO("pxmitframe->frame_tag == MGNT_FRAMETAG\n"); - - SET_TX_DESC_USE_RATE_8814A(ptxdesc, 1); - DriverFixedRate = 0x01; - -#ifdef CONFIG_INTEL_PROXIM - if ((padapter->proximity.proxim_on==_TRUE)&&(pattrib->intel_proxim==_TRUE)){ - RTW_INFO("\n %s pattrib->rate=%d\n", __func__,pattrib->rate); - SET_TX_DESC_TX_RATE_8814A(ptxdesc, pattrib->rate); - } - else -#endif - { - SET_TX_DESC_TX_RATE_8814A(ptxdesc, MRateToHwRate(pattrib->rate)); - } - -#ifdef CONFIG_BEAMFORMING - // VHT NDPA or HT NDPA Packet for Beamformer. - if ((pattrib->subtype == WIFI_NDPA) || - ((pattrib->subtype == WIFI_ACTION_NOACK) && (pattrib->order == 1))) - { - SET_TX_DESC_NAV_USE_HDR_8814A(ptxdesc, 1); - - SET_TX_DESC_DATA_BW_8814A(ptxdesc, BWMapping_8814(padapter,pattrib)); - SET_TX_DESC_RTS_SC_8814A(ptxdesc, SCMapping_8814(padapter,pattrib)); - - SET_TX_DESC_RETRY_LIMIT_ENABLE_8814A(ptxdesc, 1); - SET_TX_DESC_DATA_RETRY_LIMIT_8814A(ptxdesc, 5); - SET_TX_DESC_DISABLE_FB_8814A(ptxdesc, 1); - - //if(pattrib->rts_cca) - //{ - // SET_TX_DESC_NDPA_8812(ptxdesc, 2); - //} - //else - { - SET_TX_DESC_NDPA_8814A(ptxdesc, 1); - } - } - else -#endif - { - SET_TX_DESC_RETRY_LIMIT_ENABLE_8814A(ptxdesc, 1); - if (pattrib->retry_ctrl == _TRUE) { - SET_TX_DESC_DATA_RETRY_LIMIT_8814A(ptxdesc, 6); - } else { - SET_TX_DESC_DATA_RETRY_LIMIT_8814A(ptxdesc, 0); - } - } - -#ifdef CONFIG_XMIT_ACK - //CCX-TXRPT ack for xmit mgmt frames. - if (pxmitframe->ack_report) { - SET_TX_DESC_SPE_RPT_8814A(ptxdesc, 1); - #ifdef DBG_CCX - RTW_INFO("%s set tx report\n", __func__); - #endif - } -#endif //CONFIG_XMIT_ACK - } - else if((pxmitframe->frame_tag&0x0f) == TXAGG_FRAMETAG) - { - RTW_INFO("pxmitframe->frame_tag == TXAGG_FRAMETAG\n"); - } -#ifdef CONFIG_MP_INCLUDED - else if(((pxmitframe->frame_tag&0x0f) == MP_FRAMETAG) && - (padapter->registrypriv.mp_mode == 1)) - { - fill_txdesc_for_mp(padapter, ptxdesc); - } -#endif - else - { - RTW_INFO("pxmitframe->frame_tag = %d\n", pxmitframe->frame_tag); - - SET_TX_DESC_USE_RATE_8814A(ptxdesc, 1); - DriverFixedRate = 0x01; - SET_TX_DESC_TX_RATE_8814A(ptxdesc, MRateToHwRate(pmlmeext->tx_rate)); - } - if (DriverFixedRate) - SWDefineContent |= 0x01; - SET_TX_DESC_SW_DEFINE_8814A(ptxdesc, SWDefineContent); - - SET_TX_DESC_GID_8814A(ptxdesc, pattrib->txbf_g_id); - SET_TX_DESC_PAID_8814A(ptxdesc, pattrib->txbf_p_aid); - - rtl8814a_cal_txdesc_chksum(ptxdesc); - _dbg_dump_tx_info(padapter,pxmitframe->frame_tag,ptxdesc); - return pull; -} - - -#ifdef CONFIG_XMIT_THREAD_MODE -/* - * Description - * Transmit xmitbuf to hardware tx fifo - * - * Return - * _SUCCESS ok - * _FAIL something error - */ -s32 rtl8814au_xmit_buf_handler(PADAPTER padapter) -{ - PHAL_DATA_TYPE phal; - struct xmit_priv *pxmitpriv; - struct xmit_buf *pxmitbuf; - s32 ret; - - - phal = GET_HAL_DATA(padapter); - pxmitpriv = &padapter->xmitpriv; - - ret = _rtw_down_sema(&pxmitpriv->xmit_sema); - if (_FAIL == ret) { - RTW_ERR("%s: down SdioXmitBufSema fail!\n", __FUNCTION__); - return _FAIL; - } - - if (RTW_CANNOT_RUN(padapter)) { - RTW_ERR( - , ("%s: bDriverStopped(%s) bSurpriseRemoved(%s)!\n" - , __func__ - , rtw_is_drv_stopped(padapter)?"True":"False" - , rtw_is_surprise_removed(padapter)?"True":"False"); - return _FAIL; - } - - if(check_pending_xmitbuf(pxmitpriv) == _FALSE) - return _SUCCESS; - -#ifdef CONFIG_LPS_LCLK - ret = rtw_register_tx_alive(padapter); - if (ret != _SUCCESS) { - RTW_ERR("%s: wait to leave LPS_LCLK\n", __FUNCTION__); - return _SUCCESS; - } -#endif //CONFIG_LPS_LCLK - - do { - pxmitbuf = dequeue_pending_xmitbuf(pxmitpriv); - if (pxmitbuf == NULL) break; - - rtw_write_port(padapter, pxmitbuf->ff_hwaddr, pxmitbuf->len, (unsigned char*)pxmitbuf); - - } while (1); - -#ifdef CONFIG_LPS_LCLK - rtw_unregister_tx_alive(padapter); -#endif //CONFIG_LPS_LCLK - - return _SUCCESS; -} -#endif //CONFIG_XMIT_THREAD_MODE - - -//for non-agg data frame or management frame -static s32 rtw_dump_xframe(_adapter *padapter, struct xmit_frame *pxmitframe) -{ - s32 ret = _SUCCESS; - s32 inner_ret = _SUCCESS; - int t, sz, w_sz, pull=0; - u8 *mem_addr; - u32 ff_hwaddr; - struct xmit_buf *pxmitbuf = pxmitframe->pxmitbuf; - struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - struct security_priv *psecuritypriv = &padapter->securitypriv; -#ifdef CONFIG_80211N_HT - if ((pxmitframe->frame_tag == DATA_FRAMETAG) && - (pxmitframe->attrib.ether_type != 0x0806) && - (pxmitframe->attrib.ether_type != 0x888e) && - (pxmitframe->attrib.ether_type != 0x88b4) && - (pxmitframe->attrib.dhcp_pkt != 1)) - { - rtw_issue_addbareq_cmd(padapter, pxmitframe); - } -#endif //CONFIG_80211N_HT - mem_addr = pxmitframe->buf_addr; - - //RTW_INFO("rtw_dump_xframe()\n"); - - for (t = 0; t < pattrib->nr_frags; t++) - { - if (inner_ret != _SUCCESS && ret == _SUCCESS) - ret = _FAIL; - - if (t != (pattrib->nr_frags - 1)) - { - RTW_DBG("pattrib->nr_frags=%d\n", pattrib->nr_frags); - - sz = pxmitpriv->frag_len; - sz = sz - 4 - (psecuritypriv->sw_encrypt ? 0 : pattrib->icv_len); - } - else //no frag - { - sz = pattrib->last_txcmdsz; - } - - pull = update_txdesc(pxmitframe, mem_addr, sz, _FALSE); - - if (pull) { - mem_addr += PACKET_OFFSET_SZ; //pull txdesc head - - //pxmitbuf ->pbuf = mem_addr; - pxmitframe->buf_addr = mem_addr; - - w_sz = sz + TXDESC_SIZE; - } - else - { - w_sz = sz + TXDESC_SIZE + PACKET_OFFSET_SZ; - } - - ff_hwaddr = rtw_get_ff_hwaddr(pxmitframe); - -#ifdef CONFIG_XMIT_THREAD_MODE - pxmitbuf->len = w_sz; - pxmitbuf->ff_hwaddr = ff_hwaddr; - enqueue_pending_xmitbuf(pxmitpriv, pxmitbuf); -#else - inner_ret = rtw_write_port(padapter, ff_hwaddr, w_sz, (unsigned char*)pxmitbuf); -#endif - rtw_count_tx_stats(padapter, pxmitframe, sz); - - //RTW_INFO("rtw_write_port, w_sz=%d\n", w_sz); - //RTW_INFO("rtw_write_port, w_sz=%d, sz=%d, txdesc_sz=%d, tid=%d\n", w_sz, sz, w_sz-sz, pattrib->priority); - - mem_addr += w_sz; - - mem_addr = (u8 *)RND4(((SIZE_PTR)(mem_addr))); - - } - - rtw_free_xmitframe(pxmitpriv, pxmitframe); - - if (ret != _SUCCESS) - rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_UNKNOWN); - - return ret; -} - -#ifdef CONFIG_USB_TX_AGGREGATION -static u32 xmitframe_need_length(struct xmit_frame *pxmitframe) -{ - struct pkt_attrib *pattrib = &pxmitframe->attrib; - - u32 len = 0; - - // no consider fragement - len = pattrib->hdrlen + pattrib->iv_len + - SNAP_SIZE + sizeof(u16) + - pattrib->pktlen + - ((pattrib->bswenc) ? pattrib->icv_len : 0); - - if(pattrib->encrypt ==_TKIP_) - len += 8; - - return len; -} - -#define IDEA_CONDITION 1 // check all packets before enqueue -s32 rtl8814au_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct xmit_frame *pxmitframe = NULL; - struct xmit_frame *pfirstframe = NULL; - - // aggregate variable - struct hw_xmit *phwxmit; - struct sta_info *psta = NULL; - struct tx_servq *ptxservq = NULL; - - _irqL irqL; - _list *xmitframe_plist = NULL, *xmitframe_phead = NULL; - - u32 pbuf; // next pkt address - u32 pbuf_tail; // last pkt tail - u32 len; // packet length, except TXDESC_SIZE and PKT_OFFSET - - u32 bulkSize = pHalData->UsbBulkOutSize; - u8 descCount; - u32 bulkPtr; - - // dump frame variable - u32 ff_hwaddr; - - _list *sta_plist, *sta_phead; - u8 single_sta_in_queue = _FALSE; - -#ifndef IDEA_CONDITION - int res = _SUCCESS; -#endif - - RTW_INFO("+xmitframe_complete\n"); - - - // check xmitbuffer is ok - if (pxmitbuf == NULL) { - pxmitbuf = rtw_alloc_xmitbuf(pxmitpriv); - if (pxmitbuf == NULL){ - //RTW_INFO("%s #1, connot alloc xmitbuf!!!! \n",__FUNCTION__); - return _FALSE; - } - } - -//RTW_INFO("%s ===================================== \n",__FUNCTION__); - //3 1. pick up first frame - do { - rtw_free_xmitframe(pxmitpriv, pxmitframe); - - pxmitframe = rtw_dequeue_xframe(pxmitpriv, pxmitpriv->hwxmits, pxmitpriv->hwxmit_entry); - if (pxmitframe == NULL) { - // no more xmit frame, release xmit buffer - //RTW_INFO("no more xmit frame ,return\n"); - rtw_free_xmitbuf(pxmitpriv, pxmitbuf); - return _FALSE; - } - -#ifndef IDEA_CONDITION - if (pxmitframe->frame_tag != DATA_FRAMETAG) { - RTW_INFO("xmitframe_complete: frame tag(%d) is not DATA_FRAMETAG(%d)!\n", - pxmitframe->frame_tag, DATA_FRAMETAG); -// rtw_free_xmitframe(pxmitpriv, pxmitframe); - continue; - } - - // TID 0~15 - if ((pxmitframe->attrib.priority < 0) || - (pxmitframe->attrib.priority > 15)) { - RTW_INFO("xmitframe_complete: TID(%d) should be 0~15!\n", - pxmitframe->attrib.priority); -// rtw_free_xmitframe(pxmitpriv, pxmitframe); - continue; - } -#endif - //RTW_INFO("==> pxmitframe->attrib.priority:%d\n",pxmitframe->attrib.priority); - pxmitframe->pxmitbuf = pxmitbuf; - pxmitframe->buf_addr = pxmitbuf->pbuf; - pxmitbuf->priv_data = pxmitframe; - - pxmitframe->agg_num = 1; // alloc xmitframe should assign to 1. - #ifdef CONFIG_TX_EARLY_MODE - pxmitframe->pkt_offset = (PACKET_OFFSET_SZ/8)+1; // 2; // first frame of aggregation, reserve one offset for EM info ,another for usb bulk-out block check - #else - pxmitframe->pkt_offset = (PACKET_OFFSET_SZ/8); // 1; // first frame of aggregation, reserve offset - #endif - - if (rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe) == _FALSE) { - RTW_INFO("%s coalesce 1st xmitframe failed \n",__FUNCTION__); - continue; - } - - - // always return ndis_packet after rtw_xmitframe_coalesce - rtw_os_xmit_complete(padapter, pxmitframe); - - break; - } while (1); - - //3 2. aggregate same priority and same DA(AP or STA) frames - pfirstframe = pxmitframe; - len = xmitframe_need_length(pfirstframe) + TXDESC_SIZE+(pfirstframe->pkt_offset*PACKET_OFFSET_SZ); - pbuf_tail = len; - pbuf = _RND8(pbuf_tail); - - // check pkt amount in one bulk - descCount = 0; - bulkPtr = bulkSize; - if (pbuf < bulkPtr) - descCount++; - if (descCount == pHalData->UsbTxAggDescNum) - goto agg_end; - else { - descCount = 0; - bulkPtr = ((pbuf / bulkSize) + 1) * bulkSize; // round to next bulkSize - } - - // dequeue same priority packet from station tx queue - psta = pfirstframe->attrib.psta; - switch (pfirstframe->attrib.priority) { - case 1: - case 2: - ptxservq = &(psta->sta_xmitpriv.bk_q); - phwxmit = pxmitpriv->hwxmits + 3; - break; - - case 4: - case 5: - ptxservq = &(psta->sta_xmitpriv.vi_q); - phwxmit = pxmitpriv->hwxmits + 1; - break; - - case 6: - case 7: - ptxservq = &(psta->sta_xmitpriv.vo_q); - phwxmit = pxmitpriv->hwxmits; - break; - - case 0: - case 3: - default: - ptxservq = &(psta->sta_xmitpriv.be_q); - phwxmit = pxmitpriv->hwxmits + 2; - break; - } -//RTW_INFO("==> pkt_no=%d,pkt_len=%d,len=%d,RND8_LEN=%d,pkt_offset=0x%02x\n", - //pxmitframe->agg_num,pxmitframe->attrib.last_txcmdsz,len,pbuf,pxmitframe->pkt_offset ); - - - _enter_critical_bh(&pxmitpriv->lock, &irqL); - - sta_phead = get_list_head(phwxmit->sta_queue); - sta_plist = get_next(sta_phead); - single_sta_in_queue = rtw_end_of_queue_search(sta_phead, get_next(sta_plist)); - - xmitframe_phead = get_list_head(&ptxservq->sta_pending); - xmitframe_plist = get_next(xmitframe_phead); - - while (rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist) == _FALSE) { - pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list); - xmitframe_plist = get_next(xmitframe_plist); - - if(_FAIL == rtw_hal_busagg_qsel_check(padapter,pfirstframe->attrib.qsel,pxmitframe->attrib.qsel)) - break; - - pxmitframe->agg_num = 0; // not first frame of aggregation - #ifdef CONFIG_TX_EARLY_MODE - pxmitframe->pkt_offset = 1;// not first frame of aggregation,reserve offset for EM Info - #else - pxmitframe->pkt_offset = 0; // not first frame of aggregation, no need to reserve offset - #endif - - len = xmitframe_need_length(pxmitframe) + TXDESC_SIZE +(pxmitframe->pkt_offset*PACKET_OFFSET_SZ); - - if (_RND8(pbuf + len) > MAX_XMITBUF_SZ) - //if (_RND8(pbuf + len) > (MAX_XMITBUF_SZ/2))//to do : for TX TP finial tune , Georgia 2012-0323 - { - //RTW_INFO("%s....len> MAX_XMITBUF_SZ\n",__FUNCTION__); - pxmitframe->agg_num = 1; - pxmitframe->pkt_offset = 1; - break; - } - rtw_list_delete(&pxmitframe->list); - ptxservq->qcnt--; - phwxmit->accnt--; - -#ifndef IDEA_CONDITION - // suppose only data frames would be in queue - if (pxmitframe->frame_tag != DATA_FRAMETAG) { - RT_TRACE(_module_rtl8192c_xmit_c_, _drv_err_, - ("xmitframe_complete: frame tag(%d) is not DATA_FRAMETAG(%d)!\n", - pxmitframe->frame_tag, DATA_FRAMETAG)); - rtw_free_xmitframe(pxmitpriv, pxmitframe); - continue; - } - - // TID 0~15 - if ((pxmitframe->attrib.priority < 0) || - (pxmitframe->attrib.priority > 15)) { - RT_TRACE(_module_rtl8192c_xmit_c_, _drv_err_, - ("xmitframe_complete: TID(%d) should be 0~15!\n", - pxmitframe->attrib.priority)); - rtw_free_xmitframe(pxmitpriv, pxmitframe); - continue; - } -#endif - -// pxmitframe->pxmitbuf = pxmitbuf; - pxmitframe->buf_addr = pxmitbuf->pbuf + pbuf; - - if (rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe) == _FALSE) { - RTW_INFO("%s coalesce failed \n",__FUNCTION__); - rtw_free_xmitframe(pxmitpriv, pxmitframe); - continue; - } - - //RTW_INFO("==> pxmitframe->attrib.priority:%d\n",pxmitframe->attrib.priority); - // always return ndis_packet after rtw_xmitframe_coalesce - rtw_os_xmit_complete(padapter, pxmitframe); - - // (len - TXDESC_SIZE) == pxmitframe->attrib.last_txcmdsz - update_txdesc(pxmitframe, pxmitframe->buf_addr, pxmitframe->attrib.last_txcmdsz,_TRUE); - - // don't need xmitframe any more - rtw_free_xmitframe(pxmitpriv, pxmitframe); - - // handle pointer and stop condition - pbuf_tail = pbuf + len; - pbuf = _RND8(pbuf_tail); - - - pfirstframe->agg_num++; -#ifdef CONFIG_TX_EARLY_MODE - pxmitpriv->agg_pkt[pfirstframe->agg_num-1].offset = _RND8(len); - pxmitpriv->agg_pkt[pfirstframe->agg_num-1].pkt_len = pxmitframe->attrib.last_txcmdsz; -#endif - if (MAX_TX_AGG_PACKET_NUMBER == pfirstframe->agg_num) - break; - - if (pbuf < bulkPtr) { - descCount++; - if (descCount == pHalData->UsbTxAggDescNum) - break; - } else { - descCount = 0; - bulkPtr = ((pbuf / bulkSize) + 1) * bulkSize; - } - }//end while( aggregate same priority and same DA(AP or STA) frames) - if (_rtw_queue_empty(&ptxservq->sta_pending) == _TRUE) - rtw_list_delete(&ptxservq->tx_pending); - else if (single_sta_in_queue == _FALSE) { - /* Re-arrange the order of stations in this ac queue to balance the service for these stations */ - rtw_list_delete(&ptxservq->tx_pending); - rtw_list_insert_tail(&ptxservq->tx_pending, get_list_head(phwxmit->sta_queue)); - } - - _exit_critical_bh(&pxmitpriv->lock, &irqL); -agg_end: -#ifdef CONFIG_80211N_HT - if ((pfirstframe->attrib.ether_type != 0x0806) && - (pfirstframe->attrib.ether_type != 0x888e) && - (pfirstframe->attrib.ether_type != 0x88b4) && - (pfirstframe->attrib.dhcp_pkt != 1)) - { - rtw_issue_addbareq_cmd(padapter, pfirstframe); - } -#endif //CONFIG_80211N_HT -#ifndef CONFIG_USE_USB_BUFFER_ALLOC_TX - //3 3. update first frame txdesc - if ((PACKET_OFFSET_SZ != 0) && ((pbuf_tail % bulkSize) == 0)) { - // remove pkt_offset - pbuf_tail -= PACKET_OFFSET_SZ; - pfirstframe->buf_addr += PACKET_OFFSET_SZ; - pfirstframe->pkt_offset--; - //RTW_INFO("$$$$$ buf size equal to USB block size $$$$$$\n"); - } -#endif // CONFIG_USE_USB_BUFFER_ALLOC_TX - - update_txdesc(pfirstframe, pfirstframe->buf_addr, pfirstframe->attrib.last_txcmdsz,_TRUE); - - #ifdef CONFIG_TX_EARLY_MODE - //prepare EM info for first frame, agg_num value start from 1 - pxmitpriv->agg_pkt[0].offset = _RND8(pfirstframe->attrib.last_txcmdsz +TXDESC_SIZE +(pfirstframe->pkt_offset*PACKET_OFFSET_SZ)); - pxmitpriv->agg_pkt[0].pkt_len = pfirstframe->attrib.last_txcmdsz;//get from rtw_xmitframe_coalesce - - UpdateEarlyModeInfo8812(pxmitpriv,pxmitbuf ); - #endif - - //3 4. write xmit buffer to USB FIFO - ff_hwaddr = rtw_get_ff_hwaddr(pfirstframe); -//RTW_INFO("%s ===================================== write port,buf_size(%d) \n",__FUNCTION__,pbuf_tail); - // xmit address == ((xmit_frame*)pxmitbuf->priv_data)->buf_addr - rtw_write_port(padapter, ff_hwaddr, pbuf_tail, (u8*)pxmitbuf); - - - //3 5. update statisitc - pbuf_tail -= (pfirstframe->agg_num * TXDESC_SIZE); - pbuf_tail -= (pfirstframe->pkt_offset * PACKET_OFFSET_SZ); - - - rtw_count_tx_stats(padapter, pfirstframe, pbuf_tail); - - rtw_free_xmitframe(pxmitpriv, pfirstframe); - - return _TRUE; -} - -#else //CONFIG_USB_TX_AGGREGATION - -s32 rtl8814au_xmitframe_complete(_adapter *padapter, struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf) -{ - - struct hw_xmit *phwxmits; - sint hwentry; - struct xmit_frame *pxmitframe=NULL; - int res=_SUCCESS, xcnt = 0; - - phwxmits = pxmitpriv->hwxmits; - hwentry = pxmitpriv->hwxmit_entry; - - RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("xmitframe_complete()\n")); - - if(pxmitbuf==NULL) - { - pxmitbuf = rtw_alloc_xmitbuf(pxmitpriv); - if(!pxmitbuf) - { - return _FALSE; - } - } - - - do - { - pxmitframe = rtw_dequeue_xframe(pxmitpriv, phwxmits, hwentry); - - if(pxmitframe) - { - pxmitframe->pxmitbuf = pxmitbuf; - - pxmitframe->buf_addr = pxmitbuf->pbuf; - - pxmitbuf->priv_data = pxmitframe; - - if((pxmitframe->frame_tag&0x0f) == DATA_FRAMETAG) - { - if(pxmitframe->attrib.priority<=15)//TID0~15 - { - res = rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe); - } - //RTW_INFO("==> pxmitframe->attrib.priority:%d\n",pxmitframe->attrib.priority); - rtw_os_xmit_complete(padapter, pxmitframe);//always return ndis_packet after rtw_xmitframe_coalesce - } - - - RTW_DBG("xmitframe_complete(): rtw_dump_xframe\n"); - - - if(res == _SUCCESS) - { - rtw_dump_xframe(padapter, pxmitframe); - } - else - { - rtw_free_xmitbuf(pxmitpriv, pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pxmitframe); - } - - xcnt++; - - } - else - { - rtw_free_xmitbuf(pxmitpriv, pxmitbuf); - return _FALSE; - } - - break; - - }while(0/*xcnt < (NR_XMITFRAME >> 3)*/); - - return _TRUE; - -} -#endif - - - -static s32 xmitframe_direct(_adapter *padapter, struct xmit_frame *pxmitframe) -{ - s32 res = _SUCCESS; -//RTW_INFO("==> %s \n",__FUNCTION__); - - res = rtw_xmitframe_coalesce(padapter, pxmitframe->pkt, pxmitframe); - if (res == _SUCCESS) { - rtw_dump_xframe(padapter, pxmitframe); - } - else{ - RTW_INFO("==> %s xmitframe_coalsece failed\n",__FUNCTION__); - } - - return res; -} - -/* - * Return - * _TRUE dump packet directly - * _FALSE enqueue packet - */ -static s32 pre_xmitframe(_adapter *padapter, struct xmit_frame *pxmitframe) -{ - _irqL irqL; - s32 res; - struct xmit_buf *pxmitbuf = NULL; - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - struct pkt_attrib *pattrib = &pxmitframe->attrib; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - u8 lg_sta_num; - - _enter_critical_bh(&pxmitpriv->lock, &irqL); - - if (rtw_txframes_sta_ac_pending(padapter, pattrib) > 0) - { - //RTW_INFO("enqueue AC(%d)\n",pattrib->priority); - goto enqueue; - } - - if (rtw_xmit_ac_blocked(padapter) == _TRUE) - goto enqueue; - - if (padapter->dvobj->iface_state.lg_sta_num) - goto enqueue; - - pxmitbuf = rtw_alloc_xmitbuf(pxmitpriv); - if (pxmitbuf == NULL) - goto enqueue; - - _exit_critical_bh(&pxmitpriv->lock, &irqL); - - pxmitframe->pxmitbuf = pxmitbuf; - pxmitframe->buf_addr = pxmitbuf->pbuf; - pxmitbuf->priv_data = pxmitframe; - - if (xmitframe_direct(padapter, pxmitframe) != _SUCCESS) { - rtw_free_xmitbuf(pxmitpriv, pxmitbuf); - rtw_free_xmitframe(pxmitpriv, pxmitframe); - } - - return _TRUE; - -enqueue: - res = rtw_xmitframe_enqueue(padapter, pxmitframe); - _exit_critical_bh(&pxmitpriv->lock, &irqL); - - if (res != _SUCCESS) { - RTW_ERR("pre_xmitframe: enqueue xmitframe fail\n"); - rtw_free_xmitframe(pxmitpriv, pxmitframe); - - pxmitpriv->tx_drop++; - return _TRUE; - } - - return _FALSE; -} - -s32 rtl8814au_mgnt_xmit(_adapter *padapter, struct xmit_frame *pmgntframe) -{ - return rtw_dump_xframe(padapter, pmgntframe); -} - -/* - * Return - * _TRUE dump packet directly ok - * _FALSE temporary can't transmit packets to hardware - */ -s32 rtl8814au_hal_xmit(_adapter *padapter, struct xmit_frame *pxmitframe) -{ - return pre_xmitframe(padapter, pxmitframe); -} - -s32 rtl8814au_hal_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe) -{ - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - s32 err; - - if ((err=rtw_xmitframe_enqueue(padapter, pxmitframe)) != _SUCCESS) - { - rtw_free_xmitframe(pxmitpriv, pxmitframe); - - pxmitpriv->tx_drop++; - } - else - { -#ifdef PLATFORM_LINUX - tasklet_hi_schedule(&pxmitpriv->xmit_tasklet); -#endif - } - - return err; - -} - - -#ifdef CONFIG_HOSTAPD_MLME - -static void rtl8814au_hostap_mgnt_xmit_cb(struct urb *urb) -{ -#ifdef PLATFORM_LINUX - struct sk_buff *skb = (struct sk_buff *)urb->context; - - //RTW_INFO("%s\n", __FUNCTION__); - - rtw_skb_free(skb); -#endif -} - -s32 rtl8814au_hostap_mgnt_xmit_entry(_adapter *padapter, _pkt *pkt) -{ -#ifdef PLATFORM_LINUX - u16 fc; - int rc, len, pipe; - unsigned int bmcst, tid, qsel; - struct sk_buff *skb, *pxmit_skb; - struct urb *urb; - unsigned char *pxmitbuf; - struct tx_desc *ptxdesc; - struct rtw_ieee80211_hdr *tx_hdr; - struct hostapd_priv *phostapdpriv = padapter->phostapdpriv; - struct net_device *pnetdev = padapter->pnetdev; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct dvobj_priv *pdvobj = adapter_to_dvobj(padapter); - - - //RTW_INFO("%s\n", __FUNCTION__); - - skb = pkt; - - len = skb->len; - tx_hdr = (struct rtw_ieee80211_hdr *)(skb->data); - fc = le16_to_cpu(tx_hdr->frame_ctl); - bmcst = IS_MCAST(tx_hdr->addr1); - - if ((fc & RTW_IEEE80211_FCTL_FTYPE) != RTW_IEEE80211_FTYPE_MGMT) - goto _exit; - - pxmit_skb = rtw_skb_alloc(len + TXDESC_SIZE); - - if(!pxmit_skb) - goto _exit; - - pxmitbuf = pxmit_skb->data; - - urb = usb_alloc_urb(0, GFP_ATOMIC); - if (!urb) { - goto _exit; - } - - // ----- fill tx desc ----- - ptxdesc = (struct tx_desc *)pxmitbuf; - _rtw_memset(ptxdesc, 0, sizeof(*ptxdesc)); - - //offset 0 - ptxdesc->txdw0 |= cpu_to_le32(len&0x0000ffff); - ptxdesc->txdw0 |= cpu_to_le32(((TXDESC_SIZE+OFFSET_SZ)<txdw0 |= cpu_to_le32(OWN | FSG | LSG); - - if(bmcst) - { - ptxdesc->txdw0 |= cpu_to_le32(BIT(24)); - } - - //offset 4 - ptxdesc->txdw1 |= cpu_to_le32(0x00);//MAC_ID - - ptxdesc->txdw1 |= cpu_to_le32((0x12<txdw1 |= cpu_to_le32((0x06<< 16) & 0x000f0000);//b mode - - //offset 8 - - //offset 12 - ptxdesc->txdw3 |= cpu_to_le32((le16_to_cpu(tx_hdr->seq_ctl)<<16)&0xffff0000); - - //offset 16 - ptxdesc->txdw4 |= cpu_to_le32(BIT(8));//driver uses rate - - //offset 20 - - - //HW append seq - ptxdesc->txdw4 |= cpu_to_le32(BIT(7)); // Hw set sequence number - ptxdesc->txdw3 |= cpu_to_le32((8 <<28)); //set bit3 to 1. Suugested by TimChen. 2009.12.29. - - - rtl8188eu_cal_txdesc_chksum(ptxdesc); - // ----- end of fill tx desc ----- - - // - skb_put(pxmit_skb, len + TXDESC_SIZE); - pxmitbuf = pxmitbuf + TXDESC_SIZE; - _rtw_memcpy(pxmitbuf, skb->data, len); - - //RTW_INFO("mgnt_xmit, len=%x\n", pxmit_skb->len); - - - // ----- prepare urb for submit ----- - - //translate DMA FIFO addr to pipehandle - //pipe = ffaddr2pipehdl(pdvobj, MGT_QUEUE_INX); - pipe = usb_sndbulkpipe(pdvobj->pusbdev, pHalData->Queue2EPNum[(u8)MGT_QUEUE_INX]&0x0f); - - usb_fill_bulk_urb(urb, pdvobj->pusbdev, pipe, - pxmit_skb->data, pxmit_skb->len, rtl8192cu_hostap_mgnt_xmit_cb, pxmit_skb); - - urb->transfer_flags |= URB_ZERO_PACKET; - usb_anchor_urb(urb, &phostapdpriv->anchored); - rc = usb_submit_urb(urb, GFP_ATOMIC); - if (rc < 0) { - usb_unanchor_urb(urb); - kfree_skb(skb); - } - usb_free_urb(urb); - - -_exit: - - rtw_skb_free(skb); - -#endif - - return 0; - -} -#endif - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/usb/usb_halinit.c b/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/usb/usb_halinit.c deleted file mode 100644 index 2d4bdbba19c170..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/usb/usb_halinit.c +++ /dev/null @@ -1,2407 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2011 Realtek Corporation. 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 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 _HCI_HAL_INIT_C_ - -/* #include */ -#include - -#ifndef CONFIG_USB_HCI - - #error "CONFIG_USB_HCI shall be on!\n" - -#endif - - -static VOID -_ConfigChipOutEP_8814( - IN PADAPTER pAdapter, - IN u8 NumOutPipe -) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - - - pHalData->OutEpQueueSel = 0; - pHalData->OutEpNumber = 0; - - switch (NumOutPipe) { - case 4: - pHalData->OutEpQueueSel = TX_SELE_HQ | TX_SELE_LQ | TX_SELE_NQ | TX_SELE_EQ; - pHalData->OutEpNumber = 4; - break; - case 3: - pHalData->OutEpQueueSel = TX_SELE_HQ | TX_SELE_LQ | TX_SELE_NQ; - pHalData->OutEpNumber = 3; - break; - case 2: - pHalData->OutEpQueueSel = TX_SELE_HQ | TX_SELE_NQ; - pHalData->OutEpNumber = 2; - break; - case 1: - pHalData->OutEpQueueSel = TX_SELE_HQ; - pHalData->OutEpNumber = 1; - break; - default: - break; - - } - RTW_INFO("%s OutEpQueueSel(0x%02x), OutEpNumber(%d)\n", __FUNCTION__, pHalData->OutEpQueueSel, pHalData->OutEpNumber); - -} - -static BOOLEAN HalUsbSetQueuePipeMapping8814AUsb( - IN PADAPTER pAdapter, - IN u8 NumInPipe, - IN u8 NumOutPipe -) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - BOOLEAN result = _FALSE; - - _ConfigChipOutEP_8814(pAdapter, NumOutPipe); - - // Normal chip with one IN and one OUT doesn't have interrupt IN EP. - if(1 == pHalData->OutEpNumber){ - if(1 != NumInPipe){ - return result; - } - } - - // All config other than above support one Bulk IN and one Interrupt IN. - //if(2 != NumInPipe){ - // return result; - //} - - result = Hal_MappingOutPipe(pAdapter, NumOutPipe); - - return result; - -} - -void rtl8814au_interface_configure(_adapter *padapter) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter); - - if (IS_SUPER_SPEED_USB(padapter)) - { - pHalData->UsbBulkOutSize = USB_SUPER_SPEED_BULK_SIZE;//1024 bytes - } - else if (IS_HIGH_SPEED_USB(padapter)) - { - pHalData->UsbBulkOutSize = USB_HIGH_SPEED_BULK_SIZE;//512 bytes - } - else - { - pHalData->UsbBulkOutSize = USB_FULL_SPEED_BULK_SIZE;//64 bytes - } - - pHalData->interfaceIndex = pdvobjpriv->InterfaceNumber; - -#ifdef CONFIG_USB_TX_AGGREGATION - pHalData->UsbTxAggMode = 1; - pHalData->UsbTxAggDescNum = 3; /* only 4 bits */ -#endif //CONFIG_USB_TX_AGGREGATION - -#ifdef CONFIG_USB_RX_AGGREGATION - pHalData->rxagg_mode = RX_AGG_DMA; //todo: change to USB_RX_AGG_DMA; - pHalData->rxagg_usb_size = 8; //unit : 512b - pHalData->rxagg_usb_timeout = 0x6; - pHalData->rxagg_dma_size = 16; //uint :128 b //0x0A; // 10 = MAX_RX_DMA_BUFFER_SIZE/2/pHalData->UsbBulkOutSize - pHalData->rxagg_dma_timeout = 0x6; //6, absolute time = 34ms/(2^6) - - if (IS_SUPER_SPEED_USB(padapter)) { - pHalData->rxagg_usb_size = 0x7; - pHalData->rxagg_usb_timeout = 0x1a; - } else { -#ifdef CONFIG_PREALLOC_RX_SKB_BUFFER - u32 remainder = 0; - u8 quotient = 0; - - remainder = MAX_RECVBUF_SZ % (4 * 1024); - quotient = (u8)(MAX_RECVBUF_SZ >> 12); - - if (quotient > 5) { - pHalData->rxagg_usb_size = 0x5; - pHalData->rxagg_usb_timeout = 0x20; - } else { - if (remainder >= 2048) { - pHalData->rxagg_usb_size = quotient; - pHalData->rxagg_usb_timeout = 0x10; - } else { - pHalData->rxagg_usb_size = (quotient - 1); - pHalData->rxagg_usb_timeout = 0x10; - } - } -#else /* !CONFIG_PREALLOC_RX_SKB_BUFFER */ - //the setting to reduce RX FIFO overflow on USB2.0 and increase rx throughput - pHalData->rxagg_dma_size = 0x5; - pHalData->rxagg_usb_timeout = 0x20; -#endif /* CONFIG_PREALLOC_RX_SKB_BUFFER */ - } -#endif //CONFIG_USB_RX_AGGREGATION - - HalUsbSetQueuePipeMapping8814AUsb(padapter, - pdvobjpriv->RtNumInPipes, pdvobjpriv->RtNumOutPipes); - -} - -static VOID -_InitBurstPktLen(IN PADAPTER Adapter) -{ - u8 u1bTmp; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - //yx_qi 131128 move to 0x1448, 144c - rtw_write32(Adapter, REG_FAST_EDCA_VOVI_SETTING_8814A, 0x08070807); //yx_qi 131128 - rtw_write32(Adapter, REG_FAST_EDCA_BEBK_SETTING_8814A, 0x08070807); //yx_qi 131128 - - u1bTmp = rtw_read8(Adapter, 0xff); //check device operation speed: SS 0xff bit7 - - if(u1bTmp & BIT7) //USB2/1.1 Mode - { - pHalData->bSupportUSB3 = FALSE; - } - else //USB3 Mode - { - pHalData->bSupportUSB3 = TRUE; - } - - if(pHalData->bSupportUSB3 == _FALSE) //USB2/1.1 Mode - { - if(pHalData->UsbBulkOutSize == 512) - { - //set burst pkt len=512B - rtw_write8(Adapter, REG_RXDMA_MODE_8814A, 0x1e); - } - else - { - //set burst pkt len=64B - rtw_write8(Adapter, REG_RXDMA_MODE_8814A, 0x2e); - } - - rtw_write16(Adapter, REG_RXDMA_AGG_PG_TH_8814A,0x2005); //dmc agg th 20K - } - else //USB3 Mode - { - //set burst pkt len=1k - rtw_write8(Adapter, REG_RXDMA_MODE_8814A, 0x0e); - rtw_write16(Adapter, REG_RXDMA_AGG_PG_TH_8814A,0x0a05); //dmc agg th 20K - - // set Reg 0xf008[3:4] to 2'00 to disable U1/U2 Mode to avoid 2.5G spur in USB3.0. added by page, 20120712 - rtw_write8(Adapter, 0xf008, rtw_read8(Adapter, 0xf008)&0xE7); - //to avoid usb 3.0 H2C fail - rtw_write16(Adapter, 0xf002, 0); - - rtw_write8(Adapter, REG_SW_AMPDU_BURST_MODE_CTRL_8814A, rtw_read8(Adapter, REG_SW_AMPDU_BURST_MODE_CTRL_8814A) & ~BIT(6)); - RTW_INFO("turn off the LDPC pre-TX\n"); - - } - - if(pHalData->AMPDUBurstMode) - { - rtw_write8(Adapter,REG_SW_AMPDU_BURST_MODE_CTRL_8814A, 0x5F); - } -} - - -VOID -_InitQueueReservedPage_8814AUsb( - IN PADAPTER Adapter - ) -{ - struct registry_priv *pregistrypriv = &Adapter->registrypriv; - u16 txpktbuf_bndy; - - RTW_INFO("===>_InitQueueReservedPage_8814AUsb()\n"); - - //---- Set Fifo page for each Queue under Mac Direct LPBK nonsec mode ------------// - rtw_write32(Adapter, REG_FIFOPAGE_INFO_1_8814A, HPQ_PGNUM_8814A); - rtw_write32(Adapter, REG_FIFOPAGE_INFO_2_8814A, LPQ_PGNUM_8814A); - rtw_write32(Adapter, REG_FIFOPAGE_INFO_3_8814A, NPQ_PGNUM_8814A); - rtw_write32(Adapter, REG_FIFOPAGE_INFO_4_8814A, EPQ_PGNUM_8814A); - - rtw_write32(Adapter, REG_FIFOPAGE_INFO_5_8814A, PUB_PGNUM_8814A); - - rtw_write32(Adapter, REG_RQPN_CTRL_2_8814A, 0x80000000); - - if(!pregistrypriv->wifi_spec) - txpktbuf_bndy = TX_PAGE_BOUNDARY_8814A; - else // for WMM - txpktbuf_bndy = WMM_NORMAL_TX_PAGE_BOUNDARY_8814A; - - //Set page boundary and header - rtw_write16(Adapter,REG_TXPKTBUF_BCNQ_BDNY_8814A, txpktbuf_bndy); - rtw_write16(Adapter,REG_TXPKTBUF_BCNQ1_BDNY_8814A, txpktbuf_bndy); - rtw_write16(Adapter,REG_MGQ_PGBNDY_8814A, txpktbuf_bndy); - - //Set The head page of packet of Bcnq - rtw_write16(Adapter,REG_FIFOPAGE_CTRL_2_8814A, txpktbuf_bndy); - //The head page of packet of Bcnq1 - rtw_write16(Adapter,REG_FIFOPAGE_CTRL_2_8814A+2,txpktbuf_bndy); - - RTW_INFO("<===_InitQueueReservedPage_8814AUsb()\n"); -} - - -static u32 _InitPowerOn_8814AU(_adapter *padapter) -{ - int status = _SUCCESS; - u16 u2btmp=0; - - // YX sugguested 2014.06.03 - u8 u1btmp = rtw_read8(padapter, 0x10C2); - rtw_write8(padapter, 0x10C2, (u1btmp | BIT1)); - - if(!HalPwrSeqCmdParsing(padapter, PWR_CUT_TESTCHIP_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK, Rtl8814A_NIC_ENABLE_FLOW)) - return _FAIL; - - - // Enable MAC DMA/WMAC/SCHEDULE/SEC block - // Set CR bit10 to enable 32k calibration. Suggested by SD1 Gimmy. Added by tynli. 2011.08.31. - rtw_write16(padapter, REG_CR_8814A, 0x00); //suggseted by zhouzhou, by page, 20111230 - u2btmp = PlatformEFIORead2Byte(padapter, REG_CR_8814A); - u2btmp |= (HCI_TXDMA_EN | HCI_RXDMA_EN | TXDMA_EN | RXDMA_EN - | PROTOCOL_EN | SCHEDULE_EN | ENSEC | CALTMR_EN); - rtw_write16(padapter, REG_CR_8814A, u2btmp); - - _InitQueueReservedPage_8814AUsb(padapter); - return status; -} - - - - - -//--------------------------------------------------------------- -// -// MAC init functions -// -//--------------------------------------------------------------- - -// Shall USB interface init this? -static VOID -_InitInterrupt_8814AU( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - // HIMR - rtw_write32(Adapter, REG_HIMR0_8814A, pHalData->IntrMask[0]&0xFFFFFFFF); - rtw_write32(Adapter, REG_HIMR1_8814A, pHalData->IntrMask[1]&0xFFFFFFFF); -} - -static void _InitID_8814A(IN PADAPTER Adapter) -{ -// hal_init_macaddr(Adapter);//set mac_address - //rtw_restore_mac_addr(Adapter); -} - -static VOID -_InitPageBoundary_8814AUsb( - IN PADAPTER Adapter - ) -{ - //20130416 KaiYuan modified for 8814 - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - rtw_write16(Adapter, REG_RXFF_PTR_8814A, RX_DMA_BOUNDARY_8814A); //yx_qi 20140331 - -} - - -static VOID -_InitNormalChipRegPriority_8814AUsb( - IN PADAPTER Adapter, - IN u16 beQ, - IN u16 bkQ, - IN u16 viQ, - IN u16 voQ, - IN u16 mgtQ, - IN u16 hiQ - ) -{ - u16 value16 = (PlatformEFIORead2Byte(Adapter, REG_TRXDMA_CTRL_8814A) & 0x7); - - value16 |= _TXDMA_BEQ_MAP(beQ) | _TXDMA_BKQ_MAP(bkQ) | - _TXDMA_VIQ_MAP(viQ) | _TXDMA_VOQ_MAP(voQ) | - _TXDMA_MGQ_MAP(mgtQ)| _TXDMA_HIQ_MAP(hiQ) | BIT2; - - rtw_write16(Adapter, REG_TRXDMA_CTRL_8814A, value16); -} - -static VOID -_InitNormalChipTwoOutEpPriority_8814AUsb( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct registry_priv *pregistrypriv = &Adapter->registrypriv; - u16 beQ,bkQ,viQ,voQ,mgtQ,hiQ; - - - u16 valueHi = 0; - u16 valueLow = 0; - - switch(pHalData->OutEpQueueSel) - { - case (TX_SELE_HQ | TX_SELE_LQ): - valueHi = QUEUE_HIGH; - valueLow = QUEUE_LOW; - break; - case (TX_SELE_NQ | TX_SELE_LQ): - valueHi = QUEUE_NORMAL; - valueLow = QUEUE_LOW; - break; - case (TX_SELE_HQ | TX_SELE_NQ): - valueHi = QUEUE_HIGH; - valueLow = QUEUE_NORMAL; - break; - default: - valueHi = QUEUE_HIGH; - valueLow = QUEUE_NORMAL; - break; - } - - if(!pregistrypriv->wifi_spec){ - beQ = valueLow; - bkQ = valueLow; - viQ = valueHi; - voQ = valueHi; - mgtQ = valueHi; - hiQ = valueHi; - } - else{//for WMM ,CONFIG_OUT_EP_WIFI_MODE - beQ = valueLow; - bkQ = valueHi; - viQ = valueHi; - voQ = valueLow; - mgtQ = valueHi; - hiQ = valueHi; - } - - _InitNormalChipRegPriority_8814AUsb(Adapter,beQ,bkQ,viQ,voQ,mgtQ,hiQ); -} - -static VOID -_InitNormalChipThreeOutEpPriority_8814AUsb( - IN PADAPTER Adapter - ) -{ - struct registry_priv *pregistrypriv = &Adapter->registrypriv; - u16 beQ,bkQ,viQ,voQ,mgtQ,hiQ; - - if(!pregistrypriv->wifi_spec){// typical setting - beQ = QUEUE_LOW; - bkQ = QUEUE_LOW; - viQ = QUEUE_NORMAL; - voQ = QUEUE_HIGH; - mgtQ = QUEUE_HIGH; - hiQ = QUEUE_HIGH; - } - else{// for WMM - beQ = QUEUE_LOW; - bkQ = QUEUE_NORMAL; - viQ = QUEUE_NORMAL; - voQ = QUEUE_HIGH; - mgtQ = QUEUE_HIGH; - hiQ = QUEUE_HIGH; - } - _InitNormalChipRegPriority_8814AUsb(Adapter,beQ,bkQ,viQ,voQ,mgtQ,hiQ); -} - -static VOID -_InitQueuePriority_8814AUsb( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - switch(pHalData->OutEpNumber) - { - case 2: - _InitNormalChipTwoOutEpPriority_8814AUsb(Adapter); - break; - case 3: - case 4: - _InitNormalChipThreeOutEpPriority_8814AUsb(Adapter); - break; - default: - RTW_INFO("_InitQueuePriority_8814AUsb(): Shall not reach here!\n"); - break; - } -} - - - -static VOID -_InitHardwareDropIncorrectBulkOut_8814A( - IN PADAPTER Adapter - ) -{ -#ifdef ENABLE_USB_DROP_INCORRECT_OUT - u32 value32 = rtw_read32(Adapter, REG_TXDMA_OFFSET_CHK); - value32 |= DROP_DATA_EN; - rtw_write32(Adapter, REG_TXDMA_OFFSET_CHK, value32); -#endif //ENABLE_USB_DROP_INCORRECT_OUT -} - -static VOID -_InitNetworkType_8814A( - IN PADAPTER Adapter - ) -{ - u32 value32; - - value32 = rtw_read32(Adapter, REG_CR); - // TODO: use the other function to set network type - value32 = (value32 & ~MASK_NETTYPE) | _NETTYPE(NT_LINK_AP); - - rtw_write32(Adapter, REG_CR, value32); -} - -static VOID -_InitTransferPageSize_8814AUsb( - IN PADAPTER Adapter - ) -{ - //8814 doesn't need this by Alex -} - -static VOID -_InitDriverInfoSize_8814A( - IN PADAPTER Adapter, - IN u8 drvInfoSize - ) -{ - rtw_write8(Adapter,REG_RX_DRVINFO_SZ, drvInfoSize); -} -/* -static VOID -_InitWMACSetting_8814A( - IN PADAPTER Adapter - ) -{ - //u32 value32; - u16 value16; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - //pHalData->ReceiveConfig = AAP | APM | AM | AB | APP_ICV | ADF | AMF | APP_FCS | HTC_LOC_CTRL | APP_MIC | APP_PHYSTS; - pHalData->ReceiveConfig = - RCR_APM | RCR_AM | RCR_AB |RCR_CBSSID_DATA| RCR_CBSSID_BCN| RCR_APP_ICV | RCR_AMF | RCR_HTC_LOC_CTRL | RCR_APP_MIC | RCR_APP_PHYST_RXFF; - -#if (1 == RTL8812A_RX_PACKET_INCLUDE_CRC) - pHalData->ReceiveConfig |= ACRC32; -#endif //(1 == RTL8812A_RX_PACKET_INCLUDE_CRC) - -#ifdef CONFIG_RX_PACKET_APPEND_FCS - pHalData->ReceiveConfig |= RCR_APPFCS; -#endif //CONFIG_RX_PACKET_APPEND_FCS - - pHalData->ReceiveConfig |= FORCEACK; - - // some REG_RCR will be modified later by phy_ConfigMACWithHeaderFile() - rtw_write32(Adapter, REG_RCR, pHalData->ReceiveConfig); - - // Accept all multicast address - rtw_write32(Adapter, REG_MAR, 0xFFFFFFFF); - rtw_write32(Adapter, REG_MAR + 4, 0xFFFFFFFF); - - - // Accept all data frames - //value16 = 0xFFFF; - //rtw_write16(Adapter, REG_RXFLTMAP2, value16); - - // 2010.09.08 hpfan - // Since ADF is removed from RCR, ps-poll will not be indicate to driver, - // RxFilterMap should mask ps-poll to gurantee AP mode can rx ps-poll. - value16 = BIT10; -#ifdef CONFIG_BEAMFORMING - // NDPA packet subtype is 0x0101 - value16 |= BIT5; -#endif - rtw_write16(Adapter, REG_RXFLTMAP1, value16); - - // Accept all management frames - //value16 = 0xFFFF; - //rtw_write16(Adapter, REG_RXFLTMAP0, value16); - - //enable RX_SHIFT bits - //rtw_write8(Adapter, REG_TRXDMA_CTRL, rtw_read8(Adapter, REG_TRXDMA_CTRL)|BIT(1)); - -} -*/ - -//old _InitWMACSetting_8812A + _InitAdaptiveCtrl_8812AUsb = new _InitMacConfigure_8814A -static VOID -_InitMacConfigure_8814A( - IN PADAPTER Adapter - ) -{ - u16 value16; - u32 regRRSR; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - switch (Adapter->registrypriv.wireless_mode) - { - case WIRELESS_11B: - regRRSR = RATE_ALL_CCK; - break; - - case WIRELESS_11G: - case WIRELESS_11A: - case WIRELESS_11_5N: - case WIRELESS_11A_5N://Todo: no basic rate for ofdm ? - case WIRELESS_11_5AC: - regRRSR = RATE_ALL_OFDM_AG; - break; - - case WIRELESS_11BG: - case WIRELESS_11G_24N: - case WIRELESS_11_24N: - case WIRELESS_11BG_24N: - default: - regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG; - break; - - } - - // Init value for RRSR. - rtw_write32(Adapter, REG_RRSR, regRRSR); - - // Retry Limit - value16 = BIT_LRL(0x30) | BIT_SRL(0x30); - rtw_write16(Adapter, REG_RETRY_LIMIT, value16); - - pHalData->ReceiveConfig = RCR_APM | RCR_AM | RCR_AB |RCR_CBSSID_DATA| RCR_CBSSID_BCN| RCR_APP_ICV | RCR_AMF | RCR_HTC_LOC_CTRL | RCR_APP_MIC | RCR_APP_PHYST_RXFF; - pHalData->ReceiveConfig |= FORCEACK; -#if (1 == RTL8812A_RX_PACKET_INCLUDE_CRC) - pHalData->ReceiveConfig |= ACRC32; -#endif //(1 == RTL8812A_RX_PACKET_INCLUDE_CRC) - -#ifdef CONFIG_RX_PACKET_APPEND_FCS - pHalData->ReceiveConfig |= RCR_APPFCS; -#endif //CONFIG_RX_PACKET_APPEND_FCS - rtw_write32(Adapter, REG_RCR, pHalData->ReceiveConfig); - - // 2010.09.08 hpfan - // Since ADF is removed from RCR, ps-poll will not be indicate to driver, - // RxFilterMap should mask ps-poll to gurantee AP mode can rx ps-poll. - value16 = BIT10; -#ifdef CONFIG_BEAMFORMING - // NDPA packet subtype is 0x0101 - value16 |= BIT5; -#endif /*CONFIG_BEAMFORMING*/ - rtw_write16(Adapter, REG_RXFLTMAP1, value16); - - // 201409/25 MH When RA is enabled, we need to reduce the value. - rtw_write8(Adapter, REG_MAX_AGGR_NUM_8814A, 0x36); - rtw_write8(Adapter, REG_RTS_MAX_AGGR_NUM_8814A,0x36); - -} - -/* -static VOID -_InitAdaptiveCtrl_8812AUsb( - IN PADAPTER Adapter - ) -{ - u16 value16; - u32 value32; - - // Response Rate Set - value32 = rtw_read32(Adapter, REG_RRSR); - value32 &= ~RATE_BITMAP_ALL; - - if(Adapter->registrypriv.wireless_mode & WIRELESS_11B) - value32 |= RATE_RRSR_CCK_ONLY_1M; - else - value32 |= RATE_RRSR_WITHOUT_CCK; - - value32 |= RATE_RRSR_CCK_ONLY_1M; - rtw_write32(Adapter, REG_RRSR, value32); - - // CF-END Threshold - //m_spIoBase->rtw_write8(REG_CFEND_TH, 0x1); - - // SIFS (used in NAV) - value16 = _SPEC_SIFS_CCK(0x10) | _SPEC_SIFS_OFDM(0x10); - rtw_write16(Adapter, REG_SPEC_SIFS, value16); - - // Retry Limit - value16 = _LRL(0x30) | _SRL(0x30); - rtw_write16(Adapter, REG_RL, value16); - -}*/ - -static VOID -_InitEDCA_8814AUsb( - IN PADAPTER Adapter - ) -{ - // Set Spec SIFS (used in NAV) - rtw_write16(Adapter,REG_SPEC_SIFS, 0x100a); - rtw_write16(Adapter,REG_MAC_SPEC_SIFS, 0x100a); - - // Set SIFS for CCK - rtw_write16(Adapter,REG_SIFS_CTX, 0x100a); - - // Set SIFS for OFDM - rtw_write16(Adapter,REG_SIFS_TRX, 0x100a); - - // TXOP - rtw_write32(Adapter, REG_EDCA_BE_PARAM, 0x005EA42B); - rtw_write32(Adapter, REG_EDCA_BK_PARAM, 0x0000A44F); - rtw_write32(Adapter, REG_EDCA_VI_PARAM, 0x005EA324); - rtw_write32(Adapter, REG_EDCA_VO_PARAM, 0x002FA226); - - // 0x50 for 80MHz clock - //rtw_write8(Adapter, REG_USTIME_TSF, 0x50); - //rtw_write8(Adapter, REG_USTIME_EDCA, 0x50); -} - - -static VOID -_InitBeaconMaxError_8814A( - IN PADAPTER Adapter, - IN BOOLEAN InfraMode - ) -{ -#ifdef CONFIG_ADHOC_WORKAROUND_SETTING - rtw_write8(Adapter, REG_BCN_MAX_ERR, 0xFF); -#else - //rtw_write8(Adapter, REG_BCN_MAX_ERR, (InfraMode ? 0xFF : 0x10)); -#endif -} - - -#ifdef CONFIG_RTW_LED -static void _InitHWLed(PADAPTER Adapter) -{ - struct led_priv *pledpriv = adapter_to_led(Adapter); - - if( pledpriv->LedStrategy != HW_LED) - return; - -// HW led control -// to do .... -//must consider cases of antenna diversity/ commbo card/solo card/mini card - -} -#endif //CONFIG_LED - -/* -static VOID -_InitRDGSetting_8812A( - IN PADAPTER Adapter - ) -{ - rtw_write8(Adapter,REG_RD_CTRL,0xFF); - rtw_write16(Adapter, REG_RD_NAV_NXT, 0x200); - rtw_write8(Adapter,REG_RD_RESP_PKT_TH,0x05); -}*/ - -static VOID -_InitRetryFunction_8814A( - IN PADAPTER Adapter - ) -{ - u8 value8; - - value8 = rtw_read8(Adapter, REG_FWHW_TXQ_CTRL); - value8 |= EN_AMPDU_RTY_NEW; - rtw_write8(Adapter, REG_FWHW_TXQ_CTRL, value8); - - // Set ACK timeout - //rtw_write8(Adapter, REG_ACKTO, 0x40); //masked by page for BCM IOT issue temporally - rtw_write8(Adapter, REG_ACKTO, 0x80); -} - -/*----------------------------------------------------------------------------- - * Function: usb_AggSettingTxUpdate() - * - * Overview: Seperate TX/RX parameters update independent for TP detection and - * dynamic TX/RX aggreagtion parameters update. - * - * Input: PADAPTER - * - * Output/Return: NONE - * - * Revised History: - * When Who Remark - * 12/10/2010 MHC Seperate to smaller function. - * - *---------------------------------------------------------------------------*/ -static VOID -usb_AggSettingTxUpdate_8814A( - IN PADAPTER Adapter - ) -{ -#ifdef CONFIG_USB_TX_AGGREGATION - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u32 value32; - - if(Adapter->registrypriv.wifi_spec) - pHalData->UsbTxAggDescNum = 1; - - if(pHalData->UsbTxAggMode){ - value32 = rtw_read32(Adapter, REG_TDECTRL); - value32 = value32 & ~(BLK_DESC_NUM_MASK << BLK_DESC_NUM_SHIFT); - value32 |= ((pHalData->UsbTxAggDescNum & BLK_DESC_NUM_MASK) << BLK_DESC_NUM_SHIFT); - - rtw_write32(Adapter, REG_TDECTRL, value32); - rtw_write8(Adapter, REG_TDECTRL+3, pHalData->UsbTxAggDescNum<<1); - } - -#endif //CONFIG_USB_TX_AGGREGATION -} // usb_AggSettingTxUpdate - - -/*----------------------------------------------------------------------------- - * Function: usb_AggSettingRxUpdate() - * - * Overview: Seperate TX/RX parameters update independent for TP detection and - * dynamic TX/RX aggreagtion parameters update. - * - * Input: PADAPTER - * - * Output/Return: NONE - * - * Revised History: - * When Who Remark - * 12/10/2010 MHC Seperate to smaller function. - * - *---------------------------------------------------------------------------*/ -static VOID -usb_AggSettingRxUpdate_8814A( - IN PADAPTER Adapter - ) -{ -#ifdef CONFIG_USB_RX_AGGREGATION - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 valueDMA; - u8 valueUSB; - - valueDMA = rtw_read8(Adapter, REG_TRXDMA_CTRL_8814A); - valueUSB = rtw_read8(Adapter, REG_RXDMA_AGG_PG_TH_8814A+3); - switch(pHalData->rxagg_mode) - { - case RX_AGG_DMA: - valueDMA |= RXDMA_AGG_EN; - valueUSB &= ~USB_AGG_EN_8814A; //yx_qi 131128 - break; - case RX_AGG_USB: - valueDMA &= ~RXDMA_AGG_EN; - valueUSB |= USB_AGG_EN_8814A; - break; - case RX_AGG_MIX: - valueDMA |= RXDMA_AGG_EN; - valueUSB |= USB_AGG_EN_8814A; - break; - case RX_AGG_DISABLE: - default: - valueDMA &= ~RXDMA_AGG_EN; - valueUSB &= ~USB_AGG_EN_8814A; - break; - } - - rtw_write8(Adapter, REG_TRXDMA_CTRL_8814A, valueDMA); - rtw_write8(Adapter, REG_RXDMA_AGG_PG_TH_8814A+3, valueUSB); //yx_qi 131128 -#endif //CONFIG_USB_RX_AGGREGATION -} // usb_AggSettingRxUpdate - -static VOID -init_UsbAggregationSetting_8814A( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - // Tx aggregation setting - usb_AggSettingTxUpdate_8814A(Adapter); - - // Rx aggregation setting - usb_AggSettingRxUpdate_8814A(Adapter); - - // 201/12/10 MH Add for USB agg mode dynamic switch. - pHalData->UsbRxHighSpeedMode = _FALSE; - pHalData->UsbTxVeryHighSpeedMode = _FALSE; -} - -/*----------------------------------------------------------------------------- - * Function: USB_AggModeSwitch() - * - * Overview: When RX traffic is more than 40M, we need to adjust some parameters to increase - * RX speed by increasing batch indication size. This will decrease TCP ACK speed, we - * need to monitor the influence of FTP/network share. - * For TX mode, we are still ubder investigation. - * - * Input: PADAPTER - * - * Output: NONE - * - * Return: NONE - * - * Revised History: - * When Who Remark - * 12/10/2010 MHC Create Version 0. - * - *---------------------------------------------------------------------------*/ -//static VOID -//USB_AggModeSwitch( -// IN PADAPTER Adapter -// ) -//{ -#if 0 - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - - //pHalData->UsbRxHighSpeedMode = _FALSE; - // How to measure the RX speed? We assume that when traffic is more than - if (pMgntInfo->bRegAggDMEnable == _FALSE) - { - return; // Inf not support. - } - - - if (pMgntInfo->LinkDetectInfo.bHigherBusyRxTraffic == _TRUE && - pHalData->UsbRxHighSpeedMode == _FALSE) - { - pHalData->UsbRxHighSpeedMode = _TRUE; - RT_TRACE(COMP_INIT, DBG_LOUD, ("UsbAggModeSwitchCheck to HIGH\n")); - } - else if (pMgntInfo->LinkDetectInfo.bHigherBusyRxTraffic == _FALSE && - pHalData->UsbRxHighSpeedMode == _TRUE) - { - pHalData->UsbRxHighSpeedMode = _FALSE; - RT_TRACE(COMP_INIT, DBG_LOUD, ("UsbAggModeSwitchCheck to LOW\n")); - } - else - { - return; - } - - -#if USB_RX_AGGREGATION_92C - if (pHalData->UsbRxHighSpeedMode == _TRUE) - { - // 2010/12/10 MH The parameter is tested by SD1 engineer and SD3 channel emulator. - // USB mode -#if (RT_PLATFORM == PLATFORM_LINUX) - if (pMgntInfo->LinkDetectInfo.bTxBusyTraffic) - { - pHalData->RxAggBlockCount = 16; - pHalData->RxAggBlockTimeout = 7; - } - else -#endif - { - pHalData->RxAggBlockCount = 40; - pHalData->RxAggBlockTimeout = 5; - } - // Mix mode - pHalData->RxAggPageCount = 72; - pHalData->RxAggPageTimeout = 6; - } - else - { - // USB mode - pHalData->RxAggBlockCount = pMgntInfo->RegRxAggBlockCount; - pHalData->RxAggBlockTimeout = pMgntInfo->RegRxAggBlockTimeout; - // Mix mode - pHalData->RxAggPageCount = pMgntInfo->RegRxAggPageCount; - pHalData->RxAggPageTimeout = pMgntInfo->RegRxAggPageTimeout; - } - - if (pHalData->RxAggBlockCount > MAX_RX_AGG_BLKCNT) - pHalData->RxAggBlockCount = MAX_RX_AGG_BLKCNT; -#if (OS_WIN_FROM_VISTA(OS_VERSION)) || (RT_PLATFORM == PLATFORM_LINUX) // do not support WINXP to prevent usbehci.sys BSOD - if (IS_WIRELESS_MODE_N_24G(Adapter) || IS_WIRELESS_MODE_N_5G(Adapter)) - { - // - // 2010/12/24 MH According to V1012 QC IOT test, XP BSOD happen when running chariot test - // with the aggregation dynamic change!! We need to disable the function to prevent it is broken - // in usbehci.sys. - // - usb_AggSettingRxUpdate_8188E(Adapter); - - // 2010/12/27 MH According to designer's suggstion, we can only modify Timeout value. Otheriwse - // there might many HW incorrect behavior, the XP BSOD at usbehci.sys may be relative to the - // issue. Base on the newest test, we can not enable block cnt > 30, otherwise XP usbehci.sys may - // BSOD. - } -#endif - -#endif -#endif -//} // USB_AggModeSwitch - -//static VOID -//_InitOperationMode_8814A( -// IN PADAPTER Adapter -// ) -//{ -#if 0//gtest - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - u8 regBwOpMode = 0; - u32 regRATR = 0, regRRSR = 0; - - - //1 This part need to modified according to the rate set we filtered!! - // - // Set RRSR, RATR, and REG_BWOPMODE registers - // - switch(Adapter->RegWirelessMode) - { - case WIRELESS_MODE_B: - regBwOpMode = BW_OPMODE_20MHZ; - regRATR = RATE_ALL_CCK; - regRRSR = RATE_ALL_CCK; - break; - case WIRELESS_MODE_A: - regBwOpMode = BW_OPMODE_5G |BW_OPMODE_20MHZ; - regRATR = RATE_ALL_OFDM_AG; - regRRSR = RATE_ALL_OFDM_AG; - break; - case WIRELESS_MODE_G: - regBwOpMode = BW_OPMODE_20MHZ; - regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG; - regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG; - break; - case WIRELESS_MODE_AUTO: - if (Adapter->bInHctTest) - { - regBwOpMode = BW_OPMODE_20MHZ; - regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG; - regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG; - } - else - { - regBwOpMode = BW_OPMODE_20MHZ; - regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS; - regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG; - } - break; - case WIRELESS_MODE_N_24G: - // It support CCK rate by default. - // CCK rate will be filtered out only when associated AP does not support it. - regBwOpMode = BW_OPMODE_20MHZ; - regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS; - regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG; - break; - case WIRELESS_MODE_N_5G: - regBwOpMode = BW_OPMODE_5G; - regRATR = RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS; - regRRSR = RATE_ALL_OFDM_AG; - break; - - default: //for MacOSX compiler warning. - break; - } - - // Ziv ???????? - //rtw_write32(Adapter, REG_INIRTS_RATE_SEL, regRRSR); - rtw_write8(Adapter, REG_BWOPMODE, regBwOpMode); -#endif -//} - -/* -// Set CCK and OFDM Block "ON" -static VOID _BBTurnOnBlock( - IN PADAPTER Adapter - ) -{ -#if (DISABLE_BB_RF) - return; -#endif - - PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bCCKEn, 0x1); - PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bOFDMEn, 0x1); -} - - -static VOID _RfPowerSave( - IN PADAPTER Adapter - ) -{ -#if 0 - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - u8 eRFPath; - -#if (DISABLE_BB_RF) - return; -#endif - - if(pMgntInfo->RegRfOff == _TRUE){ // User disable RF via registry. - RT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, ("InitializeAdapter8192CUsb(): Turn off RF for RegRfOff.\n")); - MgntActSet_RF_State(Adapter, eRfOff, RF_CHANGE_BY_SW); - // Those action will be discard in MgntActSet_RF_State because off the same state - for(eRFPath = 0; eRFPath NumTotalRFPath; eRFPath++) - PHY_SetRFReg(Adapter, eRFPath, 0x4, 0xC00, 0x0); - } - else if(pMgntInfo->RfOffReason > RF_CHANGE_BY_PS){ // H/W or S/W RF OFF before sleep. - RT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, ("InitializeAdapter8192CUsb(): Turn off RF for RfOffReason(%ld).\n", pMgntInfo->RfOffReason)); - MgntActSet_RF_State(Adapter, eRfOff, pMgntInfo->RfOffReason); - } - else{ - pHalData->eRFPowerState = eRfOn; - pMgntInfo->RfOffReason = 0; - if(Adapter->bInSetPower || Adapter->bResetInProgress) - PlatformUsbEnableInPipes(Adapter); - RT_TRACE((COMP_INIT|COMP_RF), DBG_LOUD, ("InitializeAdapter8192CUsb(): RF is on.\n")); - } -#endif -} -*/ -enum { - Antenna_Lfet = 1, - Antenna_Right = 2, -}; - -static VOID -_InitAntenna_Selection_8814A(IN PADAPTER Adapter) -{ - - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - if(pHalData->AntDivCfg==0) - return; -/* - RTW_INFO("==> %s ....\n",__FUNCTION__); - - rtw_write8(Adapter, REG_LEDCFG2, 0x82); - - PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter, BIT13, 0x01); - - if(PHY_QueryBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, 0x300) == MAIN_ANT) - pHalData->CurAntenna = MAIN_ANT; - else - pHalData->CurAntenna = AUX_ANT; - RTW_INFO("%s,Cur_ant:(%x)%s\n",__FUNCTION__,pHalData->CurAntenna,(pHalData->CurAntenna == MAIN_ANT)?"MAIN_ANT":"AUX_ANT"); - -*/ -} - -// -// 2010/08/26 MH Add for selective suspend mode check. -// If Efuse 0x0e bit1 is not enabled, we can not support selective suspend for Minicard and -// slim card. -// -//static VOID -//HalDetectSelectiveSuspendMode( -// IN PADAPTER Adapter -// ) -//{ -#if 0 - u8 tmpvalue; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(Adapter); - - // If support HW radio detect, we need to enable WOL ability, otherwise, we - // can not use FW to notify host the power state switch. - - EFUSE_ShadowRead(Adapter, 1, EEPROM_USB_OPTIONAL1, (u32 *)&tmpvalue); - - DBG_8192C("HalDetectSelectiveSuspendMode(): SS "); - if(tmpvalue & BIT1) - { - DBG_8192C("Enable\n"); - } - else - { - DBG_8192C("Disable\n"); - pdvobjpriv->RegUsbSS = _FALSE; - } - - // 2010/09/01 MH According to Dongle Selective Suspend INF. We can switch SS mode. - if (pdvobjpriv->RegUsbSS && !SUPPORT_HW_RADIO_DETECT(pHalData)) - { - //PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - - //if (!pMgntInfo->bRegDongleSS) - //{ - // RT_TRACE(COMP_INIT, DBG_LOUD, ("Dongle disable SS\n")); - pdvobjpriv->RegUsbSS = _FALSE; - //} - } -#endif -//} // HalDetectSelectiveSuspendMode - - -//static rt_rf_power_state RfOnOffDetect(IN PADAPTER pAdapter ) -//{ -// rt_rf_power_state rfpowerstate = rf_on; - -// return rfpowerstate; -//} // HalDetectPwrDownMode - -static void _ps_open_RF(_adapter *padapter) { - //here call with bRegSSPwrLvl 1, bRegSSPwrLvl 2 needs to be verified - //phy_SsPwrSwitch92CU(padapter, rf_on, 1); -} - -/* -static void _ps_close_RF(_adapter *padapter){ - //here call with bRegSSPwrLvl 1, bRegSSPwrLvl 2 needs to be verified - //phy_SsPwrSwitch92CU(padapter, rf_off, 1); -} -*/ - - -/* A lightweight deinit function */ -static void rtl8814au_hw_reset(_adapter *Adapter) -{ -#if 0 - u8 reg_val=0; - if(rtw_read8(Adapter, REG_MCUFWDL)&BIT7) - { - _8051Reset8812(Adapter); - rtw_write8(Adapter, REG_MCUFWDL, 0x00); - //before BB reset should do clock gated - rtw_write32(Adapter, rFPGA0_XCD_RFPara, - rtw_read32(Adapter, rFPGA0_XCD_RFPara)|(BIT6)); - //reset BB - reg_val = rtw_read8(Adapter, REG_SYS_FUNC_EN); - reg_val &= ~(BIT(0) | BIT(1)); - rtw_write8(Adapter, REG_SYS_FUNC_EN, reg_val); - //reset RF - rtw_write8(Adapter, REG_RF_CTRL, 0); - //reset TRX path - rtw_write16(Adapter, REG_CR, 0); - //reset MAC - reg_val = rtw_read8(Adapter, REG_APS_FSMCO+1); - reg_val |= BIT(1); - reg_val = rtw_write8(Adapter, REG_APS_FSMCO+1, reg_val); //reg0x5[1] ,auto FSM off - - reg_val = rtw_read8(Adapter, REG_APS_FSMCO+1); - - //check if reg0x5[1] auto cleared - while(reg_val & BIT(1)){ - rtw_udelay_os(1); - reg_val = rtw_read8(Adapter, REG_APS_FSMCO+1); - } - reg_val |= BIT(0); - reg_val = rtw_write8(Adapter, REG_APS_FSMCO+1, reg_val); //reg0x5[0] ,auto FSM on - - reg_val = rtw_read8(Adapter, REG_SYS_FUNC_EN+1); - reg_val &= ~(BIT(4) | BIT(7)); - rtw_write8(Adapter, REG_SYS_FUNC_EN+1, reg_val); - reg_val = rtw_read8(Adapter, REG_SYS_FUNC_EN+1); - reg_val |= BIT(4) | BIT(7); - rtw_write8(Adapter, REG_SYS_FUNC_EN+1, reg_val); - } -#endif //0 -} - -u32 rtl8814au_hal_init(PADAPTER Adapter) -{ - u8 value8 = 0, u1bRegCR; - u16 value16; - u8 txpktbuf_bndy; - u32 status = _SUCCESS; - u32 NavUpper = WiFiNavUpperUs; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(Adapter); - struct registry_priv *pregistrypriv = &Adapter->registrypriv; - - rt_rf_power_state eRfPowerStateToSet; - - u32 init_start_time = rtw_get_current_time(); - - -#ifdef DBG_HAL_INIT_PROFILING - - enum HAL_INIT_STAGES { - HAL_INIT_STAGES_BEGIN = 0, - HAL_INIT_STAGES_INIT_PW_ON, - HAL_INIT_STAGES_INIT_LLTT, - HAL_INIT_STAGES_DOWNLOAD_FW, - HAL_INIT_STAGES_MAC, - HAL_INIT_STAGES_MISC01, - HAL_INIT_STAGES_MISC02, - HAL_INIT_STAGES_BB, - HAL_INIT_STAGES_RF, - HAL_INIT_STAGES_TURN_ON_BLOCK, - HAL_INIT_STAGES_INIT_SECURITY, - HAL_INIT_STAGES_MISC11, - HAL_INIT_STAGES_INIT_HAL_DM, - //HAL_INIT_STAGES_RF_PS, - HAL_INIT_STAGES_IQK, - HAL_INIT_STAGES_PW_TRACK, - HAL_INIT_STAGES_LCK, - HAL_INIT_STAGES_MISC21, - //HAL_INIT_STAGES_INIT_PABIAS, - #ifdef CONFIG_BT_COEXIST - HAL_INIT_STAGES_BT_COEXIST, - #endif - //HAL_INIT_STAGES_ANTENNA_SEL, - HAL_INIT_STAGES_MISC31, - HAL_INIT_STAGES_END, - HAL_INIT_STAGES_NUM - }; - - char * hal_init_stages_str[] = { - "HAL_INIT_STAGES_BEGIN", - "HAL_INIT_STAGES_INIT_PW_ON", - "HAL_INIT_STAGES_INIT_LLTT", - "HAL_INIT_STAGES_DOWNLOAD_FW", - "HAL_INIT_STAGES_MAC", - "HAL_INIT_STAGES_MISC01", - "HAL_INIT_STAGES_MISC02", - "HAL_INIT_STAGES_BB", - "HAL_INIT_STAGES_RF", - "HAL_INIT_STAGES_TURN_ON_BLOCK", - "HAL_INIT_STAGES_INIT_SECURITY", - "HAL_INIT_STAGES_MISC11", - "HAL_INIT_STAGES_INIT_HAL_DM", - //"HAL_INIT_STAGES_RF_PS", - "HAL_INIT_STAGES_IQK", - "HAL_INIT_STAGES_PW_TRACK", - "HAL_INIT_STAGES_LCK", - "HAL_INIT_STAGES_MISC21", - #ifdef CONFIG_BT_COEXIST - "HAL_INIT_STAGES_BT_COEXIST", - #endif - //"HAL_INIT_STAGES_ANTENNA_SEL", - "HAL_INIT_STAGES_MISC31", - "HAL_INIT_STAGES_END", - }; - - int hal_init_profiling_i; - u32 hal_init_stages_timestamp[HAL_INIT_STAGES_NUM]; //used to record the time of each stage's starting point - - for(hal_init_profiling_i=0;hal_init_profiling_ibkeepfwalive) - { - _ps_open_RF(Adapter); - - if(pHalData->bIQKInitialized){ - //PHY_IQCalibrate_8812A(Adapter,_TRUE); - } - else - { - //PHY_IQCalibrate_8812A(Adapter,_FALSE); - //pHalData->bIQKInitialized = _TRUE; - } - - //ODM_TXPowerTrackingCheck(&pHalData->odmpriv ); - //PHY_LCCalibrate_8812A(Adapter); - - goto exit; - } - - // Check if MAC has already power on. by tynli. 2011.05.27. - value8 = rtw_read8(Adapter, REG_SYS_CLKR+1); - u1bRegCR = rtw_read8(Adapter, REG_CR); - RTW_INFO(" power-on :REG_SYS_CLKR 0x09=0x%02x. REG_CR 0x100=0x%02x.\n", value8, u1bRegCR); - if((value8&BIT3) && (u1bRegCR != 0 && u1bRegCR != 0xEA)) - { - //pHalData->bMACFuncEnable = _TRUE; - RTW_INFO(" MAC has already power on.\n"); - } - else - { - //pHalData->bMACFuncEnable = _FALSE; - // Set FwPSState to ALL_ON mode to prevent from the I/O be return because of 32k - // state which is set before sleep under wowlan mode. 2012.01.04. by tynli. - //pHalData->FwPSState = FW_PS_STATE_ALL_ON_88E; - RTW_INFO(" MAC has not been powered on yet.\n"); - } - - // - // 2012/11/13 MH Revise for U2/U3 switch we can not update RF-A/B reset. - // After discuss with BB team YN, reset after MAC power on to prevent RF - // R/W error. Is it a right method? - // - /*if(!IS_HARDWARE_TYPE_8821(Adapter)) - { - rtw_write8(Adapter, REG_RF_CTRL, 5); - rtw_write8(Adapter, REG_RF_CTRL, 7); - rtw_write8(Adapter, REG_RF_B_CTRL_8812, 5); - rtw_write8(Adapter, REG_RF_B_CTRL_8812, 7); - }*/ - -/* - If HW didn't go through a complete de-initial procedure, - it probably occurs some problem for double initial procedure. - Like "CONFIG_DEINIT_BEFORE_INIT" in 92du chip -*/ - rtl8814au_hw_reset(Adapter); //todo - - - -HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_INIT_PW_ON); - status = _InitPowerOn_8814AU(Adapter); - if(status == _FAIL){ - RTW_INFO("Failed to init power on!\n"); - goto exit; - } - -HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_INIT_LLTT); - - status = InitLLTTable8814A(Adapter); - if(status == _FAIL){ - RTW_INFO("Failed to init LLT table\n"); - goto exit; - } - - _InitHardwareDropIncorrectBulkOut_8814A(Adapter); - - /*if(pHalData->bRDGEnable){ - _InitRDGSetting_8812A(Adapter); - }*/ - -HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_DOWNLOAD_FW); - if (Adapter->registrypriv.mp_mode == 0) { - status = FirmwareDownload8814A(Adapter, _FALSE); - if (status != _SUCCESS) { - RTW_INFO("%s: Download Firmware failed!!\n", __FUNCTION__); - GET_HAL_DATA(Adapter)->bFWReady = _FALSE; - pHalData->fw_ractrl = _FALSE; - //return status; - } else { - RTW_INFO("%s: Download Firmware Success!!\n",__FUNCTION__); - GET_HAL_DATA(Adapter)->bFWReady = _TRUE; - pHalData->fw_ractrl = _TRUE; - } - } - - InitializeFirmwareVars8814(Adapter); - - if(pwrctrlpriv->reg_rfoff == _TRUE){ - pwrctrlpriv->rf_pwrstate = rf_off; - } - - // 2010/08/09 MH We need to check if we need to turnon or off RF after detecting - // HW GPIO pin. Before PHY_RFConfig8192C. - //HalDetectPwrDownMode(Adapter); - // 2010/08/26 MH If Efuse does not support sective suspend then disable the function. - //HalDetectSelectiveSuspendMode(Adapter); - - // Save target channel - // Current Channel will be updated again later. - pHalData->current_channel = 0;//set 0 to trigger switch correct channel - -HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MAC); -#if (HAL_MAC_ENABLE == 1) - status = PHY_MACConfig8814(Adapter); - if(status == _FAIL) - { - goto exit; - } -#endif //HAL_MAC_ENABLE - -HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MISC01); - - _InitQueuePriority_8814AUsb(Adapter); - _InitPageBoundary_8814AUsb(Adapter); - - _InitTransferPageSize_8814AUsb(Adapter); - -HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MISC02); - // Get Rx PHY status in order to report RSSI and others. - _InitDriverInfoSize_8814A(Adapter, DRVINFO_SZ); - - _InitInterrupt_8814AU(Adapter); - _InitID_8814A(Adapter);//set mac_address - _InitNetworkType_8814A(Adapter);//set msr - _InitMacConfigure_8814A(Adapter); - //_InitWMACSetting_8814A(Adapter); - //_InitAdaptiveCtrl_8814AUsb(Adapter); - _InitEDCA_8814AUsb(Adapter); - - _InitRetryFunction_8814A(Adapter); - init_UsbAggregationSetting_8814A(Adapter); - //_InitOperationMode_8814A(Adapter);//todo - _InitBeaconParameters_8814A(Adapter); - _InitBeaconMaxError_8814A(Adapter, _TRUE); - - _InitBurstPktLen(Adapter); //added by page. 20110919 - - // - // Init CR MACTXEN, MACRXEN after setting RxFF boundary REG_TRXFF_BNDY to patch - // Hw bug which Hw initials RxFF boundry size to a value which is larger than the real Rx buffer size in 88E. - // 2011.08.05. by tynli. - // - value8 = rtw_read8(Adapter, REG_CR); - rtw_write8(Adapter, REG_CR, (value8|MACTXEN|MACRXEN)); - -#if defined(CONFIG_CONCURRENT_MODE) || defined(CONFIG_TX_MCAST2UNI) - -#ifdef CONFIG_CHECK_AC_LIFETIME - // Enable lifetime check for the four ACs - rtw_write8(Adapter, REG_LIFETIME_CTRL, 0x0F); -#endif // CONFIG_CHECK_AC_LIFETIME - -#ifdef CONFIG_TX_MCAST2UNI - rtw_write16(Adapter, REG_PKT_VO_VI_LIFE_TIME, 0x0400); // unit: 256us. 256ms - rtw_write16(Adapter, REG_PKT_BE_BK_LIFE_TIME, 0x0400); // unit: 256us. 256ms -#else // CONFIG_TX_MCAST2UNI - rtw_write16(Adapter, REG_PKT_VO_VI_LIFE_TIME, 0x3000); // unit: 256us. 3s - rtw_write16(Adapter, REG_PKT_BE_BK_LIFE_TIME, 0x3000); // unit: 256us. 3s -#endif // CONFIG_TX_MCAST2UNI -#endif // CONFIG_CONCURRENT_MODE || CONFIG_TX_MCAST2UNI - - -#ifdef CONFIG_RTW_LED - _InitHWLed(Adapter); -#endif //CONFIG_LED - - // - //d. Initialize BB related configurations. - // - -HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_BB); -#if (HAL_BB_ENABLE == 1) - status = PHY_BBConfig8814(Adapter); - if(status == _FAIL) - { - goto exit; - } -#endif //HAL_BB_ENABLE - - // 92CU use 3-wire to r/w RF - //pHalData->Rf_Mode = RF_OP_By_SW_3wire; - -HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_RF); -#if (HAL_RF_ENABLE == 1) - status = PHY_RFConfig8814A(Adapter); - if(status == _FAIL) - { - goto exit; - } - - //todo: - //if(pHalData->rf_type == RF_1T1R && IS_HARDWARE_TYPE_8812AU(Adapter)) - //PHY_BB8812_Config_1T(Adapter); -#endif - - PHY_ConfigBB_8814A(Adapter); - - if(Adapter->registrypriv.channel <= 14) - PHY_SwitchWirelessBand8814A(Adapter, BAND_ON_2_4G); - else - PHY_SwitchWirelessBand8814A(Adapter, BAND_ON_5G); - - rtw_hal_set_chnl_bw(Adapter, Adapter->registrypriv.channel, - CHANNEL_WIDTH_20, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HAL_PRIME_CHNL_OFFSET_DONT_CARE); - -HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_TURN_ON_BLOCK); - -HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_INIT_SECURITY); - invalidate_cam_all(Adapter); - -HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MISC11); - _InitAntenna_Selection_8814A(Adapter); - - // HW SEQ CTRL - //set 0x0 to 0xFF by tynli. Default enable HW SEQ NUM. - rtw_write8(Adapter,REG_HWSEQ_CTRL, 0xFF); - - // - // Disable BAR, suggested by Scott - // 2010.04.09 add by hpfan - // - rtw_write32(Adapter, REG_BAR_MODE_CTRL, 0x0201ffff); - - rtw_write8(Adapter,REG_SECONDARY_CCA_CTRL_8814A,0x03); - - if(pregistrypriv->wifi_spec) - rtw_write16(Adapter,REG_FAST_EDCA_CTRL ,0); - //adjust EDCCA to avoid collision - /*if(pregistrypriv->wifi_spec) - { - rtw_write16(Adapter, rEDCCA_Jaguar, 0xfe01); - }*/ - //Nav limit , suggest by scott - rtw_write8(Adapter, 0x652, 0x0); - -HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_INIT_HAL_DM); - rtl8814_InitHalDm(Adapter); - - // - // 2010/08/11 MH Merge from 8192SE for Minicard init. We need to confirm current radio status - // and then decide to enable RF or not.!!!??? For Selective suspend mode. We may not - // call init_adapter. May cause some problem?? - // - // Fix the bug that Hw/Sw radio off before S3/S4, the RF off action will not be executed - // in MgntActSet_RF_State() after wake up, because the value of pHalData->eRFPowerState - // is the same as eRfOff, we should change it to eRfOn after we config RF parameters. - // Added by tynli. 2010.03.30. - pwrctrlpriv->rf_pwrstate = rf_on; - - PHY_IQCalibrate_8814A_Init(&pHalData->odmpriv); - -#if (HAL_BB_ENABLE == 1) - PHY_SetRFEReg8814A(Adapter, _TRUE, pHalData->current_band_type); -#endif //HAL_BB_ENABLE - - //0x4c6[3] 1: RTS BW = Data BW - //0: RTS BW depends on CCA / secondary CCA result. - rtw_write8(Adapter, REG_QUEUE_CTRL, rtw_read8(Adapter, REG_QUEUE_CTRL)&0xF7); - - rtw_hal_set_hwreg(Adapter, HW_VAR_NAV_UPPER, ((u8 *)&NavUpper)); - - // enable Tx report. - rtw_write8(Adapter, REG_FWHW_TXQ_CTRL+1, 0x0F); - - // Suggested by SD1 pisa. Added by tynli. 2011.10.21. - //rtw_write8(Adapter, REG_EARLY_MODE_CONTROL_8812+3, 0x01);//Pretx_en, for WEP/TKIP SEC - - //tynli_test_tx_report. - //rtw_write16(Adapter, REG_TX_RPT_TIME, 0x3DF0); - - // Reset USB mode switch setting - rtw_write8(Adapter, REG_SDIO_CTRL_8814A, 0x0); - rtw_write8(Adapter, REG_ACLK_MON, 0x0); - - //RT_TRACE(COMP_INIT, DBG_TRACE, ("InitializeAdapter8188EUsb() <====\n")); - -HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_IQK); - // 2010/08/26 MH Merge from 8192CE. - if(pwrctrlpriv->rf_pwrstate == rf_on) - { -/* if(IS_HARDWARE_TYPE_8812AU(Adapter)) - { -#if (RTL8812A_SUPPORT == 1) - pHalData->bNeedIQK = _TRUE; - if(pHalData->bIQKInitialized) - PHY_IQCalibrate_8812A(Adapter, _TRUE); - else - { - PHY_IQCalibrate_8812A(Adapter, _FALSE); - pHalData->bIQKInitialized = _TRUE; - } -#endif - }*/ - //this should be done by rf team using phydm code - //PHY_IQCalibrate_8814A(&pHalData->odmpriv, _FALSE); -HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_PW_TRACK); - - //ODM_TXPowerTrackingCheck(&pHalData->odmpriv ); - - -HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_LCK); - //PHY_LCCalibrate_8812A(Adapter); - } - - -HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MISC21); - - -//HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_INIT_PABIAS); -// _InitPABias(Adapter); -#if (MP_DRIVER == 1) - if (Adapter->registrypriv.mp_mode == 1) - { - Adapter->mppriv.channel = pHalData->current_channel; - MPT_InitializeAdapter(Adapter, Adapter->mppriv.channel); - } -#endif //#if (MP_DRIVER == 1) - -#ifdef CONFIG_BT_COEXIST -HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_BT_COEXIST); - //_InitBTCoexist(Adapter); - // 2010/08/23 MH According to Alfred's suggestion, we need to to prevent HW enter - // suspend mode automatically. - //HwSuspendModeEnable92Cu(Adapter, _FALSE); - - if ( _TRUE == pHalData->EEPROMBluetoothCoexist) - { - // Init BT hw config. - rtw_btcoex_HAL_Initialize(Adapter, _FALSE); - } - else - { - // In combo card run wifi only , must setting some hardware reg. - rtl8812a_combo_card_WifiOnlyHwInit(Adapter); - } -#endif //CONFIG_BT_COEXIST - -HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MISC31); - - //rtw_write8(Adapter, REG_USB_HRPWM, 0); - -#ifdef CONFIG_XMIT_ACK - //ack for xmit mgmt frames. - rtw_write32(Adapter, REG_FWHW_TXQ_CTRL, rtw_read32(Adapter, REG_FWHW_TXQ_CTRL)|BIT(12)); -#endif //CONFIG_XMIT_ACK - - //misc - { - int i; - u8 mac_addr[6]; - for(i=0; i<6; i++) - { -#ifdef CONFIG_CONCURRENT_MODE - if(Adapter->iface_type == IFACE_PORT1) - mac_addr[i] = rtw_read8(Adapter, REG_MACID1+i); - else -#endif - mac_addr[i] = rtw_read8(Adapter, REG_MACID+i); - } - - RTW_INFO("MAC Address from REG_MACID = "MAC_FMT"\n", MAC_ARG(mac_addr)); - } - -exit: -HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_END); - - RTW_INFO("%s in %dms\n", __FUNCTION__, rtw_get_passing_time_ms(init_start_time)); - - #ifdef DBG_HAL_INIT_PROFILING - hal_init_stages_timestamp[HAL_INIT_STAGES_END]=rtw_get_current_time(); - - for(hal_init_profiling_i=0;hal_init_profiling_ibFWReady = _FALSE; - -} - -static void rtl8814au_hw_power_down(_adapter *padapter) -{ - // 2010/-8/09 MH For power down module, we need to enable register block contrl reg at 0x1c. - // Then enable power down control bit of register 0x04 BIT4 and BIT15 as 1. - - // Enable register area 0x0-0xc. - rtw_write8(padapter,REG_RSV_CTRL, 0x0); - rtw_write16(padapter, REG_APS_FSMCO, 0x8812); -} - -u32 rtl8814au_hal_deinit(PADAPTER Adapter) - { - struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(Adapter); - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - RTW_INFO("==> %s \n",__FUNCTION__); - -#ifdef CONFIG_BT_COEXIST - if (hal_btcoex_IsBtExist(Adapter)) - { - RTW_INFO("BT module enable SIC\n"); - // Only under WIN7 we can support selective suspend and enter D3 state when system call halt adapter. - - //rtw_write16(Adapter, REG_GPIO_MUXCFG, rtw_read16(Adapter, REG_GPIO_MUXCFG)|BIT12); - // 2010/10/13 MH If we enable SIC in the position and then call _ResetDigitalProcedure1. in XP, - // the system will hang due to 8051 reset fail. - } - else -#endif //CONFIG_BT_COEXIST - { - rtw_write16(Adapter, REG_GPIO_MUXCFG, rtw_read16(Adapter, REG_GPIO_MUXCFG)&(~BIT12)); - } - - if(pHalData->bSupportUSB3 == _TRUE) - { - // set Reg 0xf008[3:4] to 2'11 to eable U1/U2 Mode in USB3.0. added by page, 20120712 - rtw_write8(Adapter, 0xf008, rtw_read8(Adapter, 0xf008)|0x18); - } - - rtw_write32(Adapter, REG_HISR, 0xFFFFFFFF); - rtw_write32(Adapter, REG_HISRE, 0xFFFFFFFF); - rtw_write32(Adapter, REG_HIMR, 0); - rtw_write32(Adapter, REG_HIMRE, 0); - - #ifdef SUPPORT_HW_RFOFF_DETECTED - RTW_INFO("bkeepfwalive(%x)\n", pwrctl->bkeepfwalive); - if(pwrctl->bkeepfwalive) - { - _ps_close_RF(Adapter); - if((pwrctl->bHWPwrPindetect) && (pwrctl->bHWPowerdown)) - rtl8814au_hw_power_down(Adapter); - } - else -#endif - { - if (rtw_is_hw_init_completed(Adapter)) { - hal_carddisable_8814(Adapter); - - if((pwrctl->bHWPwrPindetect ) && (pwrctl->bHWPowerdown)) - rtl8814au_hw_power_down(Adapter); - } - } - return _SUCCESS; - } - - -unsigned int rtl8814au_inirp_init(PADAPTER Adapter) -{ - u8 i; - struct recv_buf *precvbuf; - uint status; - struct dvobj_priv *pdev= adapter_to_dvobj(Adapter); - struct intf_hdl * pintfhdl=&Adapter->iopriv.intf; - struct recv_priv *precvpriv = &(Adapter->recvpriv); - u32 (*_read_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem); -#ifdef CONFIG_USB_INTERRUPT_IN_PIPE - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u32 (*_read_interrupt)(struct intf_hdl *pintfhdl, u32 addr); -#endif - - _read_port = pintfhdl->io_ops._read_port; - - status = _SUCCESS; - - RTW_INFO("===> usb_inirp_init \n"); - - precvpriv->ff_hwaddr = RECV_BULK_IN_ADDR; - - //issue Rx irp to receive data - precvbuf = (struct recv_buf *)precvpriv->precv_buf; - for(i=0; iff_hwaddr, 0, (unsigned char *)precvbuf) == _FALSE ) - { - RTW_ERR("usb_rx_init: usb_read_port error \n"); - status = _FAIL; - goto exit; - } - - precvbuf++; - precvpriv->free_recv_buf_queue_cnt--; - } - -#ifdef CONFIG_USB_INTERRUPT_IN_PIPE - if (pdev->RtInPipe[REALTEK_USB_IN_INT_EP_IDX] != 0x05) { - status = _FAIL; - RTW_INFO("%s =>Warning !! Have not USB Int-IN pipe, RtIntInPipe(%d)!!!\n", __func__, pdev->RtInPipe[REALTEK_USB_IN_INT_EP_IDX]); - goto exit; - } - _read_interrupt = pintfhdl->io_ops._read_interrupt; - if(_read_interrupt(pintfhdl, RECV_INT_IN_ADDR) == _FALSE ) - { - RTW_ERR("usb_rx_init: usb_read_interrupt error \n"); - status = _FAIL; - } -#endif - -exit: - - RTW_INFO("<=== usb_inirp_init \n"); - - return status; - -} - -unsigned int rtl8814au_inirp_deinit(PADAPTER Adapter) -{ - RTW_INFO("\n ===> usb_rx_deinit \n"); - - rtw_read_port_cancel(Adapter); - - RTW_INFO("\n <=== usb_rx_deinit \n"); - - return _SUCCESS; -} - -//------------------------------------------------------------------- -// -// EEPROM/EFUSE Content Parsing -// -//------------------------------------------------------------------- -VOID -hal_ReadIDs_8814AU( - IN PADAPTER Adapter, - IN pu1Byte PROMContent, - IN BOOLEAN AutoloadFail - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - if( !AutoloadFail ) - { - pHalData->EEPROMVID = EF2Byte( *(pu2Byte)&PROMContent[EEPROM_VID_8814AU] ); - pHalData->EEPROMPID = EF2Byte( *(pu2Byte)&PROMContent[EEPROM_PID_8814AU] ); - - // Customer ID, 0x00 and 0xff are reserved for Realtek. - pHalData->EEPROMCustomerID = *(pu1Byte)&PROMContent[EEPROM_CustomID_8814]; - pHalData->EEPROMSubCustomerID = EEPROM_Default_SubCustomerID; - } - else - { - pHalData->EEPROMVID = EEPROM_Default_VID; - pHalData->EEPROMPID = EEPROM_Default_PID; - - // Customer ID, 0x00 and 0xff are reserved for Realtek. - pHalData->EEPROMCustomerID = EEPROM_Default_CustomerID; - pHalData->EEPROMSubCustomerID = EEPROM_Default_SubCustomerID; - } - - RTW_INFO("VID = 0x%04X, PID = 0x%04X\n", pHalData->EEPROMVID, pHalData->EEPROMPID); - RTW_INFO("Customer ID: 0x%02X, SubCustomer ID: 0x%02X\n", pHalData->EEPROMCustomerID, pHalData->EEPROMSubCustomerID); -} - -VOID -hal_InitPGData_8814A( - IN PADAPTER padapter, - IN OUT u8* PROMContent - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - u32 i; - u16 value16; - - if(_FALSE == pHalData->bautoload_fail_flag) - { // autoload OK. - // hal_ReadeFuse_8814A is FW offload read efuse, todo - //#if ((DEV_BUS_TYPE==RT_USB_INTERFACE || DEV_BUS_TYPE==RT_SDIO_INTERFACE)) && (MP_DRIVER != 1) - //if(hal_ReadeFuse_8814A(pAdapter) == _FAIL) - //#endif - - // Read EFUSE real map to shadow. - EFUSE_ShadowMapUpdate(padapter, EFUSE_WIFI, _FALSE); - } - else - {//autoload fail - RTW_INFO("AutoLoad Fail reported from CR9346!!\n"); - //update to default value 0xFF - EFUSE_ShadowMapUpdate(padapter, EFUSE_WIFI, _FALSE); - } - -#ifdef CONFIG_EFUSE_CONFIG_FILE - if (check_phy_efuse_tx_power_info_valid(padapter) == _FALSE) { - if (Hal_readPGDataFromConfigFile(padapter) != _SUCCESS) - RTW_ERR("invalid phy efuse and read from file fail, will use driver default!!\n"); - } -#endif -} - -VOID -hal_CustomizedBehavior_8814AU( - IN PADAPTER Adapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct led_priv *pledpriv = adapter_to_led(Adapter); - - - // Led mode - switch(pHalData->CustomerID) - { - case RT_CID_DEFAULT: - pledpriv->LedStrategy = SW_LED_MODE9; -#ifdef CONFIG_RTW_SW_LED - pledpriv->bRegUseLed = _TRUE; -#endif - break; - - default: - pledpriv->LedStrategy = SW_LED_MODE9; - break; - } -} - -static void -hal_CustomizeByCustomerID_8814AU( - IN PADAPTER pAdapter - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); - - RTW_INFO("PID= 0x%x, VID= %x\n",pHalData->EEPROMPID,pHalData->EEPROMVID); - - // Decide CustomerID according to VID/DID or EEPROM - switch(pHalData->EEPROMCustomerID) - { - case EEPROM_CID_DEFAULT: - if((pHalData->EEPROMVID == 0x2001) && (pHalData->EEPROMPID == 0x3308)) - pHalData->CustomerID = RT_CID_DLINK; - else if((pHalData->EEPROMVID == 0x2001) && (pHalData->EEPROMPID == 0x3309)) - pHalData->CustomerID = RT_CID_DLINK; - else if((pHalData->EEPROMVID == 0x2001) && (pHalData->EEPROMPID == 0x330a)) - pHalData->CustomerID = RT_CID_DLINK; - else if((pHalData->EEPROMVID == 0x0BFF) && (pHalData->EEPROMPID == 0x8160)) - { - pHalData->CustomerID = RT_CID_CHINA_MOBILE; - } - else if((pHalData->EEPROMVID == 0x0BDA) && (pHalData->EEPROMPID == 0x5088)) - pHalData->CustomerID = RT_CID_CC_C; - - break; - case EEPROM_CID_WHQL: - //padapter->bInHctTest = _TRUE; - - //pMgntInfo->bSupportTurboMode = _FALSE; - //pMgntInfo->bAutoTurboBy8186 = _FALSE; - - //pMgntInfo->PowerSaveControl.bInactivePs = _FALSE; - //pMgntInfo->PowerSaveControl.bIPSModeBackup = _FALSE; - //pMgntInfo->PowerSaveControl.bLeisurePs = _FALSE; - //pMgntInfo->PowerSaveControl.bLeisurePsModeBackup = _FALSE; - //pMgntInfo->keepAliveLevel = 0; - - //padapter->bUnloadDriverwhenS3S4 = _FALSE; - break; - default: - pHalData->CustomerID = RT_CID_DEFAULT; - break; - - } - RTW_INFO("Customer ID: 0x%2x\n", pHalData->CustomerID); - - hal_CustomizedBehavior_8814AU(pAdapter); -} - -VOID -hal_ReadUsbModeSwitch_8814AU( - IN PADAPTER Adapter, - IN u8* PROMContent, - IN BOOLEAN AutoloadFail - ) -{ - - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - if (AutoloadFail) - pHalData->EEPROMUsbSwitch = _FALSE; - else - /* check efuse 0x0E bit2 */ - pHalData->EEPROMUsbSwitch = (PROMContent[EEPROM_USB_MODE_8814A] & BIT1) >> 1; -} - -static VOID -ReadLEDSetting_8814AU( - IN PADAPTER Adapter, - IN u8* PROMContent, - IN BOOLEAN AutoloadFail - ) -{ - struct led_priv *pledpriv = adapter_to_led(Adapter); - -#ifdef CONFIG_RTW_SW_LED - pledpriv->bRegUseLed = _TRUE; -#else // HW LED - pledpriv->LedStrategy = HW_LED; -#endif //CONFIG_RTW_LED -} - -VOID -InitAdapterVariablesByPROM_8814AU( - IN PADAPTER Adapter - ) -{ - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - - hal_InitPGData_8814A(Adapter, pHalData->efuse_eeprom_data); - - //Hal_EfuseParseIDCode8812A(Adapter, pHalData->efuse_eeprom_data); - hal_ReadPROMVersion8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); - hal_ReadIDs_8814AU(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); - hal_config_macaddr(Adapter, pHalData->bautoload_fail_flag); - hal_ReadTxPowerInfo8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); - hal_ReadBoardType8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); - hal_Read_TRX_antenna_8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); - - // - // Read Bluetooth co-exist and initialize - // - hal_EfuseParseBTCoexistInfo8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); - - hal_ReadChannelPlan8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); - hal_EfuseParseXtal_8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); - hal_ReadThermalMeter_8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); - hal_ReadRemoteWakeup_8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); - hal_ReadAntennaDiversity8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); - hal_ReadRFEType_8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); - - ReadLEDSetting_8814AU(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); - - hal_ReadUsbModeSwitch_8814AU(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); - hal_CustomizeByCustomerID_8814AU(Adapter); - - hal_GetRxGainOffset_8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); - - Hal_EfuseParseKFreeData_8814A(Adapter, pHalData->efuse_eeprom_data, pHalData->bautoload_fail_flag); -} - -static void hal_ReadPROMContent_8814A( - IN PADAPTER Adapter - ) -{ - PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter); - u8 eeValue; - - /* check system boot selection */ - eeValue = rtw_read8(Adapter, REG_9346CR); - pHalData->EepromOrEfuse = (eeValue & BOOT_FROM_EEPROM) ? _TRUE : _FALSE; - pHalData->bautoload_fail_flag = (eeValue & EEPROM_EN) ? _FALSE : _TRUE; - - RTW_INFO("Boot from %s, Autoload %s !\n", (pHalData->EepromOrEfuse ? "EEPROM" : "EFUSE"), - (pHalData->bautoload_fail_flag ? "Fail" : "OK") ); - - //pHalData->EEType = IS_BOOT_FROM_EEPROM(Adapter) ? EEPROM_93C46 : EEPROM_BOOT_EFUSE; - - InitAdapterVariablesByPROM_8814AU(Adapter); -} - -u8 -ReadAdapterInfo8814AU( - IN PADAPTER Adapter - ) -{ - Hal_InitEfuseVars_8814A(Adapter); - - /* Read all content in Efuse/EEPROM. */ - hal_ReadPROMContent_8814A(Adapter); - - /* We need to define the RF type after all PROM value is recognized. */ - ReadRFType8814A(Adapter); - - return _SUCCESS; -} - -void UpdateInterruptMask8814AU(PADAPTER padapter,u8 bHIMR0 ,u32 AddMSR, u32 RemoveMSR) -{ - HAL_DATA_TYPE *pHalData; - - u32 *himr; - pHalData = GET_HAL_DATA(padapter); - - if(bHIMR0) - himr = &(pHalData->IntrMask[0]); - else - himr = &(pHalData->IntrMask[1]); - - if (AddMSR) - *himr |= AddMSR; - - if (RemoveMSR) - *himr &= (~RemoveMSR); - - if(bHIMR0) - rtw_write32(padapter, REG_HIMR0_8814A, *himr); - else - rtw_write32(padapter, REG_HIMR1_8814A, *himr); - -} - -u8 SetHwReg8814AU(PADAPTER Adapter, u8 variable, u8* val) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(Adapter); - struct registry_priv *registry_par = &Adapter->registrypriv; - u8 ret = _SUCCESS; - - switch (variable) { - case HW_VAR_RXDMA_AGG_PG_TH: -#ifdef CONFIG_USB_RX_AGGREGATION - { - /*u8 threshold = *((u8 *)val); - if( threshold == 0) - { - threshold = pHalData->UsbRxAggPageCount; - } - rtw_write8(Adapter, REG_RXDMA_AGG_PG_TH, threshold);*/ - } -#endif - break; - case HW_VAR_SET_RPWM: -#ifdef CONFIG_LPS_LCLK - { - u8 ps_state = *((u8 *)val); - - /*rpwm value only use BIT0(clock bit) ,BIT6(Ack bit), and BIT7(Toggle bit) for 88e. - BIT0 value - 1: 32k, 0:40MHz. - BIT6 value - 1: report cpwm value after success set, 0:do not report. - BIT7 value - Toggle bit change. - modify by Thomas. 2012/4/2.*/ - ps_state = ps_state & 0xC1; - /*RTW_INFO("##### Change RPWM value to = %x for switch clk #####\n", ps_state);*/ - rtw_write8(Adapter, REG_USB_HRPWM, ps_state); - } -#endif -#ifdef CONFIG_AP_WOWLAN - if (pwrctl->wowlan_ap_mode == _TRUE) { - u8 ps_state = *((u8 *)val); - - RTW_INFO("%s, RPWM\n", __func__); - ps_state = ps_state & 0xC1; - rtw_write8(Adapter, REG_USB_HRPWM, ps_state); - } -#endif - break; - - case HW_VAR_USB_MODE: - /* U2 to U3 */ - if (registry_par->switch_usb_mode == 1) { - if (IS_HIGH_SPEED_USB(Adapter)) { - if ((rtw_read8(Adapter, 0x74) & (BIT(2) | BIT(3))) != BIT(3)) { - rtw_write8(Adapter, 0x74, 0x8); - rtw_write8(Adapter, 0x70, 0x2); - rtw_write8(Adapter, 0x3e, 0x1); - rtw_write8(Adapter, 0x3d, 0x3); - /* usb disconnect */ - rtw_write8(Adapter, 0x5, 0x80); - *val = _TRUE; - } - } else if (IS_SUPER_SPEED_USB(Adapter)) { - rtw_write8(Adapter, 0x70, rtw_read8(Adapter, 0x70) & (~BIT(1))); - rtw_write8(Adapter, 0x3e, rtw_read8(Adapter, 0x3e) & (~BIT(0))); - } - } else if (registry_par->switch_usb_mode == 2) { - /* U3 to U2 */ - if (IS_SUPER_SPEED_USB(Adapter)) { - if ((rtw_read8(Adapter, 0x74) & (BIT(2) | BIT(3))) != BIT(2)) { - rtw_write8(Adapter, 0x74, 0x4); - rtw_write8(Adapter, 0x70, 0x2); - rtw_write8(Adapter, 0x3e, 0x1); - rtw_write8(Adapter, 0x3d, 0x3); - /* usb disconnect */ - rtw_write8(Adapter, 0x5, 0x80); - *val = _TRUE; - } - } else if (IS_HIGH_SPEED_USB(Adapter)) { - rtw_write8(Adapter, 0x70, rtw_read8(Adapter, 0x70) & (~BIT(1))); - rtw_write8(Adapter, 0x3e, rtw_read8(Adapter, 0x3e) & (~BIT(0))); - } - } - break; - default: - ret = SetHwReg8814A(Adapter, variable, val); - break; - } - - return ret; -} - -void GetHwReg8814AU(PADAPTER Adapter, u8 variable, u8* val) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - - switch(variable) - { - default: - GetHwReg8814A(Adapter,variable,val); - break; - } - -} - -// -// Description: -// Change default setting of specified variable. -// -u8 -SetHalDefVar8814AUsb( - IN PADAPTER Adapter, - IN HAL_DEF_VARIABLE eVariable, - IN PVOID pValue - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 bResult = _SUCCESS; - - switch(eVariable) - { - default: - SetHalDefVar8814A(Adapter,eVariable,pValue); - break; - } - - return bResult; -} - -// -// Description: -// Query setting of specified variable. -// -u8 -GetHalDefVar8814AUsb( - IN PADAPTER Adapter, - IN HAL_DEF_VARIABLE eVariable, - IN PVOID pValue - ) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); - u8 bResult = _SUCCESS; - - switch(eVariable) - { - default: - GetHalDefVar8814A(Adapter,eVariable,pValue); - break; - } - - return bResult; -} - -static void rtl8814au_init_default_value(_adapter * padapter) -{ - PHAL_DATA_TYPE pHalData; - - pHalData = GET_HAL_DATA(padapter); - - InitDefaultValue8814A(padapter); - - pHalData->IntrMask[0] = (u32)( \ - //IMR_ROK | - //IMR_RDU | - //IMR_VODOK | - //IMR_VIDOK | - //IMR_BEDOK | - //IMR_BKDOK | - //IMR_MGNTDOK | - //IMR_HIGHDOK | - //IMR_CPWM | - //IMR_CPWM2 | - //IMR_C2HCMD | - //IMR_HISR1_IND_INT | - //IMR_ATIMEND | - //IMR_BCNDMAINT_E | - //IMR_HSISR_IND_ON_INT | - //IMR_BCNDOK0 | - //IMR_BCNDMAINT0 | - //IMR_TSF_BIT32_TOGGLE | - //IMR_TXBCN0OK | - //IMR_TXBCN0ERR | - //IMR_GTINT3 | - //IMR_GTINT4 | - //IMR_TXCCK | - 0); - - pHalData->IntrMask[1] = (u32)(\ - //IMR_RXFOVW | - //IMR_TXFOVW | - //IMR_RXERR | - //IMR_TXERR | - //IMR_ATIMEND_E | - //IMR_BCNDOK1 | - //IMR_BCNDOK2 | - //IMR_BCNDOK3 | - //IMR_BCNDOK4 | - //IMR_BCNDOK5 | - //IMR_BCNDOK6 | - //IMR_BCNDOK7 | - //IMR_BCNDMAINT1 | - //IMR_BCNDMAINT2 | - //IMR_BCNDMAINT3 | - //IMR_BCNDMAINT4 | - //IMR_BCNDMAINT5 | - //IMR_BCNDMAINT6 | - //IMR_BCNDMAINT7 | - 0); -} - -static u8 rtl8814au_ps_func(PADAPTER Adapter,HAL_INTF_PS_FUNC efunc_id, u8 *val) -{ - u8 bResult = _TRUE; - switch(efunc_id){ - - #if defined(CONFIG_AUTOSUSPEND) && defined(SUPPORT_HW_RFOFF_DETECTED) - case HAL_USB_SELECT_SUSPEND: - { - u8 bfwpoll = *(( u8*)val); - //rtl8188e_set_FwSelectSuspend_cmd(Adapter,bfwpoll ,500);//note fw to support hw power down ping detect - } - break; - #endif //CONFIG_AUTOSUSPEND && SUPPORT_HW_RFOFF_DETECTED - - default: - break; - } - return bResult; -} - -void rtl8814au_set_hal_ops(_adapter * padapter) -{ - struct hal_ops *pHalFunc = &padapter->hal_func; - - pHalFunc->hal_power_on = _InitPowerOn_8814AU; - pHalFunc->hal_power_off = hal_carddisable_8814; - - pHalFunc->hal_init = &rtl8814au_hal_init; - pHalFunc->hal_deinit = &rtl8814au_hal_deinit; - - pHalFunc->inirp_init = &rtl8814au_inirp_init; - pHalFunc->inirp_deinit = &rtl8814au_inirp_deinit; - - pHalFunc->init_xmit_priv = &rtl8814au_init_xmit_priv; - pHalFunc->free_xmit_priv = &rtl8814au_free_xmit_priv; - - pHalFunc->init_recv_priv = &rtl8814au_init_recv_priv; - pHalFunc->free_recv_priv = &rtl8814au_free_recv_priv; -#ifdef CONFIG_RTW_SW_LED - pHalFunc->InitSwLeds = &rtl8814au_InitSwLeds; - pHalFunc->DeInitSwLeds = &rtl8814au_DeInitSwLeds; -//#else //case of hw led or no led -// pHalFunc->InitSwLeds = NULL; -// pHalFunc->DeInitSwLeds = NULL; -#endif//CONFIG_RTW_LED - - pHalFunc->init_default_value = &rtl8814au_init_default_value; - pHalFunc->intf_chip_configure = &rtl8814au_interface_configure; - pHalFunc->read_adapter_info = &ReadAdapterInfo8814AU; - - pHalFunc->set_hw_reg_handler = &SetHwReg8814AU; - pHalFunc->GetHwRegHandler = &GetHwReg8814AU; - pHalFunc->get_hal_def_var_handler = &GetHalDefVar8814AUsb; - pHalFunc->SetHalDefVarHandler = &SetHalDefVar8814AUsb; - - - pHalFunc->hal_xmit = &rtl8814au_hal_xmit; - pHalFunc->mgnt_xmit = &rtl8814au_mgnt_xmit; - pHalFunc->hal_xmitframe_enqueue = &rtl8814au_hal_xmitframe_enqueue; - -#ifdef CONFIG_HOSTAPD_MLME - pHalFunc->hostap_mgnt_xmit_entry = &rtl8812au_hostap_mgnt_xmit_entry; -#endif - pHalFunc->interface_ps_func = &rtl8814au_ps_func; -#ifdef CONFIG_XMIT_THREAD_MODE - pHalFunc->xmit_thread_handler = &rtl8812au_xmit_buf_handler; -#endif -#ifdef CONFIG_SUPPORT_USB_INT - pHalFunc->interrupt_handler = interrupt_handler_8814au; -#endif - pHalFunc->fw_correct_bcn = &rtl8814_fw_update_beacon_cmd; - rtl8814_set_hal_ops(pHalFunc); - -} - diff --git a/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/usb/usb_ops_linux.c b/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/usb/usb_ops_linux.c deleted file mode 100644 index 320024cae2b8c0..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/hal/rtl8814a/usb/usb_ops_linux.c +++ /dev/null @@ -1,312 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2017 Realtek Corporation. - * - * 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 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 _HCI_OPS_OS_C_ - -/* #include */ -#include - -#ifdef CONFIG_SUPPORT_USB_INT -void interrupt_handler_8814au(_adapter *padapter, u16 pkt_len, u8 *pbuf) -{ - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct reportpwrstate_parm pwr_rpt; - - if (pkt_len != INTERRUPT_MSG_FORMAT_LEN) { - RTW_INFO("%s Invalid interrupt content length (%d)!\n", __FUNCTION__, pkt_len); - return ; - } - - /* HISR */ - _rtw_memcpy(&(pHalData->IntArray[0]), &(pbuf[USB_INTR_CONTENT_HISR_OFFSET]), 4); - _rtw_memcpy(&(pHalData->IntArray[1]), &(pbuf[USB_INTR_CONTENT_HISRE_OFFSET]), 4); - -#if 0 /*DBG*/ - { - u32 hisr = 0 , hisr_ex = 0; - _rtw_memcpy(&hisr, &(pHalData->IntArray[0]), 4); - hisr = le32_to_cpu(hisr); - - _rtw_memcpy(&hisr_ex, &(pHalData->IntArray[1]), 4); - hisr_ex = le32_to_cpu(hisr_ex); - - if ((hisr != 0) || (hisr_ex != 0)) - RTW_INFO("===> %s hisr:0x%08x ,hisr_ex:0x%08x\n", __FUNCTION__, hisr, hisr_ex); - } -#endif - -#ifdef CONFIG_LPS_LCLK - if (pHalData->IntArray[0] & IMR_CPWM_88E) { - _rtw_memcpy(&pwr_rpt.state, &(pbuf[USB_INTR_CONTENT_CPWM1_OFFSET]), 1); - /* _rtw_memcpy(&pwr_rpt.state2, &(pbuf[USB_INTR_CONTENT_CPWM2_OFFSET]), 1); */ - - /* 88e's cpwm value only change BIT0, so driver need to add PS_STATE_S2 for LPS flow. */ - pwr_rpt.state |= PS_STATE_S2; - _set_workitem(&(adapter_to_pwrctl(padapter)->cpwm_event)); - } -#endif/* CONFIG_LPS_LCLK */ - -#ifdef CONFIG_INTERRUPT_BASED_TXBCN - -#ifdef CONFIG_INTERRUPT_BASED_TXBCN_EARLY_INT - if (pHalData->IntArray[0] & IMR_BCNDMAINT0_88E) -#endif -#ifdef CONFIG_INTERRUPT_BASED_TXBCN_BCN_OK_ERR - if (pHalData->IntArray[0] & (IMR_TBDER_88E | IMR_TBDOK_88E)) -#endif - { - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; -#if 0 - if (pHalData->IntArray[0] & IMR_BCNDMAINT0_88E) - RTW_INFO("%s: HISR_BCNERLY_INT\n", __func__); - if (pHalData->IntArray[0] & IMR_TBDOK_88E) - RTW_INFO("%s: HISR_TXBCNOK\n", __func__); - if (pHalData->IntArray[0] & IMR_TBDER_88E) - RTW_INFO("%s: HISR_TXBCNERR\n", __func__); -#endif /* 0 */ - - if(check_fwstate(pmlmepriv, WIFI_AP_STATE)) - { - //send_beacon(padapter); - if(pmlmepriv->update_bcn == _TRUE) - { - //tx_beacon_hdl(padapter, NULL); - set_tx_beacon_cmd(padapter); - } - } -#ifdef CONFIG_CONCURRENT_MODE - if(check_buddy_fwstate(padapter, WIFI_AP_STATE)) - { - //send_beacon(padapter); - if(padapter->pbuddy_adapter->mlmepriv.update_bcn == _TRUE) - { - //tx_beacon_hdl(padapter, NULL); - set_tx_beacon_cmd(padapter->pbuddy_adapter); - } - } -#endif - - } -#endif /* CONFIG_INTERRUPT_BASED_TXBCN */ - - - - -#ifdef DBG_CONFIG_ERROR_DETECT_INT - if (pHalData->IntArray[1] & IMR_TXERR_88E) - RTW_INFO("===> %s Tx Error Flag Interrupt Status\n", __FUNCTION__); - if (pHalData->IntArray[1] & IMR_RXERR_88E) - RTW_INFO("===> %s Rx Error Flag INT Status\n", __FUNCTION__); - if (pHalData->IntArray[1] & IMR_TXFOVW_88E) - RTW_INFO("===> %s Transmit FIFO Overflow\n", __FUNCTION__); - if (pHalData->IntArray[1] & IMR_RXFOVW_88E) - RTW_INFO("===> %s Receive FIFO Overflow\n", __FUNCTION__); -#endif/* DBG_CONFIG_ERROR_DETECT_INT */ - -#ifdef CONFIG_FW_C2H_REG - /* C2H Event */ - if (pbuf[0] != 0) - usb_c2h_hisr_hdl(padapter, pbuf); -#endif -} -#endif /* CONFIG_SUPPORT_USB_INT */ -#if 0 -int recvbuf2recvframe(PADAPTER padapter, void *ptr) -{ - u8 *pbuf; - u8 pkt_cnt = 0; - u32 pkt_offset; - s32 transfer_len; - u8 *pphy_status = NULL; - union recv_frame *precvframe = NULL; - struct rx_pkt_attrib *pattrib = NULL; - HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter); - struct recv_priv *precvpriv = &padapter->recvpriv; - _queue *pfree_recv_queue = &precvpriv->free_recv_queue; - _pkt *pskb; - -#ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX - pskb = NULL; - transfer_len = (s32)((struct recv_buf *)ptr)->transfer_len; - pbuf = ((struct recv_buf *)ptr)->pbuf; -#else - pskb = (_pkt *)ptr; - transfer_len = (s32)pskb->len; - pbuf = pskb->data; -#endif/* CONFIG_USE_USB_BUFFER_ALLOC_RX */ - - -#ifdef CONFIG_USB_RX_AGGREGATION - pkt_cnt = GET_RX_STATUS_DESC_DMA_AGG_NUM_8814A(pbuf); -#endif - - do { - precvframe = rtw_alloc_recvframe(pfree_recv_queue); - if (precvframe == NULL) { - RTW_INFO("%s()-%d: rtw_alloc_recvframe() failed! RX Drop!\n", __FUNCTION__, __LINE__); - goto _exit_recvbuf2recvframe; - } - - _rtw_init_listhead(&precvframe->u.hdr.list); - precvframe->u.hdr.precvbuf = NULL; /* can't access the precvbuf for new arch. */ - precvframe->u.hdr.len = 0; - - rtl8814_query_rx_desc_status(precvframe, pbuf); - - pattrib = &precvframe->u.hdr.attrib; - - if ((padapter->registrypriv.mp_mode == 0) && ((pattrib->crc_err) || (pattrib->icv_err))) { - RTW_INFO("%s: RX Warning! crc_err=%d icv_err=%d, skip!\n", __FUNCTION__, pattrib->crc_err, pattrib->icv_err); - - rtw_free_recvframe(precvframe, pfree_recv_queue); - goto _exit_recvbuf2recvframe; - } - - pkt_offset = RXDESC_SIZE + pattrib->drvinfo_sz + pattrib->shift_sz + pattrib->pkt_len; - - if ((pattrib->pkt_len <= 0) || (pkt_offset > transfer_len)) { - RTW_INFO("%s()-%d: RX Warning!,pkt_len<=0 or pkt_offset> transfer_len\n", __FUNCTION__, __LINE__); - rtw_free_recvframe(precvframe, pfree_recv_queue); - goto _exit_recvbuf2recvframe; - } - -#ifdef CONFIG_RX_PACKET_APPEND_FCS - if (check_fwstate(&padapter->mlmepriv, WIFI_MONITOR_STATE) == _FALSE) - if ((pattrib->pkt_rpt_type == NORMAL_RX) && (pHalData->ReceiveConfig & RCR_APPFCS)) - pattrib->pkt_len -= IEEE80211_FCS_LEN; -#endif - if (rtw_os_alloc_recvframe(padapter, precvframe, - (pbuf + pattrib->shift_sz + pattrib->drvinfo_sz + RXDESC_SIZE), pskb) == _FAIL) { - rtw_free_recvframe(precvframe, pfree_recv_queue); - - goto _exit_recvbuf2recvframe; - } - - recvframe_put(precvframe, pattrib->pkt_len); - /* recvframe_pull(precvframe, drvinfo_sz + RXDESC_SIZE); */ - - if(pattrib->pkt_rpt_type == NORMAL_RX)//Normal rx packet - { - if(pattrib->physt) - pphy_status = (pbuf + RXDESC_OFFSET); - -#ifdef CONFIG_CONCURRENT_MODE - if(rtw_buddy_adapter_up(padapter)) - { - if(pre_recv_entry(precvframe, pphy_status) != _SUCCESS) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_, - ("recvbuf2recvframe: recv_entry(precvframe) != _SUCCESS\n")); - } - } -#endif //CONFIG_CONCURRENT_MODE - - if(pattrib->physt && pphy_status) - rx_query_phy_status(precvframe, pphy_status); - - if(rtw_recv_entry(precvframe) != _SUCCESS) - { - RT_TRACE(_module_rtl871x_recv_c_,_drv_err_, - ("recvbuf2recvframe: rtw_recv_entry(precvframe) != _SUCCESS\n")); - } - - } - else{ // pkt_rpt_type == TX_REPORT1-CCX, TX_REPORT2-TX RTP,HIS_REPORT-USB HISR RTP - if (pattrib->pkt_rpt_type == C2H_PACKET) { - //RTW_INFO("rx C2H_PACKET \n"); - rtw_hal_c2h_pkt_pre_hdl(padapter,precvframe->u.hdr.rx_data,pattrib->pkt_len); - } - rtw_free_recvframe(precvframe, pfree_recv_queue); - } - -#ifdef CONFIG_USB_RX_AGGREGATION - /* jaguar 8-byte alignment */ - pkt_offset = (u16)_RND8(pkt_offset); - pkt_cnt--; - pbuf += pkt_offset; -#endif - transfer_len -= pkt_offset; - precvframe = NULL; - - } while (transfer_len > 0); - -_exit_recvbuf2recvframe: - - return _SUCCESS; -} -#endif - -void rtl8814au_xmit_tasklet(void *priv) -{ - int ret = _FALSE; - _adapter *padapter = (_adapter*)priv; - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - - while(1) - { - if (RTW_CANNOT_TX(padapter)) - { - RTW_INFO("xmit_tasklet => bDriverStopped or bSurpriseRemoved or bWritePortCancel\n"); - break; - } - - if (rtw_xmit_ac_blocked(padapter) == _TRUE) - break; - - ret = rtl8814au_xmitframe_complete(padapter, pxmitpriv, NULL); - - if(ret==_FALSE) - break; - - } - -} - -void rtl8814au_set_intf_ops(struct _io_ops *pops) -{ - _rtw_memset((u8 *)pops, 0, sizeof(struct _io_ops)); - - pops->_read8 = &usb_read8; - pops->_read16 = &usb_read16; - pops->_read32 = &usb_read32; - pops->_read_mem = &usb_read_mem; - pops->_read_port = &usb_read_port; - - pops->_write8 = &usb_write8; - pops->_write16 = &usb_write16; - pops->_write32 = &usb_write32; - pops->_writeN = &usb_writeN; - -#ifdef CONFIG_USB_SUPPORT_ASYNC_VDN_REQ - pops->_write8_async= &usb_async_write8; - pops->_write16_async = &usb_async_write16; - pops->_write32_async = &usb_async_write32; -#endif - pops->_write_mem = &usb_write_mem; - pops->_write_port = &usb_write_port; - - pops->_read_port_cancel = &usb_read_port_cancel; - pops->_write_port_cancel = &usb_write_port_cancel; - -#ifdef CONFIG_USB_INTERRUPT_IN_PIPE - pops->_read_interrupt = &usb_read_interrupt; -#endif - -} - -void rtl8814au_set_hw_type(struct dvobj_priv *pdvobj) -{ - pdvobj->HardwareType = HARDWARE_TYPE_RTL8814AU; - RTW_INFO("CHIP TYPE: RTL8814\n"); -} diff --git a/drivers/net/wireless/realtek/rtl8812au/include/drv_types_pci.h b/drivers/net/wireless/realtek/rtl8812au/include/drv_types_pci.h deleted file mode 100644 index a3a4927088608d..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/include/drv_types_pci.h +++ /dev/null @@ -1,266 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2017 Realtek Corporation. - * - * 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 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 __DRV_TYPES_PCI_H__ -#define __DRV_TYPES_PCI_H__ - - -#ifdef PLATFORM_LINUX - #include -#endif - - -#define INTEL_VENDOR_ID 0x8086 -#define SIS_VENDOR_ID 0x1039 -#define ATI_VENDOR_ID 0x1002 -#define ATI_DEVICE_ID 0x7914 -#define AMD_VENDOR_ID 0x1022 - -#define PCI_MAX_BRIDGE_NUMBER 255 -#define PCI_MAX_DEVICES 32 -#define PCI_MAX_FUNCTION 8 - -#define PCI_CONF_ADDRESS 0x0CF8 /* PCI Configuration Space Address */ -#define PCI_CONF_DATA 0x0CFC /* PCI Configuration Space Data */ - -#define PCI_CLASS_BRIDGE_DEV 0x06 -#define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04 - -#define PCI_CAPABILITY_ID_PCI_EXPRESS 0x10 - -#define U1DONTCARE 0xFF -#define U2DONTCARE 0xFFFF -#define U4DONTCARE 0xFFFFFFFF - -#define PCI_VENDER_ID_REALTEK 0x10ec - -#define HAL_HW_PCI_8180_DEVICE_ID 0x8180 -#define HAL_HW_PCI_8185_DEVICE_ID 0x8185 /* 8185 or 8185b */ -#define HAL_HW_PCI_8188_DEVICE_ID 0x8188 /* 8185b */ -#define HAL_HW_PCI_8198_DEVICE_ID 0x8198 /* 8185b */ -#define HAL_HW_PCI_8190_DEVICE_ID 0x8190 /* 8190 */ -#define HAL_HW_PCI_8723E_DEVICE_ID 0x8723 /* 8723E */ -#define HAL_HW_PCI_8192_DEVICE_ID 0x8192 /* 8192 PCI-E */ -#define HAL_HW_PCI_8192SE_DEVICE_ID 0x8192 /* 8192 SE */ -#define HAL_HW_PCI_8174_DEVICE_ID 0x8174 /* 8192 SE */ -#define HAL_HW_PCI_8173_DEVICE_ID 0x8173 /* 8191 SE Crab */ -#define HAL_HW_PCI_8172_DEVICE_ID 0x8172 /* 8191 SE RE */ -#define HAL_HW_PCI_8171_DEVICE_ID 0x8171 /* 8191 SE Unicron */ -#define HAL_HW_PCI_0045_DEVICE_ID 0x0045 /* 8190 PCI for Ceraga */ -#define HAL_HW_PCI_0046_DEVICE_ID 0x0046 /* 8190 Cardbus for Ceraga */ -#define HAL_HW_PCI_0044_DEVICE_ID 0x0044 /* 8192e PCIE for Ceraga */ -#define HAL_HW_PCI_0047_DEVICE_ID 0x0047 /* 8192e Express Card for Ceraga */ -#define HAL_HW_PCI_700F_DEVICE_ID 0x700F -#define HAL_HW_PCI_701F_DEVICE_ID 0x701F -#define HAL_HW_PCI_DLINK_DEVICE_ID 0x3304 -#define HAL_HW_PCI_8188EE_DEVICE_ID 0x8179 - -#define HAL_MEMORY_MAPPED_IO_RANGE_8190PCI 0x1000 /* 8190 support 16 pages of IO registers */ -#define HAL_HW_PCI_REVISION_ID_8190PCI 0x00 -#define HAL_MEMORY_MAPPED_IO_RANGE_8192PCIE 0x4000 /* 8192 support 16 pages of IO registers */ -#define HAL_HW_PCI_REVISION_ID_8192PCIE 0x01 -#define HAL_MEMORY_MAPPED_IO_RANGE_8192SE 0x4000 /* 8192 support 16 pages of IO registers */ -#define HAL_HW_PCI_REVISION_ID_8192SE 0x10 -#define HAL_HW_PCI_REVISION_ID_8192CE 0x1 -#define HAL_MEMORY_MAPPED_IO_RANGE_8192CE 0x4000 /* 8192 support 16 pages of IO registers */ -#define HAL_HW_PCI_REVISION_ID_8192DE 0x0 -#define HAL_MEMORY_MAPPED_IO_RANGE_8192DE 0x4000 /* 8192 support 16 pages of IO registers */ - -enum pci_bridge_vendor { - PCI_BRIDGE_VENDOR_INTEL = 0x0,/* 0b'0000,0001 */ - PCI_BRIDGE_VENDOR_ATI, /* = 0x02, */ /* 0b'0000,0010 */ - PCI_BRIDGE_VENDOR_AMD, /* = 0x04, */ /* 0b'0000,0100 */ - PCI_BRIDGE_VENDOR_SIS ,/* = 0x08, */ /* 0b'0000,1000 */ - PCI_BRIDGE_VENDOR_UNKNOWN, /* = 0x40, */ /* 0b'0100,0000 */ - PCI_BRIDGE_VENDOR_MAX ,/* = 0x80 */ -} ; - -/* copy this data structor defination from MSDN SDK */ -typedef struct _PCI_COMMON_CONFIG { - u16 VendorID; - u16 DeviceID; - u16 Command; - u16 Status; - u8 RevisionID; - u8 ProgIf; - u8 SubClass; - u8 BaseClass; - u8 CacheLineSize; - u8 LatencyTimer; - u8 HeaderType; - u8 BIST; - - union { - struct _PCI_HEADER_TYPE_0 { - u32 BaseAddresses[6]; - u32 CIS; - u16 SubVendorID; - u16 SubSystemID; - u32 ROMBaseAddress; - u8 CapabilitiesPtr; - u8 Reserved1[3]; - u32 Reserved2; - - u8 InterruptLine; - u8 InterruptPin; - u8 MinimumGrant; - u8 MaximumLatency; - } type0; -#if 0 - struct _PCI_HEADER_TYPE_1 { - ULONG BaseAddresses[PCI_TYPE1_ADDRESSES]; - UCHAR PrimaryBusNumber; - UCHAR SecondaryBusNumber; - UCHAR SubordinateBusNumber; - UCHAR SecondaryLatencyTimer; - UCHAR IOBase; - UCHAR IOLimit; - USHORT SecondaryStatus; - USHORT MemoryBase; - USHORT MemoryLimit; - USHORT PrefetchableMemoryBase; - USHORT PrefetchableMemoryLimit; - ULONG PrefetchableMemoryBaseUpper32; - ULONG PrefetchableMemoryLimitUpper32; - USHORT IOBaseUpper; - USHORT IOLimitUpper; - ULONG Reserved2; - ULONG ExpansionROMBase; - UCHAR InterruptLine; - UCHAR InterruptPin; - USHORT BridgeControl; - } type1; - - struct _PCI_HEADER_TYPE_2 { - ULONG BaseAddress; - UCHAR CapabilitiesPtr; - UCHAR Reserved2; - USHORT SecondaryStatus; - UCHAR PrimaryBusNumber; - UCHAR CardbusBusNumber; - UCHAR SubordinateBusNumber; - UCHAR CardbusLatencyTimer; - ULONG MemoryBase0; - ULONG MemoryLimit0; - ULONG MemoryBase1; - ULONG MemoryLimit1; - USHORT IOBase0_LO; - USHORT IOBase0_HI; - USHORT IOLimit0_LO; - USHORT IOLimit0_HI; - USHORT IOBase1_LO; - USHORT IOBase1_HI; - USHORT IOLimit1_LO; - USHORT IOLimit1_HI; - UCHAR InterruptLine; - UCHAR InterruptPin; - USHORT BridgeControl; - USHORT SubVendorID; - USHORT SubSystemID; - ULONG LegacyBaseAddress; - UCHAR Reserved3[56]; - ULONG SystemControl; - UCHAR MultiMediaControl; - UCHAR GeneralStatus; - UCHAR Reserved4[2]; - UCHAR GPIO0Control; - UCHAR GPIO1Control; - UCHAR GPIO2Control; - UCHAR GPIO3Control; - ULONG IRQMuxRouting; - UCHAR RetryStatus; - UCHAR CardControl; - UCHAR DeviceControl; - UCHAR Diagnostic; - } type2; -#endif - } u; - - u8 DeviceSpecific[108]; -} PCI_COMMON_CONFIG , *PPCI_COMMON_CONFIG; - -typedef struct _RT_PCI_CAPABILITIES_HEADER { - u8 CapabilityID; - u8 Next; -} RT_PCI_CAPABILITIES_HEADER, *PRT_PCI_CAPABILITIES_HEADER; - -struct pci_priv { - BOOLEAN pci_clk_req; - - u8 pciehdr_offset; - /* PCIeCap is only differece between B-cut and C-cut. */ - /* Configuration Space offset 72[7:4] */ - /* 0: A/B cut */ - /* 1: C cut and later. */ - u8 pcie_cap; - u8 linkctrl_reg; - - u8 busnumber; - u8 devnumber; - u8 funcnumber; - - u8 pcibridge_busnum; - u8 pcibridge_devnum; - u8 pcibridge_funcnum; - u8 pcibridge_vendor; - u16 pcibridge_vendorid; - u16 pcibridge_deviceid; - u8 pcibridge_pciehdr_offset; - u8 pcibridge_linkctrlreg; - - u8 amd_l1_patch; -}; - -typedef struct _RT_ISR_CONTENT { - union { - u32 IntArray[2]; - u32 IntReg4Byte; - u16 IntReg2Byte; - }; -} RT_ISR_CONTENT, *PRT_ISR_CONTENT; - -/* #define RegAddr(addr) (addr + 0xB2000000UL) */ -/* some platform macros will def here */ -static inline void NdisRawWritePortUlong(u32 port, u32 val) -{ - outl(val, port); - /* writel(val, (u8 *)RegAddr(port)); */ -} - -static inline void NdisRawWritePortUchar(u32 port, u8 val) -{ - outb(val, port); - /* writeb(val, (u8 *)RegAddr(port)); */ -} - -static inline void NdisRawReadPortUchar(u32 port, u8 *pval) -{ - *pval = inb(port); - /* *pval = readb((u8 *)RegAddr(port)); */ -} - -static inline void NdisRawReadPortUshort(u32 port, u16 *pval) -{ - *pval = inw(port); - /* *pval = readw((u8 *)RegAddr(port)); */ -} - -static inline void NdisRawReadPortUlong(u32 port, u32 *pval) -{ - *pval = inl(port); - /* *pval = readl((u8 *)RegAddr(port)); */ -} - - -#endif diff --git a/drivers/net/wireless/realtek/rtl8812au/include/hal_com_phycfg.h b/drivers/net/wireless/realtek/rtl8812au/include/hal_com_phycfg.h deleted file mode 100644 index 3c7073dcd99315..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/include/hal_com_phycfg.h +++ /dev/null @@ -1,299 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2017 Realtek Corporation. - * - * 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 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 __HAL_COM_PHYCFG_H__ -#define __HAL_COM_PHYCFG_H__ - -#define PathA 0x0 /* Useless */ -#define PathB 0x1 -#define PathC 0x2 -#define PathD 0x3 - -typedef enum _RF_TX_NUM { - RF_1TX = 0, - RF_2TX, - RF_3TX, - RF_4TX, - RF_MAX_TX_NUM, - RF_TX_NUM_NONIMPLEMENT, -} RF_TX_NUM; - -/*------------------------------Define structure----------------------------*/ -typedef struct _BB_REGISTER_DEFINITION { - u32 rfintfs; /* set software control: */ - /* 0x870~0x877[8 bytes] */ - - u32 rfintfo; /* output data: */ - /* 0x860~0x86f [16 bytes] */ - - u32 rfintfe; /* output enable: */ - /* 0x860~0x86f [16 bytes] */ - - u32 rf3wireOffset; /* LSSI data: */ - /* 0x840~0x84f [16 bytes] */ - - u32 rfHSSIPara2; /* wire parameter control2 : */ - /* 0x824~0x827,0x82c~0x82f, 0x834~0x837, 0x83c~0x83f [16 bytes] */ - - u32 rfLSSIReadBack; /* LSSI RF readback data SI mode */ - /* 0x8a0~0x8af [16 bytes] */ - - u32 rfLSSIReadBackPi; /* LSSI RF readback data PI mode 0x8b8-8bc for Path A and B */ - -} BB_REGISTER_DEFINITION_T, *PBB_REGISTER_DEFINITION_T; - - -/* ---------------------------------------------------------------------- */ -u8 -PHY_GetTxPowerByRateBase( - IN PADAPTER Adapter, - IN u8 Band, - IN u8 RfPath, - IN RATE_SECTION RateSection -); - -VOID -PHY_GetRateValuesOfTxPowerByRate( - IN PADAPTER pAdapter, - IN u32 RegAddr, - IN u32 BitMask, - IN u32 Value, - OUT u8 *Rate, - OUT s8 *PwrByRateVal, - OUT u8 *RateNum -); - -u8 -PHY_GetRateIndexOfTxPowerByRate( - IN u8 Rate -); - -VOID -phy_set_tx_power_index_by_rate_section( - IN PADAPTER pAdapter, - IN enum rf_path RFPath, - IN u8 Channel, - IN u8 RateSection -); - -s8 -_PHY_GetTxPowerByRate( - IN PADAPTER pAdapter, - IN u8 Band, - IN enum rf_path RFPath, - IN u8 RateIndex -); - -s8 -PHY_GetTxPowerByRate( - IN PADAPTER pAdapter, - IN u8 Band, - IN enum rf_path RFPath, - IN u8 RateIndex -); - -VOID -PHY_SetTxPowerByRate( - IN PADAPTER pAdapter, - IN u8 Band, - IN enum rf_path RFPath, - IN u8 Rate, - IN s8 Value -); - -VOID -phy_set_tx_power_level_by_path( - IN PADAPTER Adapter, - IN u8 channel, - IN u8 path -); - -VOID -PHY_SetTxPowerIndexByRateArray( - IN PADAPTER pAdapter, - IN enum rf_path RFPath, - IN enum channel_width BandWidth, - IN u8 Channel, - IN u8 *Rates, - IN u8 RateArraySize -); - -VOID -PHY_InitTxPowerByRate( - IN PADAPTER pAdapter -); - -VOID -phy_store_tx_power_by_rate( - IN PADAPTER pAdapter, - IN u32 Band, - IN u32 RfPath, - IN u32 TxNum, - IN u32 RegAddr, - IN u32 BitMask, - IN u32 Data -); - -VOID -PHY_TxPowerByRateConfiguration( - IN PADAPTER pAdapter -); - -u8 -PHY_GetTxPowerIndexBase( - IN PADAPTER pAdapter, - IN enum rf_path RFPath, - IN u8 Rate, - u8 ntx_idx, - IN enum channel_width BandWidth, - IN u8 Channel, - OUT PBOOLEAN bIn24G -); - -#if CONFIG_TXPWR_LIMIT -s8 phy_get_txpwr_lmt_abs(_adapter *adapter - , const char *regd_name - , BAND_TYPE band, enum channel_width bw - , u8 tlrs, u8 ntx_idx, u8 cch, u8 lock -); - -s8 phy_get_txpwr_lmt(_adapter *adapter - , const char *regd_name - , BAND_TYPE band, enum channel_width bw - , u8 rfpath, u8 rs, u8 ntx_idx, u8 cch, u8 lock -); - -s8 PHY_GetTxPowerLimit(_adapter *adapter - , const char *regd_name - , BAND_TYPE band, enum channel_width bw - , u8 rfpath, u8 rate, u8 ntx_idx, u8 cch -); -#else -#define phy_get_txpwr_lmt_abs(adapter, regd_name, band, bw, tlrs, ntx_idx, cch, lock) (GET_HAL_SPEC(adapter)->txgi_max) -#define phy_get_txpwr_lmt(adapter, regd_name, band, bw, rfpath, rs, ntx_idx, cch, lock) (GET_HAL_SPEC(adapter)->txgi_max) -#define PHY_GetTxPowerLimit(adapter, regd_name, band, bw, rfpath, rate, ntx_idx, cch) (GET_HAL_SPEC(adapter)->txgi_max) -#endif /* CONFIG_TXPWR_LIMIT */ - -s8 -PHY_GetTxPowerTrackingOffset( - PADAPTER pAdapter, - enum rf_path RFPath, - u8 Rate -); - -struct txpwr_idx_comp { - u8 ntx_idx; - u8 base; - s8 by_rate; - s8 limit; - s8 tpt; - s8 ebias; -}; - -u8 -phy_get_tx_power_index( - IN PADAPTER pAdapter, - IN enum rf_path RFPath, - IN u8 Rate, - IN enum channel_width BandWidth, - IN u8 Channel -); - -VOID -PHY_SetTxPowerIndex( - IN PADAPTER pAdapter, - IN u32 PowerIndex, - IN enum rf_path RFPath, - IN u8 Rate -); - -void dump_tx_power_idx_title(void *sel, _adapter *adapter); -void dump_tx_power_idx_by_path_rs(void *sel, _adapter *adapter, u8 rfpath, u8 rs); -void dump_tx_power_idx(void *sel, _adapter *adapter); - -bool phy_is_tx_power_limit_needed(_adapter *adapter); -bool phy_is_tx_power_by_rate_needed(_adapter *adapter); -int phy_load_tx_power_by_rate(_adapter *adapter, u8 chk_file); -#if CONFIG_TXPWR_LIMIT -int phy_load_tx_power_limit(_adapter *adapter, u8 chk_file); -#endif -void phy_load_tx_power_ext_info(_adapter *adapter, u8 chk_file); -void phy_reload_tx_power_ext_info(_adapter *adapter); -void phy_reload_default_tx_power_ext_info(_adapter *adapter); - -const struct map_t *hal_pg_txpwr_def_info(_adapter *adapter); - -#ifdef CONFIG_EFUSE_CONFIG_FILE -int check_phy_efuse_tx_power_info_valid(_adapter *adapter); -#endif - -void dump_hal_txpwr_info_2g(void *sel, _adapter *adapter, u8 rfpath_num, u8 max_tx_cnt); -void dump_hal_txpwr_info_5g(void *sel, _adapter *adapter, u8 rfpath_num, u8 max_tx_cnt); - -void hal_load_txpwr_info( - _adapter *adapter, - TxPowerInfo24G *pwr_info_2g, - TxPowerInfo5G *pwr_info_5g, - u8 *pg_data -); - -void dump_tx_power_ext_info(void *sel, _adapter *adapter); -void dump_target_tx_power(void *sel, _adapter *adapter); -void dump_tx_power_by_rate(void *sel, _adapter *adapter); - -int rtw_get_phy_file_path(_adapter *adapter, const char *file_name); - -#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE -#define MAC_FILE_FW_NIC "FW_NIC.bin" -#define MAC_FILE_FW_WW_IMG "FW_WoWLAN.bin" -#define PHY_FILE_MAC_REG "MAC_REG.txt" - -#define PHY_FILE_AGC_TAB "AGC_TAB.txt" -#define PHY_FILE_PHY_REG "PHY_REG.txt" -#define PHY_FILE_PHY_REG_MP "PHY_REG_MP.txt" -#define PHY_FILE_PHY_REG_PG "PHY_REG_PG.txt" - -#define PHY_FILE_RADIO_A "RadioA.txt" -#define PHY_FILE_RADIO_B "RadioB.txt" -#define PHY_FILE_RADIO_C "RadioC.txt" -#define PHY_FILE_RADIO_D "RadioD.txt" -#define PHY_FILE_TXPWR_TRACK "TxPowerTrack.txt" -#define PHY_FILE_TXPWR_LMT "TXPWR_LMT.txt" - -#define PHY_FILE_WIFI_ANT_ISOLATION "wifi_ant_isolation.txt" - -#define MAX_PARA_FILE_BUF_LEN 25600 - -#define LOAD_MAC_PARA_FILE BIT0 -#define LOAD_BB_PARA_FILE BIT1 -#define LOAD_BB_PG_PARA_FILE BIT2 -#define LOAD_BB_MP_PARA_FILE BIT3 -#define LOAD_RF_PARA_FILE BIT4 -#define LOAD_RF_TXPWR_TRACK_PARA_FILE BIT5 -#define LOAD_RF_TXPWR_LMT_PARA_FILE BIT6 - -int phy_ConfigMACWithParaFile(IN PADAPTER Adapter, IN char *pFileName); -int phy_ConfigBBWithParaFile(IN PADAPTER Adapter, IN char *pFileName, IN u32 ConfigType); -int phy_ConfigBBWithPgParaFile(IN PADAPTER Adapter, IN const char *pFileName); -int phy_ConfigBBWithMpParaFile(IN PADAPTER Adapter, IN char *pFileName); -int PHY_ConfigRFWithParaFile(IN PADAPTER Adapter, IN char *pFileName, IN enum rf_path eRFPath); -int PHY_ConfigRFWithTxPwrTrackParaFile(IN PADAPTER Adapter, IN char *pFileName); -#if CONFIG_TXPWR_LIMIT -int PHY_ConfigRFWithPowerLimitTableParaFile(IN PADAPTER Adapter, IN const char *pFileName); -#endif -void phy_free_filebuf_mask(_adapter *padapter, u8 mask); -void phy_free_filebuf(_adapter *padapter); -#endif /* CONFIG_LOAD_PHY_PARA_FROM_FILE */ -u8 phy_check_under_survey_ch(_adapter *adapter); -#endif /* __HAL_COMMON_H__ */ diff --git a/drivers/net/wireless/realtek/rtl8812au/include/hal_data.h b/drivers/net/wireless/realtek/rtl8812au/include/hal_data.h deleted file mode 100644 index 61f61a71653b5b..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/include/hal_data.h +++ /dev/null @@ -1,932 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2017 Realtek Corporation. - * - * 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 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 __HAL_DATA_H__ -#define __HAL_DATA_H__ - -//#if 1/* def CONFIG_SINGLE_IMG */ - -#include "../hal/phydm/phydm_precomp.h" -#ifdef CONFIG_BT_COEXIST - #include -#endif - #include - -#if defined(CONFIG_RTW_ACS) || defined(CONFIG_BACKGROUND_NOISE_MONITOR) -#include "../hal/hal_dm_acs.h" -#endif - -/* - * For RTL8723 WiFi/BT/GPS multi-function configuration. 2010.10.06. - * */ -typedef enum _RT_MULTI_FUNC { - RT_MULTI_FUNC_NONE = 0x00, - RT_MULTI_FUNC_WIFI = 0x01, - RT_MULTI_FUNC_BT = 0x02, - RT_MULTI_FUNC_GPS = 0x04, -} RT_MULTI_FUNC, *PRT_MULTI_FUNC; -/* - * For RTL8723 WiFi PDn/GPIO polarity control configuration. 2010.10.08. - * */ -typedef enum _RT_POLARITY_CTL { - RT_POLARITY_LOW_ACT = 0, - RT_POLARITY_HIGH_ACT = 1, -} RT_POLARITY_CTL, *PRT_POLARITY_CTL; - -/* For RTL8723 regulator mode. by tynli. 2011.01.14. */ -typedef enum _RT_REGULATOR_MODE { - RT_SWITCHING_REGULATOR = 0, - RT_LDO_REGULATOR = 1, -} RT_REGULATOR_MODE, *PRT_REGULATOR_MODE; - -/* - * Interface type. - * */ -typedef enum _INTERFACE_SELECT_USB { - INTF_SEL0_USB = 0, /* USB */ - INTF_SEL1_USB_High_Power = 1, /* USB with high power PA */ - INTF_SEL2_MINICARD = 2, /* Minicard */ - INTF_SEL3_USB_Solo = 3, /* USB solo-Slim module */ - INTF_SEL4_USB_Combo = 4, /* USB Combo-Slim module */ - INTF_SEL5_USB_Combo_MF = 5, /* USB WiFi+BT Multi-Function Combo, i.e., Proprietary layout(AS-VAU) which is the same as SDIO card */ -} INTERFACE_SELECT_USB, *PINTERFACE_SELECT_USB; - -typedef enum _RT_AMPDU_BRUST_MODE { - RT_AMPDU_BRUST_NONE = 0, - RT_AMPDU_BRUST_92D = 1, - RT_AMPDU_BRUST_88E = 2, - RT_AMPDU_BRUST_8812_4 = 3, - RT_AMPDU_BRUST_8812_8 = 4, - RT_AMPDU_BRUST_8812_12 = 5, - RT_AMPDU_BRUST_8812_15 = 6, - RT_AMPDU_BRUST_8723B = 7, -} RT_AMPDU_BRUST, *PRT_AMPDU_BRUST_MODE; - -/* Tx Power Limit Table Size */ -#define MAX_REGULATION_NUM 4 -#define MAX_RF_PATH_NUM_IN_POWER_LIMIT_TABLE 4 -#define MAX_2_4G_BANDWIDTH_NUM 2 -#define MAX_RATE_SECTION_NUM 10 -#define MAX_5G_BANDWIDTH_NUM 4 - -#define MAX_BASE_NUM_IN_PHY_REG_PG_2_4G 10 /* CCK:1, OFDM:1, HT:4, VHT:4 */ -#define MAX_BASE_NUM_IN_PHY_REG_PG_5G 9 /* OFDM:1, HT:4, VHT:4 */ - -#ifdef RTW_RX_AGGREGATION -typedef enum _RX_AGG_MODE { - RX_AGG_DISABLE, - RX_AGG_DMA, - RX_AGG_USB, - RX_AGG_MIX -} RX_AGG_MODE; - -/* #define MAX_RX_DMA_BUFFER_SIZE 10240 */ /* 10K for 8192C RX DMA buffer */ - -#endif /* RTW_RX_AGGREGATION */ - -/* E-Fuse */ -#if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) - #define EFUSE_MAP_SIZE 512 -#if defined(CONFIG_RTL8814A) - #define EFUSE_MAX_SIZE 1024 -#else - #define EFUSE_MAX_SIZE 512 -#endif -/* end of E-Fuse */ - -#define Mac_OFDM_OK 0x00000000 -#define Mac_OFDM_Fail 0x10000000 -#define Mac_OFDM_FasleAlarm 0x20000000 -#define Mac_CCK_OK 0x30000000 -#define Mac_CCK_Fail 0x40000000 -#define Mac_CCK_FasleAlarm 0x50000000 -#define Mac_HT_OK 0x60000000 -#define Mac_HT_Fail 0x70000000 -#define Mac_HT_FasleAlarm 0x90000000 -#define Mac_DropPacket 0xA0000000 - -#ifdef CONFIG_RF_POWER_TRIM -#define REG_RF_BB_GAIN_OFFSET 0x55 -#define RF_GAIN_OFFSET_MASK 0xfffff -#endif /*CONFIG_RF_POWER_TRIM*/ - -/* For store initial value of BB register */ -typedef struct _BB_INIT_REGISTER { - u16 offset; - u32 value; - -} BB_INIT_REGISTER, *PBB_INIT_REGISTER; - -#define PAGE_SIZE_128 128 -#define PAGE_SIZE_256 256 -#define PAGE_SIZE_512 512 - -#define HCI_SUS_ENTER 0 -#define HCI_SUS_LEAVING 1 -#define HCI_SUS_LEAVE 2 -#define HCI_SUS_ENTERING 3 -#define HCI_SUS_ERR 4 - -#define EFUSE_FILE_UNUSED 0 -#define EFUSE_FILE_FAILED 1 -#define EFUSE_FILE_LOADED 2 - -#define MACADDR_FILE_UNUSED 0 -#define MACADDR_FILE_FAILED 1 -#define MACADDR_FILE_LOADED 2 - -#define MAX_IQK_INFO_BACKUP_CHNL_NUM 5 -#define MAX_IQK_INFO_BACKUP_REG_NUM 10 - -struct kfree_data_t { - u8 flag; - s8 bb_gain[BB_GAIN_NUM][RF_PATH_MAX]; - -#ifdef CONFIG_IEEE80211_BAND_5GHZ - s8 pa_bias_5g[RF_PATH_MAX]; - s8 pad_bias_5g[RF_PATH_MAX]; -#endif - s8 thermal; -}; - -bool kfree_data_is_bb_gain_empty(struct kfree_data_t *data); - -struct hal_spec_t { - char *ic_name; - u8 macid_num; - - u8 sec_cam_ent_num; - u8 sec_cap; - - u8 rfpath_num_2g:4; /* used for tx power index path */ - u8 rfpath_num_5g:4; /* used for tx power index path */ - u8 txgi_max; /* maximum tx power gain index */ - u8 txgi_pdbm; /* tx power gain index per dBm */ - - u8 max_tx_cnt; - u8 tx_nss_num:4; - u8 rx_nss_num:4; - u8 band_cap; /* value of BAND_CAP_XXX */ - u8 bw_cap; /* value of BW_CAP_XXX */ - u8 port_num; - u8 proto_cap; /* value of PROTO_CAP_XXX */ - u8 wl_func; /* value of WL_FUNC_XXX */ - - u8 rx_tsf_filter:1; - - u8 pg_txpwr_saddr; /* starting address of PG tx power info */ - u8 pg_txgi_diff_factor; /* PG tx power gain index diff to tx power gain index */ - - u8 hci_type; /* value of HCI Type */ -}; - -#define HAL_SPEC_CHK_RF_PATH_2G(_spec, _path) ((_spec)->rfpath_num_2g > (_path)) -#define HAL_SPEC_CHK_RF_PATH_5G(_spec, _path) ((_spec)->rfpath_num_5g > (_path)) -#define HAL_SPEC_CHK_RF_PATH(_spec, _band, _path) ( \ - _band == BAND_ON_2_4G ? HAL_SPEC_CHK_RF_PATH_2G(_spec, _path) : \ - _band == BAND_ON_5G ? HAL_SPEC_CHK_RF_PATH_5G(_spec, _path) : 0) - -#define HAL_SPEC_CHK_TX_CNT(_spec, _cnt_idx) ((_spec)->max_tx_cnt > (_cnt_idx)) - -#ifdef CONFIG_PHY_CAPABILITY_QUERY -struct phy_spec_t { - u32 trx_cap; - u32 stbc_cap; - u32 ldpc_cap; - u32 txbf_param; - u32 txbf_cap; -}; -#endif -struct hal_iqk_reg_backup { - u8 central_chnl; - u8 bw_mode; - u32 reg_backup[MAX_RF_PATH][MAX_IQK_INFO_BACKUP_REG_NUM]; -}; - - -typedef struct hal_p2p_ps_para { - /*DW0*/ - u8 offload_en:1; - u8 role:1; - u8 ctwindow_en:1; - u8 noa_en:1; - u8 noa_sel:1; - u8 all_sta_sleep:1; - u8 discovery:1; - u8 disable_close_rf:1; - u8 p2p_port_id; - u8 p2p_group; - u8 p2p_macid; - - /*DW1*/ - u8 ctwindow_length; - u8 rsvd3; - u8 rsvd4; - u8 rsvd5; - - /*DW2*/ - u32 noa_duration_para; - - /*DW3*/ - u32 noa_interval_para; - - /*DW4*/ - u32 noa_start_time_para; - - /*DW5*/ - u32 noa_count_para; -} HAL_P2P_PS_PARA, *PHAL_P2P_PS_PARA; - -#define TXPWR_LMT_RS_CCK 0 -#define TXPWR_LMT_RS_OFDM 1 -#define TXPWR_LMT_RS_HT 2 -#define TXPWR_LMT_RS_VHT 3 -#define TXPWR_LMT_RS_NUM 4 - -#define TXPWR_LMT_RS_NUM_2G 4 /* CCK, OFDM, HT, VHT */ -#define TXPWR_LMT_RS_NUM_5G 3 /* OFDM, HT, VHT */ - -#if CONFIG_TXPWR_LIMIT -extern const char *const _txpwr_lmt_rs_str[]; -#define txpwr_lmt_rs_str(rs) (((rs) >= TXPWR_LMT_RS_NUM) ? _txpwr_lmt_rs_str[TXPWR_LMT_RS_NUM] : _txpwr_lmt_rs_str[(rs)]) - -struct txpwr_lmt_ent { - _list list; - - s8 lmt_2g[MAX_2_4G_BANDWIDTH_NUM] - [TXPWR_LMT_RS_NUM_2G] - [CENTER_CH_2G_NUM] - [MAX_TX_COUNT]; - -#ifdef CONFIG_IEEE80211_BAND_5GHZ - s8 lmt_5g[MAX_5G_BANDWIDTH_NUM] - [TXPWR_LMT_RS_NUM_5G] - [CENTER_CH_5G_ALL_NUM] - [MAX_TX_COUNT]; -#endif - - char regd_name[0]; -}; -#endif /* CONFIG_TXPWR_LIMIT */ - -typedef struct hal_com_data { - HAL_VERSION version_id; - RT_MULTI_FUNC MultiFunc; /* For multi-function consideration. */ - RT_POLARITY_CTL PolarityCtl; /* For Wifi PDn Polarity control. */ - RT_REGULATOR_MODE RegulatorMode; /* switching regulator or LDO */ - u8 hw_init_completed; - /****** FW related ******/ - u32 firmware_size; - u16 firmware_version; - u16 FirmwareVersionRev; - u16 firmware_sub_version; - u16 FirmwareSignature; - u8 RegFWOffload; - u8 bFWReady; - u8 bBTFWReady; - u8 fw_ractrl; - u8 LastHMEBoxNum; /* H2C - for host message to fw */ - - /****** current WIFI_PHY values ******/ - WIRELESS_MODE CurrentWirelessMode; - enum channel_width current_channel_bw; - BAND_TYPE current_band_type; /* 0:2.4G, 1:5G */ - BAND_TYPE BandSet; - u8 current_channel; - u8 cch_20; - u8 cch_40; - u8 cch_80; - u8 CurrentCenterFrequencyIndex1; - u8 nCur40MhzPrimeSC; /* Control channel sub-carrier */ - u8 nCur80MhzPrimeSC; /* used for primary 40MHz of 80MHz mode */ - BOOLEAN bSwChnlAndSetBWInProgress; - u8 bDisableSWChannelPlan; /* flag of disable software change channel plan */ - u16 BasicRateSet; - u32 ReceiveConfig; - u32 rcr_backup; /* used for switching back from monitor mode */ - u8 rx_tsf_addr_filter_config; /* for 8822B/8821C USE */ - BOOLEAN bSwChnl; - BOOLEAN bSetChnlBW; - BOOLEAN bSWToBW40M; - BOOLEAN bSWToBW80M; - BOOLEAN bChnlBWInitialized; - u32 BackUp_BB_REG_4_2nd_CCA[3]; - -#ifdef CONFIG_RTW_ACS - struct auto_chan_sel acs; -#endif -#ifdef CONFIG_BCN_RECOVERY - u8 issue_bcn_fail; -#endif /*CONFIG_BCN_RECOVERY*/ - - /****** rf_ctrl *****/ - u8 rf_chip; - u8 rf_type; /*enum rf_type*/ - u8 PackageType; - u8 NumTotalRFPath; - u8 antenna_test; - - /****** Debug ******/ - u16 ForcedDataRate; /* Force Data Rate. 0: Auto, 0x02: 1M ~ 0x6C: 54M. */ - u8 bDumpRxPkt; - u8 bDumpTxPkt; - u8 dis_turboedca; /* 1: disable turboedca, - 2: disable turboedca and setting EDCA parameter based on the input parameter*/ - u32 edca_param_mode; - - /****** EEPROM setting.******/ - u8 bautoload_fail_flag; - u8 efuse_file_status; - u8 macaddr_file_status; - u8 EepromOrEfuse; - u8 efuse_eeprom_data[EEPROM_MAX_SIZE]; /*92C:256bytes, 88E:512bytes, we use union set (512bytes)*/ - u8 InterfaceSel; /* board type kept in eFuse */ - u16 CustomerID; - - u16 EEPROMVID; - u16 EEPROMSVID; -#ifdef CONFIG_USB_HCI - u8 EEPROMUsbSwitch; - u16 EEPROMPID; - u16 EEPROMSDID; -#endif - - u8 EEPROMCustomerID; - u8 EEPROMSubCustomerID; - u8 EEPROMVersion; - u8 EEPROMRegulatory; - u8 eeprom_thermal_meter; - u8 EEPROMBluetoothCoexist; - u8 EEPROMBluetoothType; - u8 EEPROMBluetoothAntNum; - u8 EEPROMBluetoothAntIsolation; - u8 EEPROMBluetoothRadioShared; - u8 EEPROMMACAddr[ETH_ALEN]; - u8 tx_bbswing_24G; - u8 tx_bbswing_5G; - u8 efuse0x3d7; /* efuse[0x3D7] */ - u8 efuse0x3d8; /* efuse[0x3D8] */ - -#ifdef CONFIG_RF_POWER_TRIM - u8 EEPROMRFGainOffset; - u8 EEPROMRFGainVal; - struct kfree_data_t kfree_data; -#endif /*CONFIG_RF_POWER_TRIM*/ - - u8 EfuseUsedPercentage; - u16 EfuseUsedBytes; - /*u8 EfuseMap[2][HWSET_MAX_SIZE_JAGUAR];*/ - EFUSE_HAL EfuseHal; - - /*---------------------------------------------------------------------------------*/ - /* 2.4G TX power info for target TX power*/ - u8 Index24G_CCK_Base[MAX_RF_PATH][CENTER_CH_2G_NUM]; - u8 Index24G_BW40_Base[MAX_RF_PATH][CENTER_CH_2G_NUM]; - s8 CCK_24G_Diff[MAX_RF_PATH][MAX_TX_COUNT]; - s8 OFDM_24G_Diff[MAX_RF_PATH][MAX_TX_COUNT]; - s8 BW20_24G_Diff[MAX_RF_PATH][MAX_TX_COUNT]; - s8 BW40_24G_Diff[MAX_RF_PATH][MAX_TX_COUNT]; - - /* 5G TX power info for target TX power*/ -#ifdef CONFIG_IEEE80211_BAND_5GHZ - u8 Index5G_BW40_Base[MAX_RF_PATH][CENTER_CH_5G_ALL_NUM]; - u8 Index5G_BW80_Base[MAX_RF_PATH][CENTER_CH_5G_80M_NUM]; - s8 OFDM_5G_Diff[MAX_RF_PATH][MAX_TX_COUNT]; - s8 BW20_5G_Diff[MAX_RF_PATH][MAX_TX_COUNT]; - s8 BW40_5G_Diff[MAX_RF_PATH][MAX_TX_COUNT]; - s8 BW80_5G_Diff[MAX_RF_PATH][MAX_TX_COUNT]; -#endif - - u8 txpwr_by_rate_undefined_band_path[TX_PWR_BY_RATE_NUM_BAND] - [TX_PWR_BY_RATE_NUM_RF]; - - s8 TxPwrByRateOffset[TX_PWR_BY_RATE_NUM_BAND] - [TX_PWR_BY_RATE_NUM_RF] - [TX_PWR_BY_RATE_NUM_RATE]; - - /* Store the original power by rate value of the base rate for each rate section and rf path */ - u8 TxPwrByRateBase2_4G[TX_PWR_BY_RATE_NUM_RF] - [MAX_BASE_NUM_IN_PHY_REG_PG_2_4G]; - u8 TxPwrByRateBase5G[TX_PWR_BY_RATE_NUM_RF] - [MAX_BASE_NUM_IN_PHY_REG_PG_5G]; - - u8 txpwr_by_rate_loaded:1; - u8 txpwr_by_rate_from_file:1; - u8 txpwr_limit_loaded:1; - u8 txpwr_limit_from_file:1; - u8 rf_power_tracking_type; - u8 CurrentTxPwrIdx; - - /* Read/write are allow for following hardware information variables */ - u8 crystal_cap; - - u8 PAType_2G; - u8 PAType_5G; - u8 LNAType_2G; - u8 LNAType_5G; - u8 ExternalPA_2G; - u8 ExternalLNA_2G; - u8 external_pa_5g; - u8 external_lna_5g; - u16 TypeGLNA; - u16 TypeGPA; - u16 TypeALNA; - u16 TypeAPA; - u16 rfe_type; - - u8 bLedOpenDrain; /* Support Open-drain arrangement for controlling the LED. Added by Roger, 2009.10.16. */ - u32 ac_param_be; /* Original parameter for BE, use for EDCA turbo. */ - u8 is_turbo_edca; - u8 prv_traffic_idx; - BB_REGISTER_DEFINITION_T PHYRegDef[MAX_RF_PATH]; /* Radio A/B/C/D */ - - u32 RfRegChnlVal[MAX_RF_PATH]; - - /* RDG enable */ - BOOLEAN bRDGEnable; - - u16 RegRRSR; - /****** antenna diversity ******/ - u8 AntDivCfg; - u8 with_extenal_ant_switch; - u8 b_fix_tx_ant; - u8 AntDetection; - u8 TRxAntDivType; - u8 ant_path; /* for 8723B s0/s1 selection */ - u32 antenna_tx_path; /* Antenna path Tx */ - u32 AntennaRxPath; /* Antenna path Rx */ - u8 sw_antdiv_bl_state; - - /******** PHY DM & DM Section **********/ - _lock IQKSpinLock; - u8 INIDATA_RATE[MACID_NUM_SW_LIMIT]; - - struct dm_struct odmpriv; - u64 bk_rf_ability; - u8 bIQKInitialized; - u8 bNeedIQK; - u8 neediqk_24g; - u8 IQK_MP_Switch; - u8 bScanInProcess; - /******** PHY DM & DM Section **********/ - - /* 2010/08/09 MH Add CU power down mode. */ - BOOLEAN pwrdown; - - /* Add for dual MAC 0--Mac0 1--Mac1 */ - u32 interfaceIndex; - -#ifdef CONFIG_P2P -#ifdef CONFIG_P2P_PS_NOA_USE_MACID_SLEEP - u16 p2p_ps_offload; -#else - u8 p2p_ps_offload; -#endif -#endif - /* Auto FSM to Turn On, include clock, isolation, power control for MAC only */ - u8 bMacPwrCtrlOn; - u8 hci_sus_state; - - u8 RegIQKFWOffload; - struct submit_ctx iqk_sctx; - u8 ch_switch_offload; - struct submit_ctx chsw_sctx; - - RT_AMPDU_BRUST AMPDUBurstMode; /* 92C maybe not use, but for compile successfully */ - - u8 OutEpQueueSel; - u8 OutEpNumber; - -#ifdef RTW_RX_AGGREGATION - RX_AGG_MODE rxagg_mode; - - /* For RX Aggregation DMA Mode */ - u8 rxagg_dma_size; - u8 rxagg_dma_timeout; -#endif /* RTW_RX_AGGREGATION */ - -#ifdef CONFIG_USB_HCI - - /* 2010/12/10 MH Add for USB aggreation mode dynamic shceme. */ - BOOLEAN UsbRxHighSpeedMode; - BOOLEAN UsbTxVeryHighSpeedMode; - u32 UsbBulkOutSize; - BOOLEAN bSupportUSB3; - u8 usb_intf_start; - - /* Interrupt relatd register information. */ - u32 IntArray[3];/* HISR0,HISR1,HSISR */ - u32 IntrMask[3]; -#ifdef CONFIG_USB_TX_AGGREGATION - u8 UsbTxAggMode; - u8 UsbTxAggDescNum; -#endif /* CONFIG_USB_TX_AGGREGATION */ - -#ifdef CONFIG_USB_RX_AGGREGATION - u16 HwRxPageSize; /* Hardware setting */ - - /* For RX Aggregation USB Mode */ - u8 rxagg_usb_size; - u8 rxagg_usb_timeout; -#endif/* CONFIG_USB_RX_AGGREGATION */ -#endif /* CONFIG_USB_HCI */ - -#ifdef DBG_CONFIG_ERROR_DETECT - struct sreset_priv srestpriv; -#endif /* #ifdef DBG_CONFIG_ERROR_DETECT */ - -#ifdef CONFIG_BT_COEXIST - /* For bluetooth co-existance */ - BT_COEXIST bt_coexist; -#endif /* CONFIG_BT_COEXIST */ - -#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE - char para_file_buf[MAX_PARA_FILE_BUF_LEN]; - char *mac_reg; - u32 mac_reg_len; - char *bb_phy_reg; - u32 bb_phy_reg_len; - char *bb_agc_tab; - u32 bb_agc_tab_len; - char *bb_phy_reg_pg; - u32 bb_phy_reg_pg_len; - char *bb_phy_reg_mp; - u32 bb_phy_reg_mp_len; - char *rf_radio_a; - u32 rf_radio_a_len; - char *rf_radio_b; - u32 rf_radio_b_len; - char *rf_tx_pwr_track; - u32 rf_tx_pwr_track_len; - char *rf_tx_pwr_lmt; - u32 rf_tx_pwr_lmt_len; -#endif - -#ifdef CONFIG_BACKGROUND_NOISE_MONITOR - struct noise_monitor nm; -#endif - - struct hal_spec_t hal_spec; -#ifdef CONFIG_PHY_CAPABILITY_QUERY - struct phy_spec_t phy_spec; -#endif - u8 RfKFreeEnable; - u8 RfKFree_ch_group; - BOOLEAN bCCKinCH14; - BB_INIT_REGISTER RegForRecover[5]; - - u32 RxGainOffset[4]; /*{2G, 5G_Low, 5G_Middle, G_High}*/ - u8 BackUp_IG_REG_4_Chnl_Section[4]; /*{A,B,C,D}*/ - - struct hal_iqk_reg_backup iqk_reg_backup[MAX_IQK_INFO_BACKUP_CHNL_NUM]; - -#ifdef RTW_HALMAC - u16 drv_rsvd_page_number; -#endif - -#ifdef CONFIG_BEAMFORMING - u8 backup_snd_ptcl_ctrl; -#ifdef RTW_BEAMFORMING_VERSION_2 - struct beamforming_info beamforming_info; -#endif /* RTW_BEAMFORMING_VERSION_2 */ -#endif /* CONFIG_BEAMFORMING */ - - u8 not_xmitframe_fw_dl; /*not use xmitframe to download fw*/ - u8 phydm_op_mode; - - u8 in_cta_test; - -#ifdef CONFIG_RTW_LED - struct led_priv led; -#endif -} HAL_DATA_COMMON, *PHAL_DATA_COMMON; - -typedef struct hal_com_data HAL_DATA_TYPE, *PHAL_DATA_TYPE; -#define GET_HAL_DATA(__pAdapter) ((HAL_DATA_TYPE *)(((struct _ADAPTER*)__pAdapter)->HalData)) -#define GET_HAL_SPEC(__pAdapter) (&(GET_HAL_DATA((__pAdapter))->hal_spec)) -#define adapter_to_led(adapter) (&(GET_HAL_DATA(adapter)->led)) - -#define GET_HAL_RFPATH_NUM(__pAdapter) (((HAL_DATA_TYPE *)((__pAdapter)->HalData))->NumTotalRFPath) -#define RT_GetInterfaceSelection(_Adapter) (GET_HAL_DATA(_Adapter)->InterfaceSel) -#define GET_RF_TYPE(__pAdapter) (GET_HAL_DATA(__pAdapter)->rf_type) -#define GET_KFREE_DATA(_adapter) (&(GET_HAL_DATA((_adapter))->kfree_data)) - -#define SUPPORT_HW_RADIO_DETECT(Adapter) (RT_GetInterfaceSelection(Adapter) == INTF_SEL2_MINICARD || \ - RT_GetInterfaceSelection(Adapter) == INTF_SEL3_USB_Solo || \ - RT_GetInterfaceSelection(Adapter) == INTF_SEL4_USB_Combo) - -#define get_hal_mac_addr(adapter) (GET_HAL_DATA(adapter)->EEPROMMACAddr) -#define is_boot_from_eeprom(adapter) (GET_HAL_DATA(adapter)->EepromOrEfuse) -#define rtw_get_hw_init_completed(adapter) (GET_HAL_DATA(adapter)->hw_init_completed) -#define rtw_set_hw_init_completed(adapter, cmp) (GET_HAL_DATA(adapter)->hw_init_completed = cmp) -#define rtw_is_hw_init_completed(adapter) (GET_HAL_DATA(adapter)->hw_init_completed == _TRUE) -#endif - -#ifdef RTW_HALMAC -int rtw_halmac_deinit_adapter(struct dvobj_priv *); -#endif /* RTW_HALMAC */ - -/* alias for phydm coding style */ -#define REG_OFDM_0_XA_TX_IQ_IMBALANCE rOFDM0_XATxIQImbalance -#define REG_OFDM_0_ECCA_THRESHOLD rOFDM0_ECCAThreshold -#define REG_FPGA0_XB_LSSI_READ_BACK rFPGA0_XB_LSSIReadBack -#define REG_FPGA0_TX_GAIN_STAGE rFPGA0_TxGainStage -#define REG_OFDM_0_XA_AGC_CORE1 rOFDM0_XAAGCCore1 -#define REG_OFDM_0_XB_AGC_CORE1 rOFDM0_XBAGCCore1 -#define REG_A_TX_SCALE_JAGUAR rA_TxScale_Jaguar -#define REG_B_TX_SCALE_JAGUAR rB_TxScale_Jaguar - -#define REG_FPGA0_XAB_RF_INTERFACE_SW rFPGA0_XAB_RFInterfaceSW -#define REG_FPGA0_XAB_RF_PARAMETER rFPGA0_XAB_RFParameter -#define REG_FPGA0_XA_HSSI_PARAMETER1 rFPGA0_XA_HSSIParameter1 -#define REG_FPGA0_XA_LSSI_PARAMETER rFPGA0_XA_LSSIParameter -#define REG_FPGA0_XA_RF_INTERFACE_OE rFPGA0_XA_RFInterfaceOE -#define REG_FPGA0_XB_HSSI_PARAMETER1 rFPGA0_XB_HSSIParameter1 -#define REG_FPGA0_XB_LSSI_PARAMETER rFPGA0_XB_LSSIParameter -#define REG_FPGA0_XB_LSSI_READ_BACK rFPGA0_XB_LSSIReadBack -#define REG_FPGA0_XB_RF_INTERFACE_OE rFPGA0_XB_RFInterfaceOE -#define REG_FPGA0_XCD_RF_INTERFACE_SW rFPGA0_XCD_RFInterfaceSW -#define REG_FPGA0_XCD_SWITCH_CONTROL rFPGA0_XCD_SwitchControl -#define REG_FPGA1_TX_BLOCK rFPGA1_TxBlock -#define REG_FPGA1_TX_INFO rFPGA1_TxInfo -#define REG_IQK_AGC_CONT rIQK_AGC_Cont -#define REG_IQK_AGC_PTS rIQK_AGC_Pts -#define REG_IQK_AGC_RSP rIQK_AGC_Rsp -#define REG_OFDM_0_AGC_RSSI_TABLE rOFDM0_AGCRSSITable -#define REG_OFDM_0_ECCA_THRESHOLD rOFDM0_ECCAThreshold -#define REG_OFDM_0_RX_IQ_EXT_ANTA rOFDM0_RxIQExtAnta -#define REG_OFDM_0_TR_MUX_PAR rOFDM0_TRMuxPar -#define REG_OFDM_0_TRX_PATH_ENABLE rOFDM0_TRxPathEnable -#define REG_OFDM_0_XA_AGC_CORE1 rOFDM0_XAAGCCore1 -#define REG_OFDM_0_XA_RX_IQ_IMBALANCE rOFDM0_XARxIQImbalance -#define REG_OFDM_0_XA_TX_IQ_IMBALANCE rOFDM0_XATxIQImbalance -#define REG_OFDM_0_XB_AGC_CORE1 rOFDM0_XBAGCCore1 -#define REG_OFDM_0_XB_RX_IQ_IMBALANCE rOFDM0_XBRxIQImbalance -#define REG_OFDM_0_XB_TX_IQ_IMBALANCE rOFDM0_XBTxIQImbalance -#define REG_OFDM_0_XC_TX_AFE rOFDM0_XCTxAFE -#define REG_OFDM_0_XD_TX_AFE rOFDM0_XDTxAFE - -/*#define REG_A_CFO_LONG_DUMP_92E rA_CfoLongDump_92E*/ -#define REG_A_CFO_LONG_DUMP_JAGUAR rA_CfoLongDump_Jaguar -/*#define REG_A_CFO_SHORT_DUMP_92E rA_CfoShortDump_92E*/ -#define REG_A_CFO_SHORT_DUMP_JAGUAR rA_CfoShortDump_Jaguar -#define REG_A_RFE_PINMUX_JAGUAR rA_RFE_Pinmux_Jaguar -/*#define REG_A_RSSI_DUMP_92E rA_RSSIDump_92E*/ -#define REG_A_RSSI_DUMP_JAGUAR rA_RSSIDump_Jaguar -/*#define REG_A_RX_SNR_DUMP_92E rA_RXsnrDump_92E*/ -#define REG_A_RX_SNR_DUMP_JAGUAR rA_RXsnrDump_Jaguar -/*#define REG_A_TX_AGC rA_TXAGC*/ -#define REG_A_TX_SCALE_JAGUAR rA_TxScale_Jaguar -#define REG_BW_INDICATION_JAGUAR rBWIndication_Jaguar -/*#define REG_B_BBSWING rB_BBSWING*/ -/*#define REG_B_CFO_LONG_DUMP_92E rB_CfoLongDump_92E*/ -#define REG_B_CFO_LONG_DUMP_JAGUAR rB_CfoLongDump_Jaguar -/*#define REG_B_CFO_SHORT_DUMP_92E rB_CfoShortDump_92E*/ -#define REG_B_CFO_SHORT_DUMP_JAGUAR rB_CfoShortDump_Jaguar -/*#define REG_B_RSSI_DUMP_92E rB_RSSIDump_92E*/ -#define REG_B_RSSI_DUMP_JAGUAR rB_RSSIDump_Jaguar -/*#define REG_B_RX_SNR_DUMP_92E rB_RXsnrDump_92E*/ -#define REG_B_RX_SNR_DUMP_JAGUAR rB_RXsnrDump_Jaguar -/*#define REG_B_TX_AGC rB_TXAGC*/ -#define REG_B_TX_SCALE_JAGUAR rB_TxScale_Jaguar -#define REG_BLUE_TOOTH rBlue_Tooth -#define REG_CCK_0_AFE_SETTING rCCK0_AFESetting -/*#define REG_C_BBSWING rC_BBSWING*/ -/*#define REG_C_TX_AGC rC_TXAGC*/ -#define REG_C_TX_SCALE_JAGUAR2 rC_TxScale_Jaguar2 -#define REG_CONFIG_ANT_A rConfig_AntA -#define REG_CONFIG_ANT_B rConfig_AntB -#define REG_CONFIG_PMPD_ANT_A rConfig_Pmpd_AntA -#define REG_CONFIG_PMPD_ANT_B rConfig_Pmpd_AntB -#define REG_DPDT_CONTROL rDPDT_control -/*#define REG_D_BBSWING rD_BBSWING*/ -/*#define REG_D_TX_AGC rD_TXAGC*/ -#define REG_D_TX_SCALE_JAGUAR2 rD_TxScale_Jaguar2 -#define REG_FPGA0_ANALOG_PARAMETER4 rFPGA0_AnalogParameter4 -#define REG_FPGA0_IQK rFPGA0_IQK -#define REG_FPGA0_PSD_FUNCTION rFPGA0_PSDFunction -#define REG_FPGA0_PSD_REPORT rFPGA0_PSDReport -#define REG_FPGA0_RFMOD rFPGA0_RFMOD -#define REG_FPGA0_TX_GAIN_STAGE rFPGA0_TxGainStage -#define REG_FPGA0_XAB_RF_INTERFACE_SW rFPGA0_XAB_RFInterfaceSW -#define REG_FPGA0_XAB_RF_PARAMETER rFPGA0_XAB_RFParameter -#define REG_FPGA0_XA_HSSI_PARAMETER1 rFPGA0_XA_HSSIParameter1 -#define REG_FPGA0_XA_LSSI_PARAMETER rFPGA0_XA_LSSIParameter -#define REG_FPGA0_XA_RF_INTERFACE_OE rFPGA0_XA_RFInterfaceOE -#define REG_FPGA0_XB_HSSI_PARAMETER1 rFPGA0_XB_HSSIParameter1 -#define REG_FPGA0_XB_LSSI_PARAMETER rFPGA0_XB_LSSIParameter -#define REG_FPGA0_XB_LSSI_READ_BACK rFPGA0_XB_LSSIReadBack -#define REG_FPGA0_XB_RF_INTERFACE_OE rFPGA0_XB_RFInterfaceOE -#define REG_FPGA0_XCD_RF_INTERFACE_SW rFPGA0_XCD_RFInterfaceSW -#define REG_FPGA0_XCD_SWITCH_CONTROL rFPGA0_XCD_SwitchControl -#define REG_FPGA1_TX_BLOCK rFPGA1_TxBlock -#define REG_FPGA1_TX_INFO rFPGA1_TxInfo -#define REG_IQK_AGC_CONT rIQK_AGC_Cont -#define REG_IQK_AGC_PTS rIQK_AGC_Pts -#define REG_IQK_AGC_RSP rIQK_AGC_Rsp -#define REG_OFDM_0_AGC_RSSI_TABLE rOFDM0_AGCRSSITable -#define REG_OFDM_0_ECCA_THRESHOLD rOFDM0_ECCAThreshold -#define REG_OFDM_0_RX_IQ_EXT_ANTA rOFDM0_RxIQExtAnta -#define REG_OFDM_0_TR_MUX_PAR rOFDM0_TRMuxPar -#define REG_OFDM_0_TRX_PATH_ENABLE rOFDM0_TRxPathEnable -#define REG_OFDM_0_XA_AGC_CORE1 rOFDM0_XAAGCCore1 -#define REG_OFDM_0_XA_RX_IQ_IMBALANCE rOFDM0_XARxIQImbalance -#define REG_OFDM_0_XA_TX_IQ_IMBALANCE rOFDM0_XATxIQImbalance -#define REG_OFDM_0_XB_AGC_CORE1 rOFDM0_XBAGCCore1 -#define REG_OFDM_0_XB_RX_IQ_IMBALANCE rOFDM0_XBRxIQImbalance -#define REG_OFDM_0_XB_TX_IQ_IMBALANCE rOFDM0_XBTxIQImbalance -#define REG_OFDM_0_XC_TX_AFE rOFDM0_XCTxAFE -#define REG_OFDM_0_XD_TX_AFE rOFDM0_XDTxAFE -#define REG_PMPD_ANAEN rPMPD_ANAEN -#define REG_PDP_ANT_A rPdp_AntA -#define REG_PDP_ANT_A_4 rPdp_AntA_4 -#define REG_PDP_ANT_B rPdp_AntB -#define REG_PDP_ANT_B_4 rPdp_AntB_4 -#define REG_PWED_TH_JAGUAR rPwed_TH_Jaguar -#define REG_RX_CCK rRx_CCK -#define REG_RX_IQK rRx_IQK -#define REG_RX_IQK_PI_A rRx_IQK_PI_A -#define REG_RX_IQK_PI_B rRx_IQK_PI_B -#define REG_RX_IQK_TONE_A rRx_IQK_Tone_A -#define REG_RX_IQK_TONE_B rRx_IQK_Tone_B -#define REG_RX_OFDM rRx_OFDM -#define REG_RX_POWER_AFTER_IQK_A_2 rRx_Power_After_IQK_A_2 -#define REG_RX_POWER_AFTER_IQK_B_2 rRx_Power_After_IQK_B_2 -#define REG_RX_POWER_BEFORE_IQK_A_2 rRx_Power_Before_IQK_A_2 -#define REG_RX_POWER_BEFORE_IQK_B_2 rRx_Power_Before_IQK_B_2 -#define REG_RX_TO_RX rRx_TO_Rx -#define REG_RX_WAIT_CCA rRx_Wait_CCA -#define REG_RX_WAIT_RIFS rRx_Wait_RIFS -#define REG_S0_S1_PATH_SWITCH rS0S1_PathSwitch -/*#define REG_S1_RXEVM_DUMP_92E rS1_RXevmDump_92E*/ -#define REG_S1_RXEVM_DUMP_JAGUAR rS1_RXevmDump_Jaguar -/*#define REG_S2_RXEVM_DUMP_92E rS2_RXevmDump_92E*/ -#define REG_S2_RXEVM_DUMP_JAGUAR rS2_RXevmDump_Jaguar -#define REG_SYM_WLBT_PAPE_SEL rSYM_WLBT_PAPE_SEL -#define REG_SINGLE_TONE_CONT_TX_JAGUAR rSingleTone_ContTx_Jaguar -#define REG_SLEEP rSleep -#define REG_STANDBY rStandby -#define REG_TX_AGC_A_CCK_11_CCK_1_JAGUAR rTxAGC_A_CCK11_CCK1_JAguar -#define REG_TX_AGC_A_CCK_1_MCS32 rTxAGC_A_CCK1_Mcs32 -#define REG_TX_AGC_A_MCS11_MCS8_JAGUAR rTxAGC_A_MCS11_MCS8_JAguar -#define REG_TX_AGC_A_MCS15_MCS12_JAGUAR rTxAGC_A_MCS15_MCS12_JAguar -#define REG_TX_AGC_A_MCS19_MCS16_JAGUAR rTxAGC_A_MCS19_MCS16_JAguar -#define REG_TX_AGC_A_MCS23_MCS20_JAGUAR rTxAGC_A_MCS23_MCS20_JAguar -#define REG_TX_AGC_A_MCS3_MCS0_JAGUAR rTxAGC_A_MCS3_MCS0_JAguar -#define REG_TX_AGC_A_MCS7_MCS4_JAGUAR rTxAGC_A_MCS7_MCS4_JAguar -#define REG_TX_AGC_A_MCS03_MCS00 rTxAGC_A_Mcs03_Mcs00 -#define REG_TX_AGC_A_MCS07_MCS04 rTxAGC_A_Mcs07_Mcs04 -#define REG_TX_AGC_A_MCS11_MCS08 rTxAGC_A_Mcs11_Mcs08 -#define REG_TX_AGC_A_MCS15_MCS12 rTxAGC_A_Mcs15_Mcs12 -#define REG_TX_AGC_A_NSS1_INDEX3_NSS1_INDEX0_JAGUAR rTxAGC_A_Nss1Index3_Nss1Index0_JAguar -#define REG_TX_AGC_A_NSS1_INDEX7_NSS1_INDEX4_JAGUAR rTxAGC_A_Nss1Index7_Nss1Index4_JAguar -#define REG_TX_AGC_A_NSS2_INDEX1_NSS1_INDEX8_JAGUAR rTxAGC_A_Nss2Index1_Nss1Index8_JAguar -#define REG_TX_AGC_A_NSS2_INDEX5_NSS2_INDEX2_JAGUAR rTxAGC_A_Nss2Index5_Nss2Index2_JAguar -#define REG_TX_AGC_A_NSS2_INDEX9_NSS2_INDEX6_JAGUAR rTxAGC_A_Nss2Index9_Nss2Index6_JAguar -#define REG_TX_AGC_A_NSS3_INDEX3_NSS3_INDEX0_JAGUAR rTxAGC_A_Nss3Index3_Nss3Index0_JAguar -#define REG_TX_AGC_A_NSS3_INDEX7_NSS3_INDEX4_JAGUAR rTxAGC_A_Nss3Index7_Nss3Index4_JAguar -#define REG_TX_AGC_A_NSS3_INDEX9_NSS3_INDEX8_JAGUAR rTxAGC_A_Nss3Index9_Nss3Index8_JAguar -#define REG_TX_AGC_A_OFDM18_OFDM6_JAGUAR rTxAGC_A_Ofdm18_Ofdm6_JAguar -#define REG_TX_AGC_A_OFDM54_OFDM24_JAGUAR rTxAGC_A_Ofdm54_Ofdm24_JAguar -#define REG_TX_AGC_A_RATE18_06 rTxAGC_A_Rate18_06 -#define REG_TX_AGC_A_RATE54_24 rTxAGC_A_Rate54_24 -#define REG_TX_AGC_B_CCK_11_A_CCK_2_11 rTxAGC_B_CCK11_A_CCK2_11 -#define REG_TX_AGC_B_CCK_11_CCK_1_JAGUAR rTxAGC_B_CCK11_CCK1_JAguar -#define REG_TX_AGC_B_CCK_1_55_MCS32 rTxAGC_B_CCK1_55_Mcs32 -#define REG_TX_AGC_B_MCS11_MCS8_JAGUAR rTxAGC_B_MCS11_MCS8_JAguar -#define REG_TX_AGC_B_MCS15_MCS12_JAGUAR rTxAGC_B_MCS15_MCS12_JAguar -#define REG_TX_AGC_B_MCS19_MCS16_JAGUAR rTxAGC_B_MCS19_MCS16_JAguar -#define REG_TX_AGC_B_MCS23_MCS20_JAGUAR rTxAGC_B_MCS23_MCS20_JAguar -#define REG_TX_AGC_B_MCS3_MCS0_JAGUAR rTxAGC_B_MCS3_MCS0_JAguar -#define REG_TX_AGC_B_MCS7_MCS4_JAGUAR rTxAGC_B_MCS7_MCS4_JAguar -#define REG_TX_AGC_B_MCS03_MCS00 rTxAGC_B_Mcs03_Mcs00 -#define REG_TX_AGC_B_MCS07_MCS04 rTxAGC_B_Mcs07_Mcs04 -#define REG_TX_AGC_B_MCS11_MCS08 rTxAGC_B_Mcs11_Mcs08 -#define REG_TX_AGC_B_MCS15_MCS12 rTxAGC_B_Mcs15_Mcs12 -#define REG_TX_AGC_B_NSS1_INDEX3_NSS1_INDEX0_JAGUAR rTxAGC_B_Nss1Index3_Nss1Index0_JAguar -#define REG_TX_AGC_B_NSS1_INDEX7_NSS1_INDEX4_JAGUAR rTxAGC_B_Nss1Index7_Nss1Index4_JAguar -#define REG_TX_AGC_B_NSS2_INDEX1_NSS1_INDEX8_JAGUAR rTxAGC_B_Nss2Index1_Nss1Index8_JAguar -#define REG_TX_AGC_B_NSS2_INDEX5_NSS2_INDEX2_JAGUAR rTxAGC_B_Nss2Index5_Nss2Index2_JAguar -#define REG_TX_AGC_B_NSS2_INDEX9_NSS2_INDEX6_JAGUAR rTxAGC_B_Nss2Index9_Nss2Index6_JAguar -#define REG_TX_AGC_B_NSS3_INDEX3_NSS3_INDEX0_JAGUAR rTxAGC_B_Nss3Index3_Nss3Index0_JAguar -#define REG_TX_AGC_B_NSS3_INDEX7_NSS3_INDEX4_JAGUAR rTxAGC_B_Nss3Index7_Nss3Index4_JAguar -#define REG_TX_AGC_B_NSS3_INDEX9_NSS3_INDEX8_JAGUAR rTxAGC_B_Nss3Index9_Nss3Index8_JAguar -#define REG_TX_AGC_B_OFDM18_OFDM6_JAGUAR rTxAGC_B_Ofdm18_Ofdm6_JAguar -#define REG_TX_AGC_B_OFDM54_OFDM24_JAGUAR rTxAGC_B_Ofdm54_Ofdm24_JAguar -#define REG_TX_AGC_B_RATE18_06 rTxAGC_B_Rate18_06 -#define REG_TX_AGC_B_RATE54_24 rTxAGC_B_Rate54_24 -#define REG_TX_AGC_C_CCK_11_CCK_1_JAGUAR rTxAGC_C_CCK11_CCK1_JAguar -#define REG_TX_AGC_C_MCS11_MCS8_JAGUAR rTxAGC_C_MCS11_MCS8_JAguar -#define REG_TX_AGC_C_MCS15_MCS12_JAGUAR rTxAGC_C_MCS15_MCS12_JAguar -#define REG_TX_AGC_C_MCS19_MCS16_JAGUAR rTxAGC_C_MCS19_MCS16_JAguar -#define REG_TX_AGC_C_MCS23_MCS20_JAGUAR rTxAGC_C_MCS23_MCS20_JAguar -#define REG_TX_AGC_C_MCS3_MCS0_JAGUAR rTxAGC_C_MCS3_MCS0_JAguar -#define REG_TX_AGC_C_MCS7_MCS4_JAGUAR rTxAGC_C_MCS7_MCS4_JAguar -#define REG_TX_AGC_C_NSS1_INDEX3_NSS1_INDEX0_JAGUAR rTxAGC_C_Nss1Index3_Nss1Index0_JAguar -#define REG_TX_AGC_C_NSS1_INDEX7_NSS1_INDEX4_JAGUAR rTxAGC_C_Nss1Index7_Nss1Index4_JAguar -#define REG_TX_AGC_C_NSS2_INDEX1_NSS1_INDEX8_JAGUAR rTxAGC_C_Nss2Index1_Nss1Index8_JAguar -#define REG_TX_AGC_C_NSS2_INDEX5_NSS2_INDEX2_JAGUAR rTxAGC_C_Nss2Index5_Nss2Index2_JAguar -#define REG_TX_AGC_C_NSS2_INDEX9_NSS2_INDEX6_JAGUAR rTxAGC_C_Nss2Index9_Nss2Index6_JAguar -#define REG_TX_AGC_C_NSS3_INDEX3_NSS3_INDEX0_JAGUAR rTxAGC_C_Nss3Index3_Nss3Index0_JAguar -#define REG_TX_AGC_C_NSS3_INDEX7_NSS3_INDEX4_JAGUAR rTxAGC_C_Nss3Index7_Nss3Index4_JAguar -#define REG_TX_AGC_C_NSS3_INDEX9_NSS3_INDEX8_JAGUAR rTxAGC_C_Nss3Index9_Nss3Index8_JAguar -#define REG_TX_AGC_C_OFDM18_OFDM6_JAGUAR rTxAGC_C_Ofdm18_Ofdm6_JAguar -#define REG_TX_AGC_C_OFDM54_OFDM24_JAGUAR rTxAGC_C_Ofdm54_Ofdm24_JAguar -#define REG_TX_AGC_D_CCK_11_CCK_1_JAGUAR rTxAGC_D_CCK11_CCK1_JAguar -#define REG_TX_AGC_D_MCS11_MCS8_JAGUAR rTxAGC_D_MCS11_MCS8_JAguar -#define REG_TX_AGC_D_MCS15_MCS12_JAGUAR rTxAGC_D_MCS15_MCS12_JAguar -#define REG_TX_AGC_D_MCS19_MCS16_JAGUAR rTxAGC_D_MCS19_MCS16_JAguar -#define REG_TX_AGC_D_MCS23_MCS20_JAGUAR rTxAGC_D_MCS23_MCS20_JAguar -#define REG_TX_AGC_D_MCS3_MCS0_JAGUAR rTxAGC_D_MCS3_MCS0_JAguar -#define REG_TX_AGC_D_MCS7_MCS4_JAGUAR rTxAGC_D_MCS7_MCS4_JAguar -#define REG_TX_AGC_D_NSS1_INDEX3_NSS1_INDEX0_JAGUAR rTxAGC_D_Nss1Index3_Nss1Index0_JAguar -#define REG_TX_AGC_D_NSS1_INDEX7_NSS1_INDEX4_JAGUAR rTxAGC_D_Nss1Index7_Nss1Index4_JAguar -#define REG_TX_AGC_D_NSS2_INDEX1_NSS1_INDEX8_JAGUAR rTxAGC_D_Nss2Index1_Nss1Index8_JAguar -#define REG_TX_AGC_D_NSS2_INDEX5_NSS2_INDEX2_JAGUAR rTxAGC_D_Nss2Index5_Nss2Index2_JAguar -#define REG_TX_AGC_D_NSS2_INDEX9_NSS2_INDEX6_JAGUAR rTxAGC_D_Nss2Index9_Nss2Index6_JAguar -#define REG_TX_AGC_D_NSS3_INDEX3_NSS3_INDEX0_JAGUAR rTxAGC_D_Nss3Index3_Nss3Index0_JAguar -#define REG_TX_AGC_D_NSS3_INDEX7_NSS3_INDEX4_JAGUAR rTxAGC_D_Nss3Index7_Nss3Index4_JAguar -#define REG_TX_AGC_D_NSS3_INDEX9_NSS3_INDEX8_JAGUAR rTxAGC_D_Nss3Index9_Nss3Index8_JAguar -#define REG_TX_AGC_D_OFDM18_OFDM6_JAGUAR rTxAGC_D_Ofdm18_Ofdm6_JAguar -#define REG_TX_AGC_D_OFDM54_OFDM24_JAGUAR rTxAGC_D_Ofdm54_Ofdm24_JAguar -#define REG_TX_PATH_JAGUAR rTxPath_Jaguar -#define REG_TX_CCK_BBON rTx_CCK_BBON -#define REG_TX_CCK_RFON rTx_CCK_RFON -#define REG_TX_IQK rTx_IQK -#define REG_TX_IQK_PI_A rTx_IQK_PI_A -#define REG_TX_IQK_PI_B rTx_IQK_PI_B -#define REG_TX_IQK_TONE_A rTx_IQK_Tone_A -#define REG_TX_IQK_TONE_B rTx_IQK_Tone_B -#define REG_TX_OFDM_BBON rTx_OFDM_BBON -#define REG_TX_OFDM_RFON rTx_OFDM_RFON -#define REG_TX_POWER_AFTER_IQK_A rTx_Power_After_IQK_A -#define REG_TX_POWER_AFTER_IQK_B rTx_Power_After_IQK_B -#define REG_TX_POWER_BEFORE_IQK_A rTx_Power_Before_IQK_A -#define REG_TX_POWER_BEFORE_IQK_B rTx_Power_Before_IQK_B -#define REG_TX_TO_RX rTx_To_Rx -#define REG_TX_TO_TX rTx_To_Tx -#define REG_APK rAPK -#define REG_ANTSEL_SW_JAGUAR r_ANTSEL_SW_Jaguar - -#define rf_welut_jaguar RF_WeLut_Jaguar -#define rf_mode_table_addr RF_ModeTableAddr -#define rf_mode_table_data0 RF_ModeTableData0 -#define rf_mode_table_data1 RF_ModeTableData1 - -#define RX_SMOOTH_FACTOR Rx_Smooth_Factor - -extern unsigned char RTW_WPA_OUI[]; -extern unsigned char WMM_OUI[]; -extern unsigned char WPS_OUI[]; -extern unsigned char P2P_OUI[]; -extern unsigned char WFD_OUI[]; - -int pm_netdev_open(struct net_device *pnetdev,u8 bnormal); -void *scdb_findEntry(_adapter *priv, unsigned char *macAddr, unsigned char *ipAddr); -void dhcp_flag_bcast(_adapter *priv, struct sk_buff *skb); -int nat25_handle_frame(_adapter *priv, struct sk_buff *skb); -int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method); -void nat25_db_expire(_adapter *priv); -extern unsigned char REALTEK_96B_IE[]; -int rtw_change_ifname(_adapter *padapter, const char *ifname); -void indicate_wx_scan_complete_event(_adapter *padapter); -u8 rtw_do_join(_adapter *padapter); -int _netdev_open(struct net_device *pnetdev); -int netdev_open (struct net_device *pnetdev); -u8 key_2char2num(u8 hch, u8 lch); -u8 key_2char2num(u8 hch, u8 lch); -void macstr2num(u8 *dst, u8 *src); -#ifdef CONFIG_AUTOSUSPEND -void autosuspend_enter(_adapter* padapter); -#endif - -/* -#ifdef CONFIG_RESUME_IN_WORKQUEUE || CONFIG_HAS_EARLYSUSPEND -int rtw_resume_process(_adapter *padapter); -#endif -#ifdef CONFIG_ANDROID_POWER -#if defined(CONFIG_USB_HCI) -int rtw_resume_process(PADAPTER padapter); -#endif -#ifdef CONFIG_AUTOSUSPEND -void autosuspend_enter(_adapter* padapter); -int autoresume_enter(_adapter* padapter); -#endif -#ifdef SUPPORT_HW_RFOFF_DETECTED -int rtw_hw_suspend(_adapter *padapter ); -int rtw_hw_resume(_adapter *padapter); -#endif -*/ - -#endif /* __HAL_DATA_H__ */ diff --git a/drivers/net/wireless/realtek/rtl8812au/include/hal_ic_cfg.h b/drivers/net/wireless/realtek/rtl8812au/include/hal_ic_cfg.h deleted file mode 100644 index cc3ab5cad27b02..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/include/hal_ic_cfg.h +++ /dev/null @@ -1,313 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2017 Realtek Corporation. - * - * 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 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 __HAL_IC_CFG_H__ -#define __HAL_IC_CFG_H__ - -#define RTL8188E_SUPPORT 0 -#define RTL8812A_SUPPORT 0 -#define RTL8821A_SUPPORT 0 -#define RTL8723B_SUPPORT 0 -#define RTL8723D_SUPPORT 0 -#define RTL8192E_SUPPORT 0 -#define RTL8192F_SUPPORT 0 -#define RTL8814A_SUPPORT 0 -#define RTL8195A_SUPPORT 0 -#define RTL8197F_SUPPORT 0 -#define RTL8703B_SUPPORT 0 -#define RTL8188F_SUPPORT 0 -#define RTL8822B_SUPPORT 0 -#define RTL8821B_SUPPORT 0 -#define RTL8821C_SUPPORT 0 -#define RTL8710B_SUPPORT 0 -#define RTL8814B_SUPPORT 0 -#define RTL8824B_SUPPORT 0 -#define RTL8198F_SUPPORT 0 -#define RTL8195B_SUPPORT 0 -#define RTL8822C_SUPPORT 0 -#define RTL8812F_SUPPORT 0 -#define RTL8197G_SUPPORT 0 -#define RTL8721D_SUPPORT 0 - -/*#if (RTL8188E_SUPPORT==1)*/ -#define RATE_ADAPTIVE_SUPPORT 0 -#define POWER_TRAINING_ACTIVE 0 - -#ifdef CONFIG_MULTIDRV -#endif - -#ifdef CONFIG_RTL8188E - #undef RTL8188E_SUPPORT - #undef RATE_ADAPTIVE_SUPPORT - #undef POWER_TRAINING_ACTIVE - - #define RTL8188E_SUPPORT 1 - #define RATE_ADAPTIVE_SUPPORT 1 - #define POWER_TRAINING_ACTIVE 1 -#endif - -#ifdef CONFIG_RTL8812A - #undef RTL8812A_SUPPORT - #define RTL8812A_SUPPORT 1 - #ifndef CONFIG_FW_C2H_PKT - #define CONFIG_FW_C2H_PKT - #endif - #define CONFIG_RTS_FULL_BW -#endif - -#ifdef CONFIG_RTL8821A - #undef RTL8821A_SUPPORT - #define RTL8821A_SUPPORT 1 - #ifndef CONFIG_FW_C2H_PKT - #define CONFIG_FW_C2H_PKT - #endif - #define CONFIG_RTS_FULL_BW -#endif - -#ifdef CONFIG_RTL8192E - #undef RTL8192E_SUPPORT - #define RTL8192E_SUPPORT 1 - #ifndef CONFIG_FW_C2H_PKT - #define CONFIG_FW_C2H_PKT - #endif - #define CONFIG_RTS_FULL_BW -#endif - -#ifdef CONFIG_RTL8192F - #undef RTL8192F_SUPPORT - #define RTL8192F_SUPPORT 1 - #ifndef CONFIG_FW_C2H_PKT - #define CONFIG_FW_C2H_PKT - #endif - #ifndef CONFIG_RTW_MAC_HIDDEN_RPT - #define CONFIG_RTW_MAC_HIDDEN_RPT - #endif - /*#define CONFIG_AMPDU_PRETX_CD*/ - /*#define DBG_LA_MODE*/ - #ifdef CONFIG_P2P_PS - #define CONFIG_P2P_PS_NOA_USE_MACID_SLEEP - #endif - #define CONFIG_RTS_FULL_BW -#endif - -#ifdef CONFIG_RTL8723B - #undef RTL8723B_SUPPORT - #define RTL8723B_SUPPORT 1 - #ifndef CONFIG_FW_C2H_PKT - #define CONFIG_FW_C2H_PKT - #endif - #define CONFIG_RTS_FULL_BW -#endif - -#ifdef CONFIG_RTL8723D - #undef RTL8723D_SUPPORT - #define RTL8723D_SUPPORT 1 - #ifndef CONFIG_FW_C2H_PKT - #define CONFIG_FW_C2H_PKT - #endif - #ifndef CONFIG_RTW_MAC_HIDDEN_RPT - #define CONFIG_RTW_MAC_HIDDEN_RPT - #endif - #ifndef CONFIG_RTW_CUSTOMER_STR - #define CONFIG_RTW_CUSTOMER_STR - #endif - #define CONFIG_RTS_FULL_BW -#endif - -#ifdef CONFIG_RTL8814A - #undef RTL8814A_SUPPORT - #define RTL8814A_SUPPORT 1 - #ifndef CONFIG_FW_C2H_PKT - #define CONFIG_FW_C2H_PKT - #endif - #define CONFIG_FW_CORRECT_BCN - #define CONFIG_RTS_FULL_BW -#endif - -#ifdef CONFIG_RTL8703B - #undef RTL8703B_SUPPORT - #define RTL8703B_SUPPORT 1 - #ifndef CONFIG_FW_C2H_PKT - #define CONFIG_FW_C2H_PKT - #endif - #ifndef CONFIG_RTW_MAC_HIDDEN_RPT - #define CONFIG_RTW_MAC_HIDDEN_RPT - #endif - #define CONFIG_RTS_FULL_BW -#endif - -#ifdef CONFIG_RTL8188F - #undef RTL8188F_SUPPORT - #define RTL8188F_SUPPORT 1 - #ifndef CONFIG_FW_C2H_PKT - #define CONFIG_FW_C2H_PKT - #endif - #ifndef CONFIG_RTW_MAC_HIDDEN_RPT - #define CONFIG_RTW_MAC_HIDDEN_RPT - #endif - #ifndef CONFIG_RTW_CUSTOMER_STR - #define CONFIG_RTW_CUSTOMER_STR - #endif - #define CONFIG_RTS_FULL_BW -#endif - -#ifdef CONFIG_RTL8188GTV - #undef RTL8188F_SUPPORT - #define RTL8188F_SUPPORT 1 - #ifndef CONFIG_FW_C2H_PKT - #define CONFIG_FW_C2H_PKT - #endif - #ifndef CONFIG_RTW_MAC_HIDDEN_RPT - #define CONFIG_RTW_MAC_HIDDEN_RPT - #endif - #ifndef CONFIG_RTW_CUSTOMER_STR - #define CONFIG_RTW_CUSTOMER_STR - #endif - #define CONFIG_RTS_FULL_BW -#endif - -#ifdef CONFIG_RTL8822B - #undef RTL8822B_SUPPORT - #define RTL8822B_SUPPORT 1 - #ifndef CONFIG_FW_C2H_PKT - #define CONFIG_FW_C2H_PKT - #endif /* CONFIG_FW_C2H_PKT */ - #define RTW_TX_PA_BIAS /* Adjust TX PA Bias from eFuse */ - #define CONFIG_DFS /* Enable 5G band 2&3 channel */ - #define RTW_AMPDU_AGG_RETRY_AND_NEW - - #ifdef CONFIG_WOWLAN - #define CONFIG_GTK_OL - /*#define CONFIG_ARP_KEEP_ALIVE*/ - - #ifdef CONFIG_GPIO_WAKEUP - #ifndef WAKEUP_GPIO_IDX - #define WAKEUP_GPIO_IDX 6 /* WIFI Chip Side */ - #endif /* !WAKEUP_GPIO_IDX */ - #endif /* CONFIG_GPIO_WAKEUP */ - #endif /* CONFIG_WOWLAN */ - - #ifdef CONFIG_CONCURRENT_MODE - #define CONFIG_AP_PORT_SWAP - #define CONFIG_FW_MULTI_PORT_SUPPORT - #endif /* CONFIG_CONCURRENT_MODE */ - - /* - * Beamforming related definition - */ - /* Beamforming mechanism is on driver not phydm, always disable it */ - #define BEAMFORMING_SUPPORT 0 - /* Only support new beamforming mechanism */ - #ifdef CONFIG_BEAMFORMING - #define RTW_BEAMFORMING_VERSION_2 - #endif /* CONFIG_BEAMFORMING */ - - #ifndef CONFIG_RTW_MAC_HIDDEN_RPT - #define CONFIG_RTW_MAC_HIDDEN_RPT - #endif /* CONFIG_RTW_MAC_HIDDEN_RPT */ - - #ifndef DBG_RX_DFRAME_RAW_DATA - #define DBG_RX_DFRAME_RAW_DATA - #endif /* DBG_RX_DFRAME_RAW_DATA */ - - #ifndef RTW_IQK_FW_OFFLOAD - #define RTW_IQK_FW_OFFLOAD - #endif /* RTW_IQK_FW_OFFLOAD */ - - /* Checksum offload feature */ - /*#define CONFIG_TCP_CSUM_OFFLOAD_TX*/ /* not ready */ - #define CONFIG_TCP_CSUM_OFFLOAD_RX - - #define CONFIG_ADVANCE_OTA - - #ifdef CONFIG_MCC_MODE - #define CONFIG_MCC_MODE_V2 - #endif /* CONFIG_MCC_MODE */ - - #if defined(CONFIG_TDLS) && defined(CONFIG_TDLS_CH_SW) - #define CONFIG_TDLS_CH_SW_V2 - #endif - - #ifndef RTW_CHANNEL_SWITCH_OFFLOAD - #ifdef CONFIG_TDLS_CH_SW_V2 - #define RTW_CHANNEL_SWITCH_OFFLOAD - #endif - #endif /* RTW_CHANNEL_SWITCH_OFFLOAD */ - - #if defined(CONFIG_RTW_MESH) && !defined(RTW_PER_CMD_SUPPORT_FW) - /* Supported since fw v22.1 */ - #define RTW_PER_CMD_SUPPORT_FW - #endif /* RTW_PER_CMD_SUPPORT_FW */ - #define CONFIG_SUPPORT_FIFO_DUMP - #define CONFIG_HW_P0_TSF_SYNC - #define CONFIG_BCN_RECV_TIME - #ifdef CONFIG_P2P_PS - #define CONFIG_P2P_PS_NOA_USE_MACID_SLEEP - #endif - #define CONFIG_RTS_FULL_BW -#endif /* CONFIG_RTL8822B */ - -#ifdef CONFIG_RTL8821C - #undef RTL8821C_SUPPORT - #define RTL8821C_SUPPORT 1 - #ifndef CONFIG_FW_C2H_PKT - #define CONFIG_FW_C2H_PKT - #endif - #ifdef CONFIG_NO_FW - #ifdef CONFIG_RTW_MAC_HIDDEN_RPT - #undef CONFIG_RTW_MAC_HIDDEN_RPT - #endif - #else - #ifndef CONFIG_RTW_MAC_HIDDEN_RPT - #define CONFIG_RTW_MAC_HIDDEN_RPT - #endif - #endif - #define LOAD_FW_HEADER_FROM_DRIVER - #define CONFIG_PHY_CAPABILITY_QUERY - #ifdef CONFIG_CONCURRENT_MODE - #define CONFIG_AP_PORT_SWAP - #define CONFIG_FW_MULTI_PORT_SUPPORT - #endif - #define CONFIG_SUPPORT_FIFO_DUMP - #ifndef RTW_IQK_FW_OFFLOAD - #define RTW_IQK_FW_OFFLOAD - #endif /* RTW_IQK_FW_OFFLOAD */ - /*#define CONFIG_AMPDU_PRETX_CD*/ - /*#define DBG_PRE_TX_HANG*/ - - /* Beamforming related definition */ - /* Beamforming mechanism is on driver not phydm, always disable it */ - #define BEAMFORMING_SUPPORT 0 - /* Only support new beamforming mechanism */ - #ifdef CONFIG_BEAMFORMING - #define RTW_BEAMFORMING_VERSION_2 - #endif /* CONFIG_BEAMFORMING */ - #define CONFIG_HW_P0_TSF_SYNC - #define CONFIG_BCN_RECV_TIME - #ifdef CONFIG_P2P_PS - #define CONFIG_P2P_PS_NOA_USE_MACID_SLEEP - #endif - #define CONFIG_RTS_FULL_BW -#endif /*CONFIG_RTL8821C*/ - -#ifdef CONFIG_RTL8710B - #undef RTL8710B_SUPPORT - #define RTL8710B_SUPPORT 1 - #ifndef CONFIG_FW_C2H_PKT - #define CONFIG_FW_C2H_PKT - #endif - #define CONFIG_RTS_FULL_BW -#endif - -#endif /*__HAL_IC_CFG_H__*/ diff --git a/drivers/net/wireless/realtek/rtl8812au/include/mp_custom_oid.h b/drivers/net/wireless/realtek/rtl8812au/include/mp_custom_oid.h deleted file mode 100644 index 8ed14413c62d5b..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/include/mp_custom_oid.h +++ /dev/null @@ -1,348 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2017 Realtek Corporation. - * - * 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 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 __CUSTOM_OID_H -#define __CUSTOM_OID_H - -/* by Owen - * 0xFF818000 - 0xFF81802F RTL8180 Mass Production Kit - * 0xFF818500 - 0xFF81850F RTL8185 Setup Utility - * 0xFF818580 - 0xFF81858F RTL8185 Phy Status Utility */ - -/* */ - -/* by Owen for Production Kit - * For Production Kit with Agilent Equipments - * in order to make our custom oids hopefully somewhat unique - * we will use 0xFF (indicating implementation specific OID) - * 81(first byte of non zero Realtek unique identifier) - * 80 (second byte of non zero Realtek unique identifier) - * XX (the custom OID number - providing 255 possible custom oids) */ - -#define OID_RT_PRO_RESET_DUT 0xFF818000 -#define OID_RT_PRO_SET_DATA_RATE 0xFF818001 -#define OID_RT_PRO_START_TEST 0xFF818002 -#define OID_RT_PRO_STOP_TEST 0xFF818003 -#define OID_RT_PRO_SET_PREAMBLE 0xFF818004 -#define OID_RT_PRO_SET_SCRAMBLER 0xFF818005 -#define OID_RT_PRO_SET_FILTER_BB 0xFF818006 -#define OID_RT_PRO_SET_MANUAL_DIVERSITY_BB 0xFF818007 -#define OID_RT_PRO_SET_CHANNEL_DIRECT_CALL 0xFF818008 -#define OID_RT_PRO_SET_SLEEP_MODE_DIRECT_CALL 0xFF818009 -#define OID_RT_PRO_SET_WAKE_MODE_DIRECT_CALL 0xFF81800A - -#define OID_RT_PRO_SET_TX_ANTENNA_BB 0xFF81800D -#define OID_RT_PRO_SET_ANTENNA_BB 0xFF81800E -#define OID_RT_PRO_SET_CR_SCRAMBLER 0xFF81800F -#define OID_RT_PRO_SET_CR_NEW_FILTER 0xFF818010 -#define OID_RT_PRO_SET_TX_POWER_CONTROL 0xFF818011 -#define OID_RT_PRO_SET_CR_TX_CONFIG 0xFF818012 -#define OID_RT_PRO_GET_TX_POWER_CONTROL 0xFF818013 -#define OID_RT_PRO_GET_CR_SIGNAL_QUALITY 0xFF818014 -#define OID_RT_PRO_SET_CR_SETPOINT 0xFF818015 -#define OID_RT_PRO_SET_INTEGRATOR 0xFF818016 -#define OID_RT_PRO_SET_SIGNAL_QUALITY 0xFF818017 -#define OID_RT_PRO_GET_INTEGRATOR 0xFF818018 -#define OID_RT_PRO_GET_SIGNAL_QUALITY 0xFF818019 -#define OID_RT_PRO_QUERY_EEPROM_TYPE 0xFF81801A -#define OID_RT_PRO_WRITE_MAC_ADDRESS 0xFF81801B -#define OID_RT_PRO_READ_MAC_ADDRESS 0xFF81801C -#define OID_RT_PRO_WRITE_CIS_DATA 0xFF81801D -#define OID_RT_PRO_READ_CIS_DATA 0xFF81801E -#define OID_RT_PRO_WRITE_POWER_CONTROL 0xFF81801F -#define OID_RT_PRO_READ_POWER_CONTROL 0xFF818020 -#define OID_RT_PRO_WRITE_EEPROM 0xFF818021 -#define OID_RT_PRO_READ_EEPROM 0xFF818022 -#define OID_RT_PRO_RESET_TX_PACKET_SENT 0xFF818023 -#define OID_RT_PRO_QUERY_TX_PACKET_SENT 0xFF818024 -#define OID_RT_PRO_RESET_RX_PACKET_RECEIVED 0xFF818025 -#define OID_RT_PRO_QUERY_RX_PACKET_RECEIVED 0xFF818026 -#define OID_RT_PRO_QUERY_RX_PACKET_CRC32_ERROR 0xFF818027 -#define OID_RT_PRO_QUERY_CURRENT_ADDRESS 0xFF818028 -#define OID_RT_PRO_QUERY_PERMANENT_ADDRESS 0xFF818029 -#define OID_RT_PRO_SET_PHILIPS_RF_PARAMETERS 0xFF81802A -#define OID_RT_PRO_RECEIVE_PACKET 0xFF81802C -/* added by Owen on 04/08/03 for Cameo's request */ -#define OID_RT_PRO_WRITE_EEPROM_BYTE 0xFF81802D -#define OID_RT_PRO_READ_EEPROM_BYTE 0xFF81802E -#define OID_RT_PRO_SET_MODULATION 0xFF81802F -/* */ - -/* Sean */ -#define OID_RT_DRIVER_OPTION 0xFF818080 -#define OID_RT_RF_OFF 0xFF818081 -#define OID_RT_AUTH_STATUS 0xFF818082 - -/* ************************************************************************ */ -#define OID_RT_PRO_SET_CONTINUOUS_TX 0xFF81800B -#define OID_RT_PRO_SET_SINGLE_CARRIER_TX 0xFF81800C -#define OID_RT_PRO_SET_CARRIER_SUPPRESSION_TX 0xFF81802B -#define OID_RT_PRO_SET_SINGLE_TONE_TX 0xFF818043 -/* ************************************************************************ */ - - -/* by Owen for RTL8185 Phy Status Report Utility */ -#define OID_RT_UTILITY_FALSE_ALARM_COUNTERS 0xFF818580 -#define OID_RT_UTILITY_SELECT_DEBUG_MODE 0xFF818581 -#define OID_RT_UTILITY_SELECT_SUBCARRIER_NUMBER 0xFF818582 -#define OID_RT_UTILITY_GET_RSSI_STATUS 0xFF818583 -#define OID_RT_UTILITY_GET_FRAME_DETECTION_STATUS 0xFF818584 -#define OID_RT_UTILITY_GET_AGC_AND_FREQUENCY_OFFSET_ESTIMATION_STATUS 0xFF818585 -#define OID_RT_UTILITY_GET_CHANNEL_ESTIMATION_STATUS 0xFF818586 -/* */ - -/* by Owen on 03/09/19-03/09/22 for RTL8185 */ -#define OID_RT_WIRELESS_MODE 0xFF818500 -#define OID_RT_SUPPORTED_RATES 0xFF818501 -#define OID_RT_DESIRED_RATES 0xFF818502 -#define OID_RT_WIRELESS_MODE_STARTING_ADHOC 0xFF818503 -/* */ - -#define OID_RT_GET_CONNECT_STATE 0xFF030001 -#define OID_RT_RESCAN 0xFF030002 -#define OID_RT_SET_KEY_LENGTH 0xFF030003 -#define OID_RT_SET_DEFAULT_KEY_ID 0xFF030004 - -#define OID_RT_SET_CHANNEL 0xFF010182 -#define OID_RT_SET_SNIFFER_MODE 0xFF010183 -#define OID_RT_GET_SIGNAL_QUALITY 0xFF010184 -#define OID_RT_GET_SMALL_PACKET_CRC 0xFF010185 -#define OID_RT_GET_MIDDLE_PACKET_CRC 0xFF010186 -#define OID_RT_GET_LARGE_PACKET_CRC 0xFF010187 -#define OID_RT_GET_TX_RETRY 0xFF010188 -#define OID_RT_GET_RX_RETRY 0xFF010189 -#define OID_RT_PRO_SET_FW_DIG_STATE 0xFF01018A/* S */ -#define OID_RT_PRO_SET_FW_RA_STATE 0xFF01018B/* S */ - -#define OID_RT_GET_RX_TOTAL_PACKET 0xFF010190 -#define OID_RT_GET_TX_BEACON_OK 0xFF010191 -#define OID_RT_GET_TX_BEACON_ERR 0xFF010192 -#define OID_RT_GET_RX_ICV_ERR 0xFF010193 -#define OID_RT_SET_ENCRYPTION_ALGORITHM 0xFF010194 -#define OID_RT_SET_NO_AUTO_RESCAN 0xFF010195 -#define OID_RT_GET_PREAMBLE_MODE 0xFF010196 -#define OID_RT_GET_DRIVER_UP_DELTA_TIME 0xFF010197 -#define OID_RT_GET_AP_IP 0xFF010198 -#define OID_RT_GET_CHANNELPLAN 0xFF010199 -#define OID_RT_SET_PREAMBLE_MODE 0xFF01019A -#define OID_RT_SET_BCN_INTVL 0xFF01019B -#define OID_RT_GET_RF_VENDER 0xFF01019C -#define OID_RT_DEDICATE_PROBE 0xFF01019D -#define OID_RT_PRO_RX_FILTER_PATTERN 0xFF01019E - -#define OID_RT_GET_DCST_CURRENT_THRESHOLD 0xFF01019F - -#define OID_RT_GET_CCA_ERR 0xFF0101A0 -#define OID_RT_GET_CCA_UPGRADE_THRESHOLD 0xFF0101A1 -#define OID_RT_GET_CCA_FALLBACK_THRESHOLD 0xFF0101A2 - -#define OID_RT_GET_CCA_UPGRADE_EVALUATE_TIMES 0xFF0101A3 -#define OID_RT_GET_CCA_FALLBACK_EVALUATE_TIMES 0xFF0101A4 - -/* by Owen on 03/31/03 for Cameo's request */ -#define OID_RT_SET_RATE_ADAPTIVE 0xFF0101A5 -/* */ -#define OID_RT_GET_DCST_EVALUATE_PERIOD 0xFF0101A5 -#define OID_RT_GET_DCST_TIME_UNIT_INDEX 0xFF0101A6 -#define OID_RT_GET_TOTAL_TX_BYTES 0xFF0101A7 -#define OID_RT_GET_TOTAL_RX_BYTES 0xFF0101A8 -#define OID_RT_CURRENT_TX_POWER_LEVEL 0xFF0101A9 -#define OID_RT_GET_ENC_KEY_MISMATCH_COUNT 0xFF0101AA -#define OID_RT_GET_ENC_KEY_MATCH_COUNT 0xFF0101AB -#define OID_RT_GET_CHANNEL 0xFF0101AC - -#define OID_RT_SET_CHANNELPLAN 0xFF0101AD -#define OID_RT_GET_HARDWARE_RADIO_OFF 0xFF0101AE -#define OID_RT_CHANNELPLAN_BY_COUNTRY 0xFF0101AF -#define OID_RT_SCAN_AVAILABLE_BSSID 0xFF0101B0 -#define OID_RT_GET_HARDWARE_VERSION 0xFF0101B1 -#define OID_RT_GET_IS_ROAMING 0xFF0101B2 -#define OID_RT_GET_IS_PRIVACY 0xFF0101B3 -#define OID_RT_GET_KEY_MISMATCH 0xFF0101B4 -#define OID_RT_SET_RSSI_ROAM_TRAFFIC_TH 0xFF0101B5 -#define OID_RT_SET_RSSI_ROAM_SIGNAL_TH 0xFF0101B6 -#define OID_RT_RESET_LOG 0xFF0101B7 -#define OID_RT_GET_LOG 0xFF0101B8 -#define OID_RT_SET_INDICATE_HIDDEN_AP 0xFF0101B9 -#define OID_RT_GET_HEADER_FAIL 0xFF0101BA -#define OID_RT_SUPPORTED_WIRELESS_MODE 0xFF0101BB -#define OID_RT_GET_CHANNEL_LIST 0xFF0101BC -#define OID_RT_GET_SCAN_IN_PROGRESS 0xFF0101BD -#define OID_RT_GET_TX_INFO 0xFF0101BE -#define OID_RT_RF_READ_WRITE_OFFSET 0xFF0101BF -#define OID_RT_RF_READ_WRITE 0xFF0101C0 - -/* For Netgear request. 2005.01.13, by rcnjko. */ -#define OID_RT_FORCED_DATA_RATE 0xFF0101C1 -#define OID_RT_WIRELESS_MODE_FOR_SCAN_LIST 0xFF0101C2 -/* For Netgear request. 2005.02.17, by rcnjko. */ -#define OID_RT_GET_BSS_WIRELESS_MODE 0xFF0101C3 -/* For AZ project. 2005.06.27, by rcnjko. */ -#define OID_RT_SCAN_WITH_MAGIC_PACKET 0xFF0101C4 - -/* Vincent 8185MP */ -#define OID_RT_PRO_RX_FILTER 0xFF0111C0 - -/* Andy TEST - * #define OID_RT_PRO_WRITE_REGISTRY 0xFF0111C1 - * #define OID_RT_PRO_READ_REGISTRY 0xFF0111C2 */ -#define OID_CE_USB_WRITE_REGISTRY 0xFF0111C1 -#define OID_CE_USB_READ_REGISTRY 0xFF0111C2 - - -#define OID_RT_PRO_SET_INITIAL_GAIN 0xFF0111C3 -#define OID_RT_PRO_SET_BB_RF_STANDBY_MODE 0xFF0111C4 -#define OID_RT_PRO_SET_BB_RF_SHUTDOWN_MODE 0xFF0111C5 -#define OID_RT_PRO_SET_TX_CHARGE_PUMP 0xFF0111C6 -#define OID_RT_PRO_SET_RX_CHARGE_PUMP 0xFF0111C7 -#define OID_RT_PRO_RF_WRITE_REGISTRY 0xFF0111C8 -#define OID_RT_PRO_RF_READ_REGISTRY 0xFF0111C9 -#define OID_RT_PRO_QUERY_RF_TYPE 0xFF0111CA - -/* AP OID */ -#define OID_RT_AP_GET_ASSOCIATED_STATION_LIST 0xFF010300 -#define OID_RT_AP_GET_CURRENT_TIME_STAMP 0xFF010301 -#define OID_RT_AP_SWITCH_INTO_AP_MODE 0xFF010302 -#define OID_RT_AP_SET_DTIM_PERIOD 0xFF010303 -#define OID_RT_AP_SUPPORTED 0xFF010304 /* Determine if driver supports AP mode. 2004.08.27, by rcnjko. */ -#define OID_RT_AP_SET_PASSPHRASE 0xFF010305 /* Set WPA-PSK passphrase into authenticator. 2005.07.08, byrcnjko. */ - -/* 8187MP. 2004.09.06, by rcnjko. */ -#define OID_RT_PRO8187_WI_POLL 0xFF818780 -#define OID_RT_PRO_WRITE_BB_REG 0xFF818781 -#define OID_RT_PRO_READ_BB_REG 0xFF818782 -#define OID_RT_PRO_WRITE_RF_REG 0xFF818783 -#define OID_RT_PRO_READ_RF_REG 0xFF818784 - -/* Meeting House. added by Annie, 2005-07-20. */ -#define OID_RT_MH_VENDER_ID 0xFFEDC100 - -/* 8711 MP OID added 20051230. */ -#define OID_RT_PRO8711_JOIN_BSS 0xFF871100/* S */ - -#define OID_RT_PRO_READ_REGISTER 0xFF871101 /* Q */ -#define OID_RT_PRO_WRITE_REGISTER 0xFF871102 /* S */ - -#define OID_RT_PRO_BURST_READ_REGISTER 0xFF871103 /* Q */ -#define OID_RT_PRO_BURST_WRITE_REGISTER 0xFF871104 /* S */ - -#define OID_RT_PRO_WRITE_TXCMD 0xFF871105 /* S */ - -#define OID_RT_PRO_READ16_EEPROM 0xFF871106 /* Q */ -#define OID_RT_PRO_WRITE16_EEPROM 0xFF871107 /* S */ - -#define OID_RT_PRO_H2C_SET_COMMAND 0xFF871108 /* S */ -#define OID_RT_PRO_H2C_QUERY_RESULT 0xFF871109 /* Q */ - -#define OID_RT_PRO8711_WI_POLL 0xFF87110A /* Q */ -#define OID_RT_PRO8711_PKT_LOSS 0xFF87110B /* Q */ -#define OID_RT_RD_ATTRIB_MEM 0xFF87110C/* Q */ -#define OID_RT_WR_ATTRIB_MEM 0xFF87110D/* S */ - - -/* Method 2 for H2C/C2H */ -#define OID_RT_PRO_H2C_CMD_MODE 0xFF871110 /* S */ -#define OID_RT_PRO_H2C_CMD_RSP_MODE 0xFF871111 /* Q */ -#define OID_RT_PRO_H2C_CMD_EVENT_MODE 0xFF871112 /* S */ -#define OID_RT_PRO_WAIT_C2H_EVENT 0xFF871113 /* Q */ -#define OID_RT_PRO_RW_ACCESS_PROTOCOL_TEST 0xFF871114/* Q */ - -#define OID_RT_PRO_SCSI_ACCESS_TEST 0xFF871115 /* Q, S */ - -#define OID_RT_PRO_SCSI_TCPIPOFFLOAD_OUT 0xFF871116 /* S */ -#define OID_RT_PRO_SCSI_TCPIPOFFLOAD_IN 0xFF871117 /* Q, S */ -#define OID_RT_RRO_RX_PKT_VIA_IOCTRL 0xFF871118 /* Q */ -#define OID_RT_RRO_RX_PKTARRAY_VIA_IOCTRL 0xFF871119 /* Q */ - -#define OID_RT_RPO_SET_PWRMGT_TEST 0xFF87111A /* S */ -#define OID_RT_PRO_QRY_PWRMGT_TEST 0XFF87111B /* Q */ -#define OID_RT_RPO_ASYNC_RWIO_TEST 0xFF87111C /* S */ -#define OID_RT_RPO_ASYNC_RWIO_POLL 0xFF87111D /* Q */ -#define OID_RT_PRO_SET_RF_INTFS 0xFF87111E /* S */ -#define OID_RT_POLL_RX_STATUS 0xFF87111F /* Q */ - -#define OID_RT_PRO_CFG_DEBUG_MESSAGE 0xFF871120 /* Q, S */ -#define OID_RT_PRO_SET_DATA_RATE_EX 0xFF871121/* S */ -#define OID_RT_PRO_SET_BASIC_RATE 0xFF871122/* S */ -#define OID_RT_PRO_READ_TSSI 0xFF871123/* S */ -#define OID_RT_PRO_SET_POWER_TRACKING 0xFF871124/* S */ - - -#define OID_RT_PRO_QRY_PWRSTATE 0xFF871150 /* Q */ -#define OID_RT_PRO_SET_PWRSTATE 0xFF871151 /* S */ - -/* Method 2 , using workitem */ -#define OID_RT_SET_READ_REG 0xFF871181 /* S */ -#define OID_RT_SET_WRITE_REG 0xFF871182 /* S */ -#define OID_RT_SET_BURST_READ_REG 0xFF871183 /* S */ -#define OID_RT_SET_BURST_WRITE_REG 0xFF871184 /* S */ -#define OID_RT_SET_WRITE_TXCMD 0xFF871185 /* S */ -#define OID_RT_SET_READ16_EEPROM 0xFF871186 /* S */ -#define OID_RT_SET_WRITE16_EEPROM 0xFF871187 /* S */ -#define OID_RT_QRY_POLL_WKITEM 0xFF871188 /* Q */ - -/* For SDIO INTERFACE only */ -#define OID_RT_PRO_SYNCPAGERW_SRAM 0xFF8711A0 /* Q, S */ -#define OID_RT_PRO_871X_DRV_EXT 0xFF8711A1 - -/* For USB INTERFACE only */ -#define OID_RT_PRO_USB_VENDOR_REQ 0xFF8711B0 /* Q, S */ -#define OID_RT_PRO_SCSI_AUTO_TEST 0xFF8711B1 /* S */ -#define OID_RT_PRO_USB_MAC_AC_FIFO_WRITE 0xFF8711B2 /* S */ -#define OID_RT_PRO_USB_MAC_RX_FIFO_READ 0xFF8711B3 /* Q */ -#define OID_RT_PRO_USB_MAC_RX_FIFO_POLLING 0xFF8711B4 /* Q */ - -#define OID_RT_PRO_H2C_SET_RATE_TABLE 0xFF8711FB /* S */ -#define OID_RT_PRO_H2C_GET_RATE_TABLE 0xFF8711FC /* S */ -#define OID_RT_PRO_H2C_C2H_LBK_TEST 0xFF8711FE - -#define OID_RT_PRO_ENCRYPTION_CTRL 0xFF871200 /* Q, S */ -#define OID_RT_PRO_ADD_STA_INFO 0xFF871201 /* S */ -#define OID_RT_PRO_DELE_STA_INFO 0xFF871202 /* S */ -#define OID_RT_PRO_QUERY_DR_VARIABLE 0xFF871203 /* Q */ - -#define OID_RT_PRO_RX_PACKET_TYPE 0xFF871204 /* Q, S */ - -#define OID_RT_PRO_READ_EFUSE 0xFF871205 /* Q */ -#define OID_RT_PRO_WRITE_EFUSE 0xFF871206 /* S */ -#define OID_RT_PRO_RW_EFUSE_PGPKT 0xFF871207 /* Q, S */ -#define OID_RT_GET_EFUSE_CURRENT_SIZE 0xFF871208 /* Q */ - -#define OID_RT_SET_BANDWIDTH 0xFF871209 /* S */ -#define OID_RT_SET_CRYSTAL_CAP 0xFF87120A /* S */ - -#define OID_RT_SET_RX_PACKET_TYPE 0xFF87120B /* S */ - -#define OID_RT_GET_EFUSE_MAX_SIZE 0xFF87120C /* Q */ - -#define OID_RT_PRO_SET_TX_AGC_OFFSET 0xFF87120D /* S */ - -#define OID_RT_PRO_SET_PKT_TEST_MODE 0xFF87120E /* S */ - -#define OID_RT_PRO_FOR_EVM_TEST_SETTING 0xFF87120F /* S */ - -#define OID_RT_PRO_GET_THERMAL_METER 0xFF871210 /* Q */ - -#define OID_RT_RESET_PHY_RX_PACKET_COUNT 0xFF871211 /* S */ -#define OID_RT_GET_PHY_RX_PACKET_RECEIVED 0xFF871212 /* Q */ -#define OID_RT_GET_PHY_RX_PACKET_CRC32_ERROR 0xFF871213 /* Q */ - -#define OID_RT_SET_POWER_DOWN 0xFF871214 /* S */ - -#define OID_RT_GET_POWER_MODE 0xFF871215 /* Q */ - -#define OID_RT_PRO_EFUSE 0xFF871216 /* Q, S */ -#define OID_RT_PRO_EFUSE_MAP 0xFF871217 /* Q, S */ - -#endif /* #ifndef __CUSTOM_OID_H */ diff --git a/drivers/net/wireless/realtek/rtl8812au/include/rtw_ioctl.h b/drivers/net/wireless/realtek/rtl8812au/include/rtw_ioctl.h deleted file mode 100644 index 9c698c5a08340f..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/include/rtw_ioctl.h +++ /dev/null @@ -1,127 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2017 Realtek Corporation. - * - * 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 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 _RTW_IOCTL_H_ -#define _RTW_IOCTL_H_ - - -#ifndef OID_802_11_CAPABILITY - #define OID_802_11_CAPABILITY 0x0d010122 -#endif - -#ifndef OID_802_11_PMKID - #define OID_802_11_PMKID 0x0d010123 -#endif - - -/* For DDK-defined OIDs */ -#define OID_NDIS_SEG1 0x00010100 -#define OID_NDIS_SEG2 0x00010200 -#define OID_NDIS_SEG3 0x00020100 -#define OID_NDIS_SEG4 0x01010100 -#define OID_NDIS_SEG5 0x01020100 -#define OID_NDIS_SEG6 0x01020200 -#define OID_NDIS_SEG7 0xFD010100 -#define OID_NDIS_SEG8 0x0D010100 -#define OID_NDIS_SEG9 0x0D010200 -#define OID_NDIS_SEG10 0x0D020200 - -#define SZ_OID_NDIS_SEG1 23 -#define SZ_OID_NDIS_SEG2 3 -#define SZ_OID_NDIS_SEG3 6 -#define SZ_OID_NDIS_SEG4 6 -#define SZ_OID_NDIS_SEG5 4 -#define SZ_OID_NDIS_SEG6 8 -#define SZ_OID_NDIS_SEG7 7 -#define SZ_OID_NDIS_SEG8 36 -#define SZ_OID_NDIS_SEG9 24 -#define SZ_OID_NDIS_SEG10 19 - -/* For Realtek-defined OIDs */ -#define OID_MP_SEG1 0xFF871100 -#define OID_MP_SEG2 0xFF818000 - -#define OID_MP_SEG3 0xFF818700 -#define OID_MP_SEG4 0xFF011100 - -enum oid_type { - QUERY_OID, - SET_OID -}; - -struct oid_funs_node { - unsigned int oid_start; /* the starting number for OID */ - unsigned int oid_end; /* the ending number for OID */ - struct oid_obj_priv *node_array; - unsigned int array_sz; /* the size of node_array */ - int query_counter; /* count the number of query hits for this segment */ - int set_counter; /* count the number of set hits for this segment */ -}; - -struct oid_par_priv { - void *adapter_context; - NDIS_OID oid; - void *information_buf; - u32 information_buf_len; - u32 *bytes_rw; - u32 *bytes_needed; - enum oid_type type_of_oid; - u32 dbg; -}; - -struct oid_obj_priv { - unsigned char dbg; /* 0: without OID debug message 1: with OID debug message */ - NDIS_STATUS(*oidfuns)(struct oid_par_priv *poid_par_priv); -}; - -#if (defined(CONFIG_MP_INCLUDED) && defined(_RTW_MP_IOCTL_C_)) || \ - (defined(_RTW_IOCTL_RTL_C_)) -static NDIS_STATUS oid_null_function(struct oid_par_priv *poid_par_priv) -{ - return NDIS_STATUS_SUCCESS; -} -#endif - -#if defined(PLATFORM_LINUX) && defined(CONFIG_WIRELESS_EXT) -extern struct iw_handler_def rtw_handlers_def; -#endif - -extern void rtw_request_wps_pbc_event(_adapter *padapter); - -extern NDIS_STATUS drv_query_info( - IN _nic_hdl MiniportAdapterContext, - IN NDIS_OID Oid, - IN void *InformationBuffer, - IN u32 InformationBufferLength, - OUT u32 *BytesWritten, - OUT u32 *BytesNeeded -); - -extern NDIS_STATUS drv_set_info( - IN _nic_hdl MiniportAdapterContext, - IN NDIS_OID Oid, - IN void *InformationBuffer, - IN u32 InformationBufferLength, - OUT u32 *BytesRead, - OUT u32 *BytesNeeded -); - -#ifdef CONFIG_APPEND_VENDOR_IE_ENABLE -extern int rtw_vendor_ie_get_raw_data(struct net_device *, u32, char *, u32); -extern int rtw_vendor_ie_get_data(struct net_device*, int , char*); -extern int rtw_vendor_ie_get(struct net_device *, struct iw_request_info *, union iwreq_data *, char *); -extern int rtw_vendor_ie_set(struct net_device*, struct iw_request_info*, union iwreq_data*, char*); -#endif - -#endif /* #ifndef __INC_CEINFO_ */ diff --git a/drivers/net/wireless/realtek/rtl8812au/include/rtw_ioctl_rtl.h b/drivers/net/wireless/realtek/rtl8812au/include/rtw_ioctl_rtl.h deleted file mode 100644 index 2df8713ad50072..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/include/rtw_ioctl_rtl.h +++ /dev/null @@ -1,75 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2017 Realtek Corporation. - * - * 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 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 _RTW_IOCTL_RTL_H_ -#define _RTW_IOCTL_RTL_H_ - - -/* ************** oid_rtl_seg_01_01 ************** */ -NDIS_STATUS oid_rt_get_signal_quality_hdl(struct oid_par_priv *poid_par_priv);/* 84 */ -NDIS_STATUS oid_rt_get_small_packet_crc_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_get_middle_packet_crc_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_get_large_packet_crc_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_get_tx_retry_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_get_rx_retry_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_get_rx_total_packet_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_get_tx_beacon_ok_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_get_tx_beacon_err_hdl(struct oid_par_priv *poid_par_priv); - -NDIS_STATUS oid_rt_pro_set_fw_dig_state_hdl(struct oid_par_priv *poid_par_priv); /* 8a */ -NDIS_STATUS oid_rt_pro_set_fw_ra_state_hdl(struct oid_par_priv *poid_par_priv); /* 8b */ - -NDIS_STATUS oid_rt_get_rx_icv_err_hdl(struct oid_par_priv *poid_par_priv);/* 93 */ -NDIS_STATUS oid_rt_set_encryption_algorithm_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_get_preamble_mode_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_get_ap_ip_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_get_channelplan_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_set_channelplan_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_set_preamble_mode_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_set_bcn_intvl_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_dedicate_probe_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_get_total_tx_bytes_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_get_total_rx_bytes_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_current_tx_power_level_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_get_enc_key_mismatch_count_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_get_enc_key_match_count_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_get_channel_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_get_hardware_radio_off_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_get_key_mismatch_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_supported_wireless_mode_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_get_channel_list_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_get_scan_in_progress_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_forced_data_rate_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_wireless_mode_for_scan_list_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_get_bss_wireless_mode_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_scan_with_magic_packet_hdl(struct oid_par_priv *poid_par_priv); - -/* ************** oid_rtl_seg_01_03 section start ************** */ -NDIS_STATUS oid_rt_ap_get_associated_station_list_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_ap_switch_into_ap_mode_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_ap_supported_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_ap_set_passphrase_hdl(struct oid_par_priv *poid_par_priv); - -/* oid_rtl_seg_01_11 */ -NDIS_STATUS oid_rt_pro_rf_write_registry_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_rf_read_registry_hdl(struct oid_par_priv *poid_par_priv); - -/* ************** oid_rtl_seg_03_00 section start ************** */ -NDIS_STATUS oid_rt_get_connect_state_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_set_default_key_id_hdl(struct oid_par_priv *poid_par_priv); - - - - -#endif diff --git a/drivers/net/wireless/realtek/rtl8812au/include/rtw_mp_ioctl.h b/drivers/net/wireless/realtek/rtl8812au/include/rtw_mp_ioctl.h deleted file mode 100644 index 2127ec1e15875d..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/include/rtw_mp_ioctl.h +++ /dev/null @@ -1,553 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2017 Realtek Corporation. - * - * 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 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 _RTW_MP_IOCTL_H_ -#define _RTW_MP_IOCTL_H_ - -#include -#include - -#if 0 -#define TESTFWCMDNUMBER 1000000 -#define TEST_H2CINT_WAIT_TIME 500 -#define TEST_C2HINT_WAIT_TIME 500 -#define HCI_TEST_SYSCFG_HWMASK 1 -#define _BUSCLK_40M (4 << 2) -#endif -/* ------------------------------------------------------------------------------ */ -typedef struct CFG_DBG_MSG_STRUCT { - u32 DebugLevel; - u32 DebugComponent_H32; - u32 DebugComponent_L32; -} CFG_DBG_MSG_STRUCT, *PCFG_DBG_MSG_STRUCT; - -typedef struct _RW_REG { - u32 offset; - u32 width; - u32 value; -} mp_rw_reg, RW_Reg, *pRW_Reg; - -/* for OID_RT_PRO_READ16_EEPROM & OID_RT_PRO_WRITE16_EEPROM */ -typedef struct _EEPROM_RW_PARAM { - u32 offset; - u16 value; -} eeprom_rw_param, EEPROM_RWParam, *pEEPROM_RWParam; - -typedef struct _EFUSE_ACCESS_STRUCT_ { - u16 start_addr; - u16 cnts; - u8 data[0]; -} EFUSE_ACCESS_STRUCT, *PEFUSE_ACCESS_STRUCT; - -typedef struct _BURST_RW_REG { - u32 offset; - u32 len; - u8 Data[256]; -} burst_rw_reg, Burst_RW_Reg, *pBurst_RW_Reg; - -typedef struct _USB_VendorReq { - u8 bRequest; - u16 wValue; - u16 wIndex; - u16 wLength; - u8 u8Dir;/* 0:OUT, 1:IN */ - u8 u8InData; -} usb_vendor_req, USB_VendorReq, *pUSB_VendorReq; - -typedef struct _DR_VARIABLE_STRUCT_ { - u8 offset; - u32 variable; -} DR_VARIABLE_STRUCT; - -/* int mp_start_joinbss(_adapter *padapter, NDIS_802_11_SSID *pssid); */ - -/* void _irqlevel_changed_(_irqL *irqlevel, BOOLEANunsigned char bLower); */ -#define _irqlevel_changed_(a, b) - -/* oid_rtl_seg_81_80_00 */ -NDIS_STATUS oid_rt_pro_set_data_rate_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_start_test_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_stop_test_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_set_channel_direct_call_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_set_antenna_bb_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_set_tx_power_control_hdl(struct oid_par_priv *poid_par_priv); -/* oid_rtl_seg_81_80_20 */ -NDIS_STATUS oid_rt_pro_query_tx_packet_sent_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_query_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_query_rx_packet_crc32_error_hdl(struct oid_par_priv *poid_par_priv); - -NDIS_STATUS oid_rt_pro_reset_tx_packet_sent_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_reset_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_set_modulation_hdl(struct oid_par_priv *poid_par_priv); - -NDIS_STATUS oid_rt_pro_set_continuous_tx_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_set_single_carrier_tx_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_set_carrier_suppression_tx_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_set_single_tone_tx_hdl(struct oid_par_priv *poid_par_priv); - - -/* oid_rtl_seg_81_87 */ -NDIS_STATUS oid_rt_pro_write_bb_reg_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_read_bb_reg_hdl(struct oid_par_priv *poid_par_priv); - -NDIS_STATUS oid_rt_pro_write_rf_reg_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_read_rf_reg_hdl(struct oid_par_priv *poid_par_priv); - - -/* oid_rtl_seg_81_85 */ -NDIS_STATUS oid_rt_wireless_mode_hdl(struct oid_par_priv *poid_par_priv); - - -/* oid_rtl_seg_87_11_00 */ -NDIS_STATUS oid_rt_pro8711_join_bss_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_read_register_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_write_register_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_burst_read_register_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_burst_write_register_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_write_txcmd_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_read16_eeprom_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_write16_eeprom_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro8711_wi_poll_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro8711_pkt_loss_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_rd_attrib_mem_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_wr_attrib_mem_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_set_rf_intfs_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_poll_rx_status_hdl(struct oid_par_priv *poid_par_priv); -/* oid_rtl_seg_87_11_20 */ -NDIS_STATUS oid_rt_pro_cfg_debug_message_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_set_data_rate_ex_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_set_basic_rate_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_read_tssi_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_set_power_tracking_hdl(struct oid_par_priv *poid_par_priv); -/* oid_rtl_seg_87_11_50 */ -NDIS_STATUS oid_rt_pro_qry_pwrstate_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_set_pwrstate_hdl(struct oid_par_priv *poid_par_priv); -/* oid_rtl_seg_87_11_F0 */ -NDIS_STATUS oid_rt_pro_h2c_set_rate_table_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_h2c_get_rate_table_hdl(struct oid_par_priv *poid_par_priv); - - -/* oid_rtl_seg_87_12_00 */ -NDIS_STATUS oid_rt_pro_encryption_ctrl_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_add_sta_info_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_dele_sta_info_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_query_dr_variable_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_rx_packet_type_hdl(struct oid_par_priv *poid_par_priv); - -NDIS_STATUS oid_rt_pro_read_efuse_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_write_efuse_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_rw_efuse_pgpkt_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_get_efuse_current_size_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_efuse_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_efuse_map_hdl(struct oid_par_priv *poid_par_priv); - -NDIS_STATUS oid_rt_set_bandwidth_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_set_crystal_cap_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_set_rx_packet_type_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_get_efuse_max_size_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_pro_set_tx_agc_offset_hdl(struct oid_par_priv *poid_par_priv); - -NDIS_STATUS oid_rt_pro_set_pkt_test_mode_hdl(struct oid_par_priv *poid_par_priv); - -NDIS_STATUS oid_rt_get_thermal_meter_hdl(struct oid_par_priv *poid_par_priv); - -NDIS_STATUS oid_rt_reset_phy_rx_packet_count_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_get_phy_rx_packet_received_hdl(struct oid_par_priv *poid_par_priv); -NDIS_STATUS oid_rt_get_phy_rx_packet_crc32_error_hdl(struct oid_par_priv *poid_par_priv); - -NDIS_STATUS oid_rt_set_power_down_hdl(struct oid_par_priv *poid_par_priv); - -NDIS_STATUS oid_rt_get_power_mode_hdl(struct oid_par_priv *poid_par_priv); - -NDIS_STATUS oid_rt_pro_trigger_gpio_hdl(struct oid_par_priv *poid_par_priv); - -#ifdef _RTW_MP_IOCTL_C_ - -const struct oid_obj_priv oid_rtl_seg_81_80_00[] = { - {1, &oid_null_function}, /* 0x00 OID_RT_PRO_RESET_DUT */ - {1, &oid_rt_pro_set_data_rate_hdl}, /* 0x01 */ - {1, &oid_rt_pro_start_test_hdl}, /* 0x02 */ - {1, &oid_rt_pro_stop_test_hdl}, /* 0x03 */ - {1, &oid_null_function}, /* 0x04 OID_RT_PRO_SET_PREAMBLE */ - {1, &oid_null_function}, /* 0x05 OID_RT_PRO_SET_SCRAMBLER */ - {1, &oid_null_function}, /* 0x06 OID_RT_PRO_SET_FILTER_BB */ - {1, &oid_null_function}, /* 0x07 OID_RT_PRO_SET_MANUAL_DIVERSITY_BB */ - {1, &oid_rt_pro_set_channel_direct_call_hdl}, /* 0x08 */ - {1, &oid_null_function}, /* 0x09 OID_RT_PRO_SET_SLEEP_MODE_DIRECT_CALL */ - {1, &oid_null_function}, /* 0x0A OID_RT_PRO_SET_WAKE_MODE_DIRECT_CALL */ - {1, &oid_rt_pro_set_continuous_tx_hdl}, /* 0x0B OID_RT_PRO_SET_TX_CONTINUOUS_DIRECT_CALL */ - {1, &oid_rt_pro_set_single_carrier_tx_hdl}, /* 0x0C OID_RT_PRO_SET_SINGLE_CARRIER_TX_CONTINUOUS */ - {1, &oid_null_function}, /* 0x0D OID_RT_PRO_SET_TX_ANTENNA_BB */ - {1, &oid_rt_pro_set_antenna_bb_hdl}, /* 0x0E */ - {1, &oid_null_function}, /* 0x0F OID_RT_PRO_SET_CR_SCRAMBLER */ - {1, &oid_null_function}, /* 0x10 OID_RT_PRO_SET_CR_NEW_FILTER */ - {1, &oid_rt_pro_set_tx_power_control_hdl}, /* 0x11 OID_RT_PRO_SET_TX_POWER_CONTROL */ - {1, &oid_null_function}, /* 0x12 OID_RT_PRO_SET_CR_TX_CONFIG */ - {1, &oid_null_function}, /* 0x13 OID_RT_PRO_GET_TX_POWER_CONTROL */ - {1, &oid_null_function}, /* 0x14 OID_RT_PRO_GET_CR_SIGNAL_QUALITY */ - {1, &oid_null_function}, /* 0x15 OID_RT_PRO_SET_CR_SETPOINT */ - {1, &oid_null_function}, /* 0x16 OID_RT_PRO_SET_INTEGRATOR */ - {1, &oid_null_function}, /* 0x17 OID_RT_PRO_SET_SIGNAL_QUALITY */ - {1, &oid_null_function}, /* 0x18 OID_RT_PRO_GET_INTEGRATOR */ - {1, &oid_null_function}, /* 0x19 OID_RT_PRO_GET_SIGNAL_QUALITY */ - {1, &oid_null_function}, /* 0x1A OID_RT_PRO_QUERY_EEPROM_TYPE */ - {1, &oid_null_function}, /* 0x1B OID_RT_PRO_WRITE_MAC_ADDRESS */ - {1, &oid_null_function}, /* 0x1C OID_RT_PRO_READ_MAC_ADDRESS */ - {1, &oid_null_function}, /* 0x1D OID_RT_PRO_WRITE_CIS_DATA */ - {1, &oid_null_function}, /* 0x1E OID_RT_PRO_READ_CIS_DATA */ - {1, &oid_null_function} /* 0x1F OID_RT_PRO_WRITE_POWER_CONTROL */ - -}; - -const struct oid_obj_priv oid_rtl_seg_81_80_20[] = { - {1, &oid_null_function}, /* 0x20 OID_RT_PRO_READ_POWER_CONTROL */ - {1, &oid_null_function}, /* 0x21 OID_RT_PRO_WRITE_EEPROM */ - {1, &oid_null_function}, /* 0x22 OID_RT_PRO_READ_EEPROM */ - {1, &oid_rt_pro_reset_tx_packet_sent_hdl}, /* 0x23 */ - {1, &oid_rt_pro_query_tx_packet_sent_hdl}, /* 0x24 */ - {1, &oid_rt_pro_reset_rx_packet_received_hdl}, /* 0x25 */ - {1, &oid_rt_pro_query_rx_packet_received_hdl}, /* 0x26 */ - {1, &oid_rt_pro_query_rx_packet_crc32_error_hdl}, /* 0x27 */ - {1, &oid_null_function}, /* 0x28 OID_RT_PRO_QUERY_CURRENT_ADDRESS */ - {1, &oid_null_function}, /* 0x29 OID_RT_PRO_QUERY_PERMANENT_ADDRESS */ - {1, &oid_null_function}, /* 0x2A OID_RT_PRO_SET_PHILIPS_RF_PARAMETERS */ - {1, &oid_rt_pro_set_carrier_suppression_tx_hdl},/* 0x2B OID_RT_PRO_SET_CARRIER_SUPPRESSION_TX */ - {1, &oid_null_function}, /* 0x2C OID_RT_PRO_RECEIVE_PACKET */ - {1, &oid_null_function}, /* 0x2D OID_RT_PRO_WRITE_EEPROM_BYTE */ - {1, &oid_null_function}, /* 0x2E OID_RT_PRO_READ_EEPROM_BYTE */ - {1, &oid_rt_pro_set_modulation_hdl} /* 0x2F */ - -}; - -const struct oid_obj_priv oid_rtl_seg_81_80_40[] = { - {1, &oid_null_function}, /* 0x40 */ - {1, &oid_null_function}, /* 0x41 */ - {1, &oid_null_function}, /* 0x42 */ - {1, &oid_rt_pro_set_single_tone_tx_hdl}, /* 0x43 */ - {1, &oid_null_function}, /* 0x44 */ - {1, &oid_null_function} /* 0x45 */ -}; - -const struct oid_obj_priv oid_rtl_seg_81_80_80[] = { - {1, &oid_null_function}, /* 0x80 OID_RT_DRIVER_OPTION */ - {1, &oid_null_function}, /* 0x81 OID_RT_RF_OFF */ - {1, &oid_null_function} /* 0x82 OID_RT_AUTH_STATUS */ - -}; - -const struct oid_obj_priv oid_rtl_seg_81_85[] = { - {1, &oid_rt_wireless_mode_hdl} /* 0x00 OID_RT_WIRELESS_MODE */ -}; - -struct oid_obj_priv oid_rtl_seg_81_87[] = { - {1, &oid_null_function}, /* 0x80 OID_RT_PRO8187_WI_POLL */ - {1, &oid_rt_pro_write_bb_reg_hdl}, /* 0x81 */ - {1, &oid_rt_pro_read_bb_reg_hdl}, /* 0x82 */ - {1, &oid_rt_pro_write_rf_reg_hdl}, /* 0x82 */ - {1, &oid_rt_pro_read_rf_reg_hdl} /* 0x83 */ -}; - -struct oid_obj_priv oid_rtl_seg_87_11_00[] = { - {1, &oid_rt_pro8711_join_bss_hdl}, /* 0x00 */ /* S */ - {1, &oid_rt_pro_read_register_hdl}, /* 0x01 */ - {1, &oid_rt_pro_write_register_hdl}, /* 0x02 */ - {1, &oid_rt_pro_burst_read_register_hdl}, /* 0x03 */ - {1, &oid_rt_pro_burst_write_register_hdl}, /* 0x04 */ - {1, &oid_rt_pro_write_txcmd_hdl}, /* 0x05 */ - {1, &oid_rt_pro_read16_eeprom_hdl}, /* 0x06 */ - {1, &oid_rt_pro_write16_eeprom_hdl}, /* 0x07 */ - {1, &oid_null_function}, /* 0x08 OID_RT_PRO_H2C_SET_COMMAND */ - {1, &oid_null_function}, /* 0x09 OID_RT_PRO_H2C_QUERY_RESULT */ - {1, &oid_rt_pro8711_wi_poll_hdl}, /* 0x0A */ - {1, &oid_rt_pro8711_pkt_loss_hdl}, /* 0x0B */ - {1, &oid_rt_rd_attrib_mem_hdl}, /* 0x0C */ - {1, &oid_rt_wr_attrib_mem_hdl}, /* 0x0D */ - {1, &oid_null_function}, /* 0x0E */ - {1, &oid_null_function}, /* 0x0F */ - {1, &oid_null_function}, /* 0x10 OID_RT_PRO_H2C_CMD_MODE */ - {1, &oid_null_function}, /* 0x11 OID_RT_PRO_H2C_CMD_RSP_MODE */ - {1, &oid_null_function}, /* 0X12 OID_RT_PRO_WAIT_C2H_EVENT */ - {1, &oid_null_function}, /* 0X13 OID_RT_PRO_RW_ACCESS_PROTOCOL_TEST */ - {1, &oid_null_function}, /* 0X14 OID_RT_PRO_SCSI_ACCESS_TEST */ - {1, &oid_null_function}, /* 0X15 OID_RT_PRO_SCSI_TCPIPOFFLOAD_OUT */ - {1, &oid_null_function}, /* 0X16 OID_RT_PRO_SCSI_TCPIPOFFLOAD_IN */ - {1, &oid_null_function}, /* 0X17 OID_RT_RRO_RX_PKT_VIA_IOCTRL */ - {1, &oid_null_function}, /* 0X18 OID_RT_RRO_RX_PKTARRAY_VIA_IOCTRL */ - {1, &oid_null_function}, /* 0X19 OID_RT_RPO_SET_PWRMGT_TEST */ - {1, &oid_null_function}, /* 0X1A */ - {1, &oid_null_function}, /* 0X1B OID_RT_PRO_QRY_PWRMGT_TEST */ - {1, &oid_null_function}, /* 0X1C OID_RT_RPO_ASYNC_RWIO_TEST */ - {1, &oid_null_function}, /* 0X1D OID_RT_RPO_ASYNC_RWIO_POLL */ - {1, &oid_rt_pro_set_rf_intfs_hdl}, /* 0X1E */ - {1, &oid_rt_poll_rx_status_hdl} /* 0X1F */ -}; - -struct oid_obj_priv oid_rtl_seg_87_11_20[] = { - {1, &oid_rt_pro_cfg_debug_message_hdl}, /* 0x20 */ - {1, &oid_rt_pro_set_data_rate_ex_hdl}, /* 0x21 */ - {1, &oid_rt_pro_set_basic_rate_hdl}, /* 0x22 */ - {1, &oid_rt_pro_read_tssi_hdl}, /* 0x23 */ - {1, &oid_rt_pro_set_power_tracking_hdl} /* 0x24 */ -}; - - -struct oid_obj_priv oid_rtl_seg_87_11_50[] = { - {1, &oid_rt_pro_qry_pwrstate_hdl}, /* 0x50 */ - {1, &oid_rt_pro_set_pwrstate_hdl} /* 0x51 */ -}; - -struct oid_obj_priv oid_rtl_seg_87_11_80[] = { - {1, &oid_null_function} /* 0x80 */ -}; - -struct oid_obj_priv oid_rtl_seg_87_11_B0[] = { - {1, &oid_null_function} /* 0xB0 */ -}; - -struct oid_obj_priv oid_rtl_seg_87_11_F0[] = { - {1, &oid_null_function}, /* 0xF0 */ - {1, &oid_null_function}, /* 0xF1 */ - {1, &oid_null_function}, /* 0xF2 */ - {1, &oid_null_function}, /* 0xF3 */ - {1, &oid_null_function}, /* 0xF4 */ - {1, &oid_null_function}, /* 0xF5 */ - {1, &oid_null_function}, /* 0xF6 */ - {1, &oid_null_function}, /* 0xF7 */ - {1, &oid_null_function}, /* 0xF8 */ - {1, &oid_null_function}, /* 0xF9 */ - {1, &oid_null_function}, /* 0xFA */ - {1, &oid_rt_pro_h2c_set_rate_table_hdl}, /* 0xFB */ - {1, &oid_rt_pro_h2c_get_rate_table_hdl}, /* 0xFC */ - {1, &oid_null_function}, /* 0xFD */ - {1, &oid_null_function}, /* 0xFE OID_RT_PRO_H2C_C2H_LBK_TEST */ - {1, &oid_null_function} /* 0xFF */ - -}; - -struct oid_obj_priv oid_rtl_seg_87_12_00[] = { - {1, &oid_rt_pro_encryption_ctrl_hdl}, /* 0x00 Q&S */ - {1, &oid_rt_pro_add_sta_info_hdl}, /* 0x01 S */ - {1, &oid_rt_pro_dele_sta_info_hdl}, /* 0x02 S */ - {1, &oid_rt_pro_query_dr_variable_hdl}, /* 0x03 Q */ - {1, &oid_rt_pro_rx_packet_type_hdl}, /* 0x04 Q,S */ - {1, &oid_rt_pro_read_efuse_hdl}, /* 0x05 Q OID_RT_PRO_READ_EFUSE */ - {1, &oid_rt_pro_write_efuse_hdl}, /* 0x06 S OID_RT_PRO_WRITE_EFUSE */ - {1, &oid_rt_pro_rw_efuse_pgpkt_hdl}, /* 0x07 Q,S */ - {1, &oid_rt_get_efuse_current_size_hdl}, /* 0x08 Q */ - {1, &oid_rt_set_bandwidth_hdl}, /* 0x09 */ - {1, &oid_rt_set_crystal_cap_hdl}, /* 0x0a */ - {1, &oid_rt_set_rx_packet_type_hdl}, /* 0x0b S */ - {1, &oid_rt_get_efuse_max_size_hdl}, /* 0x0c */ - {1, &oid_rt_pro_set_tx_agc_offset_hdl}, /* 0x0d */ - {1, &oid_rt_pro_set_pkt_test_mode_hdl}, /* 0x0e */ - {1, &oid_null_function}, /* 0x0f OID_RT_PRO_FOR_EVM_TEST_SETTING */ - {1, &oid_rt_get_thermal_meter_hdl}, /* 0x10 Q OID_RT_PRO_GET_THERMAL_METER */ - {1, &oid_rt_reset_phy_rx_packet_count_hdl}, /* 0x11 S OID_RT_RESET_PHY_RX_PACKET_COUNT */ - {1, &oid_rt_get_phy_rx_packet_received_hdl}, /* 0x12 Q OID_RT_GET_PHY_RX_PACKET_RECEIVED */ - {1, &oid_rt_get_phy_rx_packet_crc32_error_hdl}, /* 0x13 Q OID_RT_GET_PHY_RX_PACKET_CRC32_ERROR */ - {1, &oid_rt_set_power_down_hdl}, /* 0x14 Q OID_RT_SET_POWER_DOWN */ - {1, &oid_rt_get_power_mode_hdl} /* 0x15 Q OID_RT_GET_POWER_MODE */ -}; - -#else /* _RTL871X_MP_IOCTL_C_ */ - -extern struct oid_obj_priv oid_rtl_seg_81_80_00[32]; -extern struct oid_obj_priv oid_rtl_seg_81_80_20[16]; -extern struct oid_obj_priv oid_rtl_seg_81_80_40[6]; -extern struct oid_obj_priv oid_rtl_seg_81_80_80[3]; - -extern struct oid_obj_priv oid_rtl_seg_81_85[1]; -extern struct oid_obj_priv oid_rtl_seg_81_87[5]; - -extern struct oid_obj_priv oid_rtl_seg_87_11_00[32]; -extern struct oid_obj_priv oid_rtl_seg_87_11_20[5]; -extern struct oid_obj_priv oid_rtl_seg_87_11_50[2]; -extern struct oid_obj_priv oid_rtl_seg_87_11_80[1]; -extern struct oid_obj_priv oid_rtl_seg_87_11_B0[1]; -extern struct oid_obj_priv oid_rtl_seg_87_11_F0[16]; - -extern struct oid_obj_priv oid_rtl_seg_87_12_00[32]; - -#endif /* _RTL871X_MP_IOCTL_C_ */ - -struct rwreg_param { - u32 offset; - u32 width; - u32 value; -}; - -struct bbreg_param { - u32 offset; - u32 phymask; - u32 value; -}; -/* -struct rfchannel_param{ - u32 ch; - u32 modem; -}; -*/ -struct txpower_param { - u32 pwr_index; -}; - - -struct datarate_param { - u32 rate_index; -}; - - -struct rfintfs_parm { - u32 rfintfs; -}; - -typedef struct _mp_xmit_parm_ { - u8 enable; - u32 count; - u16 length; - u8 payload_type; - u8 da[ETH_ALEN]; -} MP_XMIT_PARM, *PMP_XMIT_PARM; - -struct mp_xmit_packet { - u32 len; - u32 mem[MAX_MP_XMITBUF_SZ >> 2]; -}; - -struct psmode_param { - u32 ps_mode; - u32 smart_ps; -}; - -/* for OID_RT_PRO_READ16_EEPROM & OID_RT_PRO_WRITE16_EEPROM */ -struct eeprom_rw_param { - u32 offset; - u16 value; -}; - -struct mp_ioctl_handler { - u32 paramsize; - u32(*handler)(struct oid_par_priv *poid_par_priv); - u32 oid; -}; - -struct mp_ioctl_param { - u32 subcode; - u32 len; - u8 data[0]; -}; - -#define GEN_MP_IOCTL_SUBCODE(code) _MP_IOCTL_ ## code ## _CMD_ - -enum RTL871X_MP_IOCTL_SUBCODE { - GEN_MP_IOCTL_SUBCODE(MP_START), /*0*/ - GEN_MP_IOCTL_SUBCODE(MP_STOP), - GEN_MP_IOCTL_SUBCODE(READ_REG), - GEN_MP_IOCTL_SUBCODE(WRITE_REG), - GEN_MP_IOCTL_SUBCODE(READ_BB_REG), - GEN_MP_IOCTL_SUBCODE(WRITE_BB_REG), /*5*/ - GEN_MP_IOCTL_SUBCODE(READ_RF_REG), - GEN_MP_IOCTL_SUBCODE(WRITE_RF_REG), - GEN_MP_IOCTL_SUBCODE(SET_CHANNEL), - GEN_MP_IOCTL_SUBCODE(SET_TXPOWER), - GEN_MP_IOCTL_SUBCODE(SET_DATARATE), /*10*/ - GEN_MP_IOCTL_SUBCODE(SET_BANDWIDTH), - GEN_MP_IOCTL_SUBCODE(SET_ANTENNA), - GEN_MP_IOCTL_SUBCODE(CNTU_TX), - GEN_MP_IOCTL_SUBCODE(SC_TX), - GEN_MP_IOCTL_SUBCODE(CS_TX), /*15*/ - GEN_MP_IOCTL_SUBCODE(ST_TX), - GEN_MP_IOCTL_SUBCODE(IOCTL_XMIT_PACKET), - GEN_MP_IOCTL_SUBCODE(SET_RX_PKT_TYPE), - GEN_MP_IOCTL_SUBCODE(RESET_PHY_RX_PKT_CNT), - GEN_MP_IOCTL_SUBCODE(GET_PHY_RX_PKT_RECV), /*20*/ - GEN_MP_IOCTL_SUBCODE(GET_PHY_RX_PKT_ERROR), - GEN_MP_IOCTL_SUBCODE(READ16_EEPROM), - GEN_MP_IOCTL_SUBCODE(WRITE16_EEPROM), - GEN_MP_IOCTL_SUBCODE(EFUSE), - GEN_MP_IOCTL_SUBCODE(EFUSE_MAP), /*25*/ - GEN_MP_IOCTL_SUBCODE(GET_EFUSE_MAX_SIZE), - GEN_MP_IOCTL_SUBCODE(GET_EFUSE_CURRENT_SIZE), - GEN_MP_IOCTL_SUBCODE(GET_THERMAL_METER), - GEN_MP_IOCTL_SUBCODE(SET_PTM), - GEN_MP_IOCTL_SUBCODE(SET_POWER_DOWN), /*30*/ - GEN_MP_IOCTL_SUBCODE(TRIGGER_GPIO), - GEN_MP_IOCTL_SUBCODE(SET_DM_BT), /*32*/ - GEN_MP_IOCTL_SUBCODE(DEL_BA), /*33*/ - GEN_MP_IOCTL_SUBCODE(GET_WIFI_STATUS), /*34*/ - MAX_MP_IOCTL_SUBCODE, -}; - -u32 mp_ioctl_xmit_packet_hdl(struct oid_par_priv *poid_par_priv); - -#ifdef _RTW_MP_IOCTL_C_ - -#define GEN_MP_IOCTL_HANDLER(sz, hdl, oid) {sz, hdl, oid}, - -#define EXT_MP_IOCTL_HANDLER(sz, subcode, oid) {sz, mp_ioctl_ ## subcode ## _hdl, oid}, - - -struct mp_ioctl_handler mp_ioctl_hdl[] = { - - /*0*/ GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_start_test_hdl, OID_RT_PRO_START_TEST) - GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_stop_test_hdl, OID_RT_PRO_STOP_TEST) - - GEN_MP_IOCTL_HANDLER(sizeof(struct rwreg_param), oid_rt_pro_read_register_hdl, OID_RT_PRO_READ_REGISTER) - GEN_MP_IOCTL_HANDLER(sizeof(struct rwreg_param), oid_rt_pro_write_register_hdl, OID_RT_PRO_WRITE_REGISTER) - GEN_MP_IOCTL_HANDLER(sizeof(struct bb_reg_param), oid_rt_pro_read_bb_reg_hdl, OID_RT_PRO_READ_BB_REG) - /*5*/ GEN_MP_IOCTL_HANDLER(sizeof(struct bb_reg_param), oid_rt_pro_write_bb_reg_hdl, OID_RT_PRO_WRITE_BB_REG) - GEN_MP_IOCTL_HANDLER(sizeof(struct rf_reg_param), oid_rt_pro_read_rf_reg_hdl, OID_RT_PRO_RF_READ_REGISTRY) - GEN_MP_IOCTL_HANDLER(sizeof(struct rf_reg_param), oid_rt_pro_write_rf_reg_hdl, OID_RT_PRO_RF_WRITE_REGISTRY) - - GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_channel_direct_call_hdl, OID_RT_PRO_SET_CHANNEL_DIRECT_CALL) - GEN_MP_IOCTL_HANDLER(sizeof(struct txpower_param), oid_rt_pro_set_tx_power_control_hdl, OID_RT_PRO_SET_TX_POWER_CONTROL) - /*10*/ GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_data_rate_hdl, OID_RT_PRO_SET_DATA_RATE) - GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_set_bandwidth_hdl, OID_RT_SET_BANDWIDTH) - GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_antenna_bb_hdl, OID_RT_PRO_SET_ANTENNA_BB) - - GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_continuous_tx_hdl, OID_RT_PRO_SET_CONTINUOUS_TX) - GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_single_carrier_tx_hdl, OID_RT_PRO_SET_SINGLE_CARRIER_TX) - /*15*/ GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_carrier_suppression_tx_hdl, OID_RT_PRO_SET_CARRIER_SUPPRESSION_TX) - GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_pro_set_single_tone_tx_hdl, OID_RT_PRO_SET_SINGLE_TONE_TX) - - EXT_MP_IOCTL_HANDLER(0, xmit_packet, 0) - - GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_set_rx_packet_type_hdl, OID_RT_SET_RX_PACKET_TYPE) - GEN_MP_IOCTL_HANDLER(0, oid_rt_reset_phy_rx_packet_count_hdl, OID_RT_RESET_PHY_RX_PACKET_COUNT) - /*20*/ GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_get_phy_rx_packet_received_hdl, OID_RT_GET_PHY_RX_PACKET_RECEIVED) - GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_get_phy_rx_packet_crc32_error_hdl, OID_RT_GET_PHY_RX_PACKET_CRC32_ERROR) - - GEN_MP_IOCTL_HANDLER(sizeof(struct eeprom_rw_param), NULL, 0) - GEN_MP_IOCTL_HANDLER(sizeof(struct eeprom_rw_param), NULL, 0) - GEN_MP_IOCTL_HANDLER(sizeof(EFUSE_ACCESS_STRUCT), oid_rt_pro_efuse_hdl, OID_RT_PRO_EFUSE) - /*25*/ GEN_MP_IOCTL_HANDLER(0, oid_rt_pro_efuse_map_hdl, OID_RT_PRO_EFUSE_MAP) - GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_get_efuse_max_size_hdl, OID_RT_GET_EFUSE_MAX_SIZE) - GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_get_efuse_current_size_hdl, OID_RT_GET_EFUSE_CURRENT_SIZE) - - GEN_MP_IOCTL_HANDLER(sizeof(u32), oid_rt_get_thermal_meter_hdl, OID_RT_PRO_GET_THERMAL_METER) - GEN_MP_IOCTL_HANDLER(sizeof(u8), oid_rt_pro_set_power_tracking_hdl, OID_RT_PRO_SET_POWER_TRACKING) - /*30*/ GEN_MP_IOCTL_HANDLER(sizeof(u8), oid_rt_set_power_down_hdl, OID_RT_SET_POWER_DOWN) - /*31*/ GEN_MP_IOCTL_HANDLER(0, oid_rt_pro_trigger_gpio_hdl, 0) - GEN_MP_IOCTL_HANDLER(0, NULL, 0) - GEN_MP_IOCTL_HANDLER(0, NULL, 0) - GEN_MP_IOCTL_HANDLER(0, NULL, 0) -}; - -#else /* _RTW_MP_IOCTL_C_ */ - -extern struct mp_ioctl_handler mp_ioctl_hdl[]; - -#endif /* _RTW_MP_IOCTL_C_ */ - -#endif diff --git a/drivers/net/wireless/realtek/rtl8812au/include/rtw_version.h b/drivers/net/wireless/realtek/rtl8812au/include/rtw_version.h deleted file mode 100644 index d1591da8e89dc5..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/include/rtw_version.h +++ /dev/null @@ -1 +0,0 @@ -#define DRIVERVERSION "v5.6.4.2_35491.20191025" diff --git a/drivers/net/wireless/realtek/rtl8812au/include/wlan_bssdef.h b/drivers/net/wireless/realtek/rtl8812au/include/wlan_bssdef.h deleted file mode 100644 index e078eb877e5567..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/include/wlan_bssdef.h +++ /dev/null @@ -1,655 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2007 - 2017 Realtek Corporation. - * - * 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 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 __WLAN_BSSDEF_H__ -#define __WLAN_BSSDEF_H__ - - -#define MAX_IE_SZ 768 - - -#ifdef PLATFORM_LINUX - -#define NDIS_802_11_LENGTH_SSID 32 -#define NDIS_802_11_LENGTH_RATES 8 -#define NDIS_802_11_LENGTH_RATES_EX 16 - -typedef unsigned char NDIS_802_11_MAC_ADDRESS[ETH_ALEN]; -typedef long NDIS_802_11_RSSI; /* in dBm */ -typedef unsigned char NDIS_802_11_RATES[NDIS_802_11_LENGTH_RATES]; /* Set of 8 data rates */ -typedef unsigned char NDIS_802_11_RATES_EX[NDIS_802_11_LENGTH_RATES_EX]; /* Set of 16 data rates */ - - -typedef ULONG NDIS_802_11_KEY_INDEX; -typedef unsigned long long NDIS_802_11_KEY_RSC; - - -typedef struct _NDIS_802_11_SSID { - ULONG SsidLength; - UCHAR Ssid[32]; -} NDIS_802_11_SSID, *PNDIS_802_11_SSID; - -typedef enum _NDIS_802_11_NETWORK_TYPE { - Ndis802_11FH, - Ndis802_11DS, - Ndis802_11OFDM5, - Ndis802_11OFDM24, - Ndis802_11NetworkTypeMax /* not a real type, defined as an upper bound */ -} NDIS_802_11_NETWORK_TYPE, *PNDIS_802_11_NETWORK_TYPE; - -typedef struct _NDIS_802_11_CONFIGURATION_FH { - ULONG Length; /* Length of structure */ - ULONG HopPattern; /* As defined by 802.11, MSB set */ - ULONG HopSet; /* to one if non-802.11 */ - ULONG DwellTime; /* units are Kusec */ -} NDIS_802_11_CONFIGURATION_FH, *PNDIS_802_11_CONFIGURATION_FH; - - -/* - FW will only save the channel number in DSConfig. - ODI Handler will convert the channel number to freq. number. -*/ -typedef struct _NDIS_802_11_CONFIGURATION { - ULONG Length; /* Length of structure */ - ULONG BeaconPeriod; /* units are Kusec */ - ULONG ATIMWindow; /* units are Kusec */ - ULONG DSConfig; /* channel number */ - NDIS_802_11_CONFIGURATION_FH FHConfig; -} NDIS_802_11_CONFIGURATION, *PNDIS_802_11_CONFIGURATION; - - - -typedef enum _NDIS_802_11_NETWORK_INFRASTRUCTURE { - Ndis802_11IBSS, - Ndis802_11Infrastructure, - Ndis802_11AutoUnknown, - Ndis802_11InfrastructureMax, /* Not a real value, defined as upper bound */ - Ndis802_11APMode, - Ndis802_11Monitor, - Ndis802_11_mesh, -} NDIS_802_11_NETWORK_INFRASTRUCTURE, *PNDIS_802_11_NETWORK_INFRASTRUCTURE; - - - - - -typedef struct _NDIS_802_11_FIXED_IEs { - UCHAR Timestamp[8]; - USHORT BeaconInterval; - USHORT Capabilities; -} NDIS_802_11_FIXED_IEs, *PNDIS_802_11_FIXED_IEs; - - - -typedef struct _NDIS_802_11_VARIABLE_IEs { - UCHAR ElementID; - UCHAR Length; - UCHAR data[1]; -} NDIS_802_11_VARIABLE_IEs, *PNDIS_802_11_VARIABLE_IEs; - - - -/* - - - -Length is the 4 bytes multiples of the sume of - sizeof (NDIS_802_11_MAC_ADDRESS) + 2 + sizeof (NDIS_802_11_SSID) + sizeof (ULONG) -+ sizeof (NDIS_802_11_RSSI) + sizeof (NDIS_802_11_NETWORK_TYPE) + sizeof (NDIS_802_11_CONFIGURATION) -+ sizeof (NDIS_802_11_RATES_EX) + IELength - -Except the IELength, all other fields are fixed length. Therefore, we can define a marco to present the -partial sum. - -*/ -#if 0 -typedef struct _NDIS_WLAN_BSSID_EX { - ULONG Length; - NDIS_802_11_MAC_ADDRESS MacAddress; - UCHAR Reserved[2];/* [0]: IS beacon frame, [1]:optimum_antenna=>For antenna diversity; */ - NDIS_802_11_SSID Ssid; - ULONG Privacy; - NDIS_802_11_RSSI Rssi; - NDIS_802_11_NETWORK_TYPE NetworkTypeInUse; - NDIS_802_11_CONFIGURATION Configuration; - NDIS_802_11_NETWORK_INFRASTRUCTURE InfrastructureMode; - NDIS_802_11_RATES_EX SupportedRates; - ULONG IELength; - UCHAR IEs[MAX_IE_SZ]; /* (timestamp, beacon interval, and capability information) */ -} NDIS_WLAN_BSSID_EX, *PNDIS_WLAN_BSSID_EX; - - -typedef struct _NDIS_802_11_BSSID_LIST_EX { - ULONG NumberOfItems; - NDIS_WLAN_BSSID_EX Bssid[1]; -} NDIS_802_11_BSSID_LIST_EX, *PNDIS_802_11_BSSID_LIST_EX; -#endif - -typedef enum _NDIS_802_11_AUTHENTICATION_MODE { - Ndis802_11AuthModeOpen, - Ndis802_11AuthModeShared, - Ndis802_11AuthModeAutoSwitch, - Ndis802_11AuthModeWPA, - Ndis802_11AuthModeWPAPSK, - Ndis802_11AuthModeWPANone, - Ndis802_11AuthModeWAPI, - Ndis802_11AuthModeMax /* Not a real mode, defined as upper bound */ -} NDIS_802_11_AUTHENTICATION_MODE, *PNDIS_802_11_AUTHENTICATION_MODE; - -typedef enum _NDIS_802_11_WEP_STATUS { - Ndis802_11WEPEnabled, - Ndis802_11Encryption1Enabled = Ndis802_11WEPEnabled, - Ndis802_11WEPDisabled, - Ndis802_11EncryptionDisabled = Ndis802_11WEPDisabled, - Ndis802_11WEPKeyAbsent, - Ndis802_11Encryption1KeyAbsent = Ndis802_11WEPKeyAbsent, - Ndis802_11WEPNotSupported, - Ndis802_11EncryptionNotSupported = Ndis802_11WEPNotSupported, - Ndis802_11Encryption2Enabled, - Ndis802_11Encryption2KeyAbsent, - Ndis802_11Encryption3Enabled, - Ndis802_11Encryption3KeyAbsent, - Ndis802_11_EncrypteionWAPI -} NDIS_802_11_WEP_STATUS, *PNDIS_802_11_WEP_STATUS, -NDIS_802_11_ENCRYPTION_STATUS, *PNDIS_802_11_ENCRYPTION_STATUS; - - -#define NDIS_802_11_AI_REQFI_CAPABILITIES 1 -#define NDIS_802_11_AI_REQFI_LISTENINTERVAL 2 -#define NDIS_802_11_AI_REQFI_CURRENTAPADDRESS 4 - -#define NDIS_802_11_AI_RESFI_CAPABILITIES 1 -#define NDIS_802_11_AI_RESFI_STATUSCODE 2 -#define NDIS_802_11_AI_RESFI_ASSOCIATIONID 4 - -typedef struct _NDIS_802_11_AI_REQFI { - USHORT Capabilities; - USHORT ListenInterval; - NDIS_802_11_MAC_ADDRESS CurrentAPAddress; -} NDIS_802_11_AI_REQFI, *PNDIS_802_11_AI_REQFI; - -typedef struct _NDIS_802_11_AI_RESFI { - USHORT Capabilities; - USHORT StatusCode; - USHORT AssociationId; -} NDIS_802_11_AI_RESFI, *PNDIS_802_11_AI_RESFI; - -typedef struct _NDIS_802_11_ASSOCIATION_INFORMATION { - ULONG Length; - USHORT AvailableRequestFixedIEs; - NDIS_802_11_AI_REQFI RequestFixedIEs; - ULONG RequestIELength; - ULONG OffsetRequestIEs; - USHORT AvailableResponseFixedIEs; - NDIS_802_11_AI_RESFI ResponseFixedIEs; - ULONG ResponseIELength; - ULONG OffsetResponseIEs; -} NDIS_802_11_ASSOCIATION_INFORMATION, *PNDIS_802_11_ASSOCIATION_INFORMATION; - -typedef enum _NDIS_802_11_RELOAD_DEFAULTS { - Ndis802_11ReloadWEPKeys -} NDIS_802_11_RELOAD_DEFAULTS, *PNDIS_802_11_RELOAD_DEFAULTS; - - -/* Key mapping keys require a BSSID */ -typedef struct _NDIS_802_11_KEY { - ULONG Length; /* Length of this structure */ - ULONG KeyIndex; - ULONG KeyLength; /* length of key in bytes */ - NDIS_802_11_MAC_ADDRESS BSSID; - NDIS_802_11_KEY_RSC KeyRSC; - UCHAR KeyMaterial[32]; /* variable length depending on above field */ -} NDIS_802_11_KEY, *PNDIS_802_11_KEY; - -typedef struct _NDIS_802_11_REMOVE_KEY { - ULONG Length; /* Length of this structure */ - ULONG KeyIndex; - NDIS_802_11_MAC_ADDRESS BSSID; -} NDIS_802_11_REMOVE_KEY, *PNDIS_802_11_REMOVE_KEY; - -typedef struct _NDIS_802_11_WEP { - ULONG Length; /* Length of this structure */ - ULONG KeyIndex; /* 0 is the per-client key, 1-N are the global keys */ - ULONG KeyLength; /* length of key in bytes */ - UCHAR KeyMaterial[16];/* variable length depending on above field */ -} NDIS_802_11_WEP, *PNDIS_802_11_WEP; - -typedef struct _NDIS_802_11_AUTHENTICATION_REQUEST { - ULONG Length; /* Length of structure */ - NDIS_802_11_MAC_ADDRESS Bssid; - ULONG Flags; -} NDIS_802_11_AUTHENTICATION_REQUEST, *PNDIS_802_11_AUTHENTICATION_REQUEST; - -typedef enum _NDIS_802_11_STATUS_TYPE { - Ndis802_11StatusType_Authentication, - Ndis802_11StatusType_MediaStreamMode, - Ndis802_11StatusType_PMKID_CandidateList, - Ndis802_11StatusTypeMax /* not a real type, defined as an upper bound */ -} NDIS_802_11_STATUS_TYPE, *PNDIS_802_11_STATUS_TYPE; - -typedef struct _NDIS_802_11_STATUS_INDICATION { - NDIS_802_11_STATUS_TYPE StatusType; -} NDIS_802_11_STATUS_INDICATION, *PNDIS_802_11_STATUS_INDICATION; - -/* mask for authentication/integrity fields */ -#define NDIS_802_11_AUTH_REQUEST_AUTH_FIELDS 0x0f -#define NDIS_802_11_AUTH_REQUEST_REAUTH 0x01 -#define NDIS_802_11_AUTH_REQUEST_KEYUPDATE 0x02 -#define NDIS_802_11_AUTH_REQUEST_PAIRWISE_ERROR 0x06 -#define NDIS_802_11_AUTH_REQUEST_GROUP_ERROR 0x0E - -/* MIC check time, 60 seconds. */ -#define MIC_CHECK_TIME 60000000 - -typedef struct _NDIS_802_11_AUTHENTICATION_EVENT { - NDIS_802_11_STATUS_INDICATION Status; - NDIS_802_11_AUTHENTICATION_REQUEST Request[1]; -} NDIS_802_11_AUTHENTICATION_EVENT, *PNDIS_802_11_AUTHENTICATION_EVENT; - -typedef struct _NDIS_802_11_TEST { - ULONG Length; - ULONG Type; - union { - NDIS_802_11_AUTHENTICATION_EVENT AuthenticationEvent; - NDIS_802_11_RSSI RssiTrigger; - } tt; -} NDIS_802_11_TEST, *PNDIS_802_11_TEST; - - -#endif /* end of #ifdef PLATFORM_LINUX */ - -#ifdef PLATFORM_FREEBSD - -#define NDIS_802_11_LENGTH_SSID 32 -#define NDIS_802_11_LENGTH_RATES 8 -#define NDIS_802_11_LENGTH_RATES_EX 16 - -typedef unsigned char NDIS_802_11_MAC_ADDRESS[ETH_ALEN]; -typedef long NDIS_802_11_RSSI; /* in dBm */ -typedef unsigned char NDIS_802_11_RATES[NDIS_802_11_LENGTH_RATES]; /* Set of 8 data rates */ -typedef unsigned char NDIS_802_11_RATES_EX[NDIS_802_11_LENGTH_RATES_EX]; /* Set of 16 data rates */ - - -typedef ULONG NDIS_802_11_KEY_INDEX; -typedef unsigned long long NDIS_802_11_KEY_RSC; - - -typedef struct _NDIS_802_11_SSID { - ULONG SsidLength; - UCHAR Ssid[32]; -} NDIS_802_11_SSID, *PNDIS_802_11_SSID; - -typedef enum _NDIS_802_11_NETWORK_TYPE { - Ndis802_11FH, - Ndis802_11DS, - Ndis802_11OFDM5, - Ndis802_11OFDM24, - Ndis802_11NetworkTypeMax /* not a real type, defined as an upper bound */ -} NDIS_802_11_NETWORK_TYPE, *PNDIS_802_11_NETWORK_TYPE; - -typedef struct _NDIS_802_11_CONFIGURATION_FH { - ULONG Length; /* Length of structure */ - ULONG HopPattern; /* As defined by 802.11, MSB set */ - ULONG HopSet; /* to one if non-802.11 */ - ULONG DwellTime; /* units are Kusec */ -} NDIS_802_11_CONFIGURATION_FH, *PNDIS_802_11_CONFIGURATION_FH; - - -/* - FW will only save the channel number in DSConfig. - ODI Handler will convert the channel number to freq. number. -*/ -typedef struct _NDIS_802_11_CONFIGURATION { - ULONG Length; /* Length of structure */ - ULONG BeaconPeriod; /* units are Kusec */ - ULONG ATIMWindow; /* units are Kusec */ - ULONG DSConfig; /* channel number */ - NDIS_802_11_CONFIGURATION_FH FHConfig; -} NDIS_802_11_CONFIGURATION, *PNDIS_802_11_CONFIGURATION; - - - -typedef enum _NDIS_802_11_NETWORK_INFRASTRUCTURE { - Ndis802_11IBSS, - Ndis802_11Infrastructure, - Ndis802_11AutoUnknown, - Ndis802_11InfrastructureMax, /* Not a real value, defined as upper bound */ - Ndis802_11APMode -} NDIS_802_11_NETWORK_INFRASTRUCTURE, *PNDIS_802_11_NETWORK_INFRASTRUCTURE; - - - - - -typedef struct _NDIS_802_11_FIXED_IEs { - UCHAR Timestamp[8]; - USHORT BeaconInterval; - USHORT Capabilities; -} NDIS_802_11_FIXED_IEs, *PNDIS_802_11_FIXED_IEs; - - - -typedef struct _NDIS_802_11_VARIABLE_IEs { - UCHAR ElementID; - UCHAR Length; - UCHAR data[1]; -} NDIS_802_11_VARIABLE_IEs, *PNDIS_802_11_VARIABLE_IEs; - - - -/* - - - -Length is the 4 bytes multiples of the sume of - sizeof (NDIS_802_11_MAC_ADDRESS) + 2 + sizeof (NDIS_802_11_SSID) + sizeof (ULONG) -+ sizeof (NDIS_802_11_RSSI) + sizeof (NDIS_802_11_NETWORK_TYPE) + sizeof (NDIS_802_11_CONFIGURATION) -+ sizeof (NDIS_802_11_RATES_EX) + IELength - -Except the IELength, all other fields are fixed length. Therefore, we can define a marco to present the -partial sum. - -*/ -#if 0 -typedef struct _NDIS_WLAN_BSSID_EX { - ULONG Length; - NDIS_802_11_MAC_ADDRESS MacAddress; - UCHAR Reserved[2];/* [0]: IS beacon frame, [1]:optimum_antenna=>For antenna diversity; */ - NDIS_802_11_SSID Ssid; - ULONG Privacy; - NDIS_802_11_RSSI Rssi; - NDIS_802_11_NETWORK_TYPE NetworkTypeInUse; - NDIS_802_11_CONFIGURATION Configuration; - NDIS_802_11_NETWORK_INFRASTRUCTURE InfrastructureMode; - NDIS_802_11_RATES_EX SupportedRates; - ULONG IELength; - UCHAR IEs[MAX_IE_SZ]; /* (timestamp, beacon interval, and capability information) */ -} NDIS_WLAN_BSSID_EX, *PNDIS_WLAN_BSSID_EX; - - -typedef struct _NDIS_802_11_BSSID_LIST_EX { - ULONG NumberOfItems; - NDIS_WLAN_BSSID_EX Bssid[1]; -} NDIS_802_11_BSSID_LIST_EX, *PNDIS_802_11_BSSID_LIST_EX; -#endif - -typedef enum _NDIS_802_11_AUTHENTICATION_MODE { - Ndis802_11AuthModeOpen, - Ndis802_11AuthModeShared, - Ndis802_11AuthModeAutoSwitch, - Ndis802_11AuthModeWPA, - Ndis802_11AuthModeWPAPSK, - Ndis802_11AuthModeWPANone, - Ndis802_11AuthModeMax /* Not a real mode, defined as upper bound */ -} NDIS_802_11_AUTHENTICATION_MODE, *PNDIS_802_11_AUTHENTICATION_MODE; - -typedef enum _NDIS_802_11_WEP_STATUS { - Ndis802_11WEPEnabled, - Ndis802_11Encryption1Enabled = Ndis802_11WEPEnabled, - Ndis802_11WEPDisabled, - Ndis802_11EncryptionDisabled = Ndis802_11WEPDisabled, - Ndis802_11WEPKeyAbsent, - Ndis802_11Encryption1KeyAbsent = Ndis802_11WEPKeyAbsent, - Ndis802_11WEPNotSupported, - Ndis802_11EncryptionNotSupported = Ndis802_11WEPNotSupported, - Ndis802_11Encryption2Enabled, - Ndis802_11Encryption2KeyAbsent, - Ndis802_11Encryption3Enabled, - Ndis802_11Encryption3KeyAbsent -} NDIS_802_11_WEP_STATUS, *PNDIS_802_11_WEP_STATUS, -NDIS_802_11_ENCRYPTION_STATUS, *PNDIS_802_11_ENCRYPTION_STATUS; - - -#define NDIS_802_11_AI_REQFI_CAPABILITIES 1 -#define NDIS_802_11_AI_REQFI_LISTENINTERVAL 2 -#define NDIS_802_11_AI_REQFI_CURRENTAPADDRESS 4 - -#define NDIS_802_11_AI_RESFI_CAPABILITIES 1 -#define NDIS_802_11_AI_RESFI_STATUSCODE 2 -#define NDIS_802_11_AI_RESFI_ASSOCIATIONID 4 - -typedef struct _NDIS_802_11_AI_REQFI { - USHORT Capabilities; - USHORT ListenInterval; - NDIS_802_11_MAC_ADDRESS CurrentAPAddress; -} NDIS_802_11_AI_REQFI, *PNDIS_802_11_AI_REQFI; - -typedef struct _NDIS_802_11_AI_RESFI { - USHORT Capabilities; - USHORT StatusCode; - USHORT AssociationId; -} NDIS_802_11_AI_RESFI, *PNDIS_802_11_AI_RESFI; - -typedef struct _NDIS_802_11_ASSOCIATION_INFORMATION { - ULONG Length; - USHORT AvailableRequestFixedIEs; - NDIS_802_11_AI_REQFI RequestFixedIEs; - ULONG RequestIELength; - ULONG OffsetRequestIEs; - USHORT AvailableResponseFixedIEs; - NDIS_802_11_AI_RESFI ResponseFixedIEs; - ULONG ResponseIELength; - ULONG OffsetResponseIEs; -} NDIS_802_11_ASSOCIATION_INFORMATION, *PNDIS_802_11_ASSOCIATION_INFORMATION; - -typedef enum _NDIS_802_11_RELOAD_DEFAULTS { - Ndis802_11ReloadWEPKeys -} NDIS_802_11_RELOAD_DEFAULTS, *PNDIS_802_11_RELOAD_DEFAULTS; - - -/* Key mapping keys require a BSSID */ -typedef struct _NDIS_802_11_KEY { - ULONG Length; /* Length of this structure */ - ULONG KeyIndex; - ULONG KeyLength; /* length of key in bytes */ - NDIS_802_11_MAC_ADDRESS BSSID; - NDIS_802_11_KEY_RSC KeyRSC; - UCHAR KeyMaterial[32]; /* variable length depending on above field */ -} NDIS_802_11_KEY, *PNDIS_802_11_KEY; - -typedef struct _NDIS_802_11_REMOVE_KEY { - ULONG Length; /* Length of this structure */ - ULONG KeyIndex; - NDIS_802_11_MAC_ADDRESS BSSID; -} NDIS_802_11_REMOVE_KEY, *PNDIS_802_11_REMOVE_KEY; - -typedef struct _NDIS_802_11_WEP { - ULONG Length; /* Length of this structure */ - ULONG KeyIndex; /* 0 is the per-client key, 1-N are the global keys */ - ULONG KeyLength; /* length of key in bytes */ - UCHAR KeyMaterial[16];/* variable length depending on above field */ -} NDIS_802_11_WEP, *PNDIS_802_11_WEP; - -typedef struct _NDIS_802_11_AUTHENTICATION_REQUEST { - ULONG Length; /* Length of structure */ - NDIS_802_11_MAC_ADDRESS Bssid; - ULONG Flags; -} NDIS_802_11_AUTHENTICATION_REQUEST, *PNDIS_802_11_AUTHENTICATION_REQUEST; - -typedef enum _NDIS_802_11_STATUS_TYPE { - Ndis802_11StatusType_Authentication, - Ndis802_11StatusType_MediaStreamMode, - Ndis802_11StatusType_PMKID_CandidateList, - Ndis802_11StatusTypeMax /* not a real type, defined as an upper bound */ -} NDIS_802_11_STATUS_TYPE, *PNDIS_802_11_STATUS_TYPE; - -typedef struct _NDIS_802_11_STATUS_INDICATION { - NDIS_802_11_STATUS_TYPE StatusType; -} NDIS_802_11_STATUS_INDICATION, *PNDIS_802_11_STATUS_INDICATION; - -/* mask for authentication/integrity fields */ -#define NDIS_802_11_AUTH_REQUEST_AUTH_FIELDS 0x0f -#define NDIS_802_11_AUTH_REQUEST_REAUTH 0x01 -#define NDIS_802_11_AUTH_REQUEST_KEYUPDATE 0x02 -#define NDIS_802_11_AUTH_REQUEST_PAIRWISE_ERROR 0x06 -#define NDIS_802_11_AUTH_REQUEST_GROUP_ERROR 0x0E - -/* MIC check time, 60 seconds. */ -#define MIC_CHECK_TIME 60000000 - -typedef struct _NDIS_802_11_AUTHENTICATION_EVENT { - NDIS_802_11_STATUS_INDICATION Status; - NDIS_802_11_AUTHENTICATION_REQUEST Request[1]; -} NDIS_802_11_AUTHENTICATION_EVENT, *PNDIS_802_11_AUTHENTICATION_EVENT; - -typedef struct _NDIS_802_11_TEST { - ULONG Length; - ULONG Type; - union { - NDIS_802_11_AUTHENTICATION_EVENT AuthenticationEvent; - NDIS_802_11_RSSI RssiTrigger; - } tt; -} NDIS_802_11_TEST, *PNDIS_802_11_TEST; - - -#endif /* PLATFORM_FREEBSD */ -#ifndef Ndis802_11APMode -#define Ndis802_11APMode (Ndis802_11InfrastructureMax+1) -#endif - -typedef struct _WLAN_PHY_INFO { - u8 SignalStrength;/* (in percentage) */ - u8 SignalQuality;/* (in percentage) */ - u8 Optimum_antenna; /* for Antenna diversity */ - u8 is_cck_rate; /* 1:cck_rate */ - s8 rx_snr[4]; -#ifdef CONFIG_RTW_80211K - u32 free_cnt; /* freerun counter */ - u8 rm_en_cap[5]; -#endif -} WLAN_PHY_INFO, *PWLAN_PHY_INFO; - -typedef struct _WLAN_BCN_INFO { - /* these infor get from rtw_get_encrypt_info when - * * translate scan to UI */ - u8 encryp_protocol;/* ENCRYP_PROTOCOL_E: OPEN/WEP/WPA/WPA2/WAPI */ - int group_cipher; /* WPA/WPA2 group cipher */ - int pairwise_cipher;/* //WPA/WPA2/WEP pairwise cipher */ - int is_8021x; - - /* bwmode 20/40 and ch_offset UP/LOW */ - unsigned short ht_cap_info; - unsigned char ht_info_infos_0; -} WLAN_BCN_INFO, *PWLAN_BCN_INFO; - -enum bss_type { - BSS_TYPE_UNDEF, - BSS_TYPE_BCN = 1, - BSS_TYPE_PROB_REQ = 2, - BSS_TYPE_PROB_RSP = 3, -}; - -/* temporally add #pragma pack for structure alignment issue of -* WLAN_BSSID_EX and get_WLAN_BSSID_EX_sz() -*/ -typedef struct _WLAN_BSSID_EX { - ULONG Length; - NDIS_802_11_MAC_ADDRESS MacAddress; - UCHAR Reserved[2];/* [0]: IS beacon frame , bss_type*/ - NDIS_802_11_SSID Ssid; - NDIS_802_11_SSID mesh_id; - ULONG Privacy; - NDIS_802_11_RSSI Rssi;/* (in dBM,raw data ,get from PHY) */ - NDIS_802_11_NETWORK_TYPE NetworkTypeInUse; - NDIS_802_11_CONFIGURATION Configuration; - NDIS_802_11_NETWORK_INFRASTRUCTURE InfrastructureMode; - NDIS_802_11_RATES_EX SupportedRates; - WLAN_PHY_INFO PhyInfo; - ULONG IELength; - UCHAR IEs[MAX_IE_SZ]; /* (timestamp, beacon interval, and capability information) */ -} -WLAN_BSSID_EX, *PWLAN_BSSID_EX; - -#define BSS_EX_IES(bss_ex) ((bss_ex)->IEs) -#define BSS_EX_IES_LEN(bss_ex) ((bss_ex)->IELength) -#define BSS_EX_FIXED_IE_OFFSET(bss_ex) ((bss_ex)->Reserved[0] == BSS_TYPE_PROB_REQ ? 0 : 12) -#define BSS_EX_TLV_IES(bss_ex) (BSS_EX_IES((bss_ex)) + BSS_EX_FIXED_IE_OFFSET((bss_ex))) -#define BSS_EX_TLV_IES_LEN(bss_ex) (BSS_EX_IES_LEN((bss_ex)) - BSS_EX_FIXED_IE_OFFSET((bss_ex))) - -__inline static uint get_WLAN_BSSID_EX_sz(WLAN_BSSID_EX *bss) -{ -#if 0 - uint t_len; - - t_len = sizeof(ULONG) - + sizeof(NDIS_802_11_MAC_ADDRESS) - + 2 - + sizeof(NDIS_802_11_SSID) - + sizeof(ULONG) - + sizeof(NDIS_802_11_RSSI) - + sizeof(NDIS_802_11_NETWORK_TYPE) - + sizeof(NDIS_802_11_CONFIGURATION) - + sizeof(NDIS_802_11_NETWORK_INFRASTRUCTURE) - + sizeof(NDIS_802_11_RATES_EX) - /* all new member add here */ - + sizeof(WLAN_PHY_INFO) - /* all new member add here */ - + sizeof(ULONG) - + bss->IELength; - return t_len; -#else - return sizeof(WLAN_BSSID_EX) - MAX_IE_SZ + bss->IELength; -#endif -} - -struct wlan_network { - _list list; - int network_type; /* refer to ieee80211.h for WIRELESS_11A/B/G */ - int fixed; /* set to fixed when not to be removed as site-surveying */ - systime last_scanned; /* timestamp for the network */ -#ifdef CONFIG_RTW_MESH -#if CONFIG_RTW_MESH_ACNODE_PREVENT - systime acnode_stime; - systime acnode_notify_etime; -#endif -#endif - int aid; /* will only be valid when a BSS is joinned. */ - int join_res; - WLAN_BSSID_EX network; /* must be the last item */ -}; - -enum VRTL_CARRIER_SENSE { - DISABLE_VCS, - ENABLE_VCS, - AUTO_VCS -}; - -enum VCS_TYPE { - NONE_VCS, - RTS_CTS, - CTS_TO_SELF -}; - -#define PWR_CAM 0 -#define PWR_MINPS 1 -#define PWR_MAXPS 2 -#define PWR_UAPSD 3 -#define PWR_VOIP 4 - -enum UAPSD_MAX_SP { - NO_LIMIT, - TWO_MSDU, - FOUR_MSDU, - SIX_MSDU -}; - -/* john */ -#define NUM_PRE_AUTH_KEY 16 -#define NUM_PMKID_CACHE NUM_PRE_AUTH_KEY - -/* -* WPA2 -*/ - -#endif /* #ifndef WLAN_BSSDEF_H_ */ diff --git a/drivers/net/wireless/realtek/rtl8812au/os_dep/linux/wifi_regd.c b/drivers/net/wireless/realtek/rtl8812au/os_dep/linux/wifi_regd.c deleted file mode 100644 index 45c5bd1a940447..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/os_dep/linux/wifi_regd.c +++ /dev/null @@ -1,449 +0,0 @@ -/****************************************************************************** - * - * Copyright(c) 2009-2010 - 2017 Realtek Corporation. - * - * 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 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. - * - *****************************************************************************/ - -#include - -#ifdef CONFIG_IOCTL_CFG80211 - -#include - -static struct country_code_to_enum_rd allCountries[] = { - {COUNTRY_CODE_USER, "RD"}, -}; - -/* - * REG_RULE(freq start, freq end, bandwidth, max gain, eirp, reg_flags) - */ - -/* - *Only these channels all allow active - *scan on all world regulatory domains - */ - -/* 2G chan 01 - chan 11 */ -#define RTW_2GHZ_CH01_11 \ - REG_RULE(2412-10, 2462+10, 40, 0, 20, 0) - -/* - *We enable active scan on these a case - *by case basis by regulatory domain - */ - -/* 2G chan 12 - chan 13, PASSIV SCAN */ -#define RTW_2GHZ_CH12_13 \ - REG_RULE(2467-10, 2472+10, 40, 0, 20, \ - NL80211_RRF_PASSIVE_SCAN) - -/* 2G chan 14, PASSIVS SCAN, NO OFDM (B only) */ -#define RTW_2GHZ_CH14 \ - REG_RULE(2484-10, 2484+10, 40, 0, 20, \ - NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_OFDM) - -/* 5G chan 36 - chan 64 */ -#define RTW_5GHZ_5150_5350 \ - REG_RULE(5150-10, 5350+10, 80, 0, 30, \ - NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_IBSS) - -/* 5G chan 100 - chan 165 */ -#define RTW_5GHZ_5470_5850 \ - REG_RULE(5470-10, 5850+10, 80, 0, 30, \ - NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_IBSS) - -/* 5G chan 149 - chan 165 */ -#define RTW_5GHZ_5725_5850 \ - REG_RULE(5725-10, 5850+10, 80, 0, 30, \ - NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_IBSS) - -/* 5G chan 36 - chan 165 */ -#define RTW_5GHZ_5150_5850 \ - REG_RULE(5150-10, 5850+10, 80, 0, 30, \ - NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_IBSS) - -static const struct ieee80211_regdomain rtw_regdom_rd = { - .n_reg_rules = 4, - .alpha2 = "99", - .reg_rules = { - RTW_2GHZ_CH01_11, - RTW_2GHZ_CH12_13, - RTW_2GHZ_CH14, - RTW_5GHZ_5150_5850, - } -}; - -#if 0 -static const struct ieee80211_regdomain rtw_regdom_11 = { - .n_reg_rules = 1, - .alpha2 = "99", - .reg_rules = { - RTW_2GHZ_CH01_11, - RTW_2GHZ_CH12_13 - } -}; - -static const struct ieee80211_regdomain rtw_regdom_12_13 = { - .n_reg_rules = 2, - .alpha2 = "99", - .reg_rules = { - RTW_2GHZ_CH01_11, - RTW_2GHZ_CH12_13, - } -}; - -static const struct ieee80211_regdomain rtw_regdom_no_midband = { - .n_reg_rules = 3, - .alpha2 = "99", - .reg_rules = { - RTW_2GHZ_CH01_11, - RTW_5GHZ_5150_5350, - RTW_5GHZ_5725_5850, - } -}; - -static const struct ieee80211_regdomain rtw_regdom_60_64 = { - .n_reg_rules = 3, - .alpha2 = "99", - .reg_rules = { - RTW_2GHZ_CH01_11, - RTW_2GHZ_CH12_13, - RTW_5GHZ_5725_5850, - } -}; - -static const struct ieee80211_regdomain rtw_regdom_14_60_64 = { - .n_reg_rules = 4, - .alpha2 = "99", - .reg_rules = { - RTW_2GHZ_CH01_11, - RTW_2GHZ_CH12_13, - RTW_2GHZ_CH14, - RTW_5GHZ_5725_5850, - } -}; - -static const struct ieee80211_regdomain rtw_regdom_14 = { - .n_reg_rules = 3, - .alpha2 = "99", - .reg_rules = { - RTW_2GHZ_CH01_11, - RTW_2GHZ_CH12_13, - RTW_2GHZ_CH14, - } -}; - -#endif -#if 0 -static struct rtw_regulatory *rtw_regd; -#endif - -#if 0 /* not_yet */ -static void _rtw_reg_apply_beaconing_flags(struct wiphy *wiphy, - enum nl80211_reg_initiator initiator) -{ - enum nl80211_band band; - struct ieee80211_supported_band *sband; - const struct ieee80211_reg_rule *reg_rule; - struct ieee80211_channel *ch; - unsigned int i; - u32 bandwidth = 0; - int r; - - for (band = 0; band < NUM_NL80211_BANDS; band++) { - - if (!wiphy->bands[band]) - continue; - - sband = wiphy->bands[band]; - - for (i = 0; i < sband->n_channels; i++) { - ch = &sband->channels[i]; - if (rtw_is_dfs_ch(ch->hw_value) || - (ch->flags & IEEE80211_CHAN_RADAR)) - continue; - if (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE) { - r = freq_reg_info(wiphy, ch->center_freq, - bandwidth, ®_rule); - if (r) - continue; - - /* - *If 11d had a rule for this channel ensure - *we enable adhoc/beaconing if it allows us to - *use it. Note that we would have disabled it - *by applying our static world regdomain by - *default during init, prior to calling our - *regulatory_hint(). - */ - - if (!(reg_rule->flags & NL80211_RRF_NO_IBSS)) - ch->flags &= ~IEEE80211_CHAN_NO_IBSS; - if (! - (reg_rule->flags & - NL80211_RRF_PASSIVE_SCAN)) - ch->flags &= - ~IEEE80211_CHAN_PASSIVE_SCAN; - } else { - if (ch->beacon_found) - ch->flags &= ~(IEEE80211_CHAN_NO_IBSS | - IEEE80211_CHAN_PASSIVE_SCAN); - } - } - } -} - -/* Allows active scan scan on Ch 12 and 13 */ -static void _rtw_reg_apply_active_scan_flags(struct wiphy *wiphy, - enum nl80211_reg_initiator - initiator) -{ - struct ieee80211_supported_band *sband; - struct ieee80211_channel *ch; - const struct ieee80211_reg_rule *reg_rule; - u32 bandwidth = 0; - int r; - - if (!wiphy->bands[NL80211_BAND_2GHZ]) - return; - sband = wiphy->bands[NL80211_BAND_2GHZ]; - - /* - * If no country IE has been received always enable active scan - * on these channels. This is only done for specific regulatory SKUs - */ - if (initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE) { - ch = &sband->channels[11]; /* CH 12 */ - if (ch->flags & IEEE80211_CHAN_PASSIVE_SCAN) - ch->flags &= ~IEEE80211_CHAN_PASSIVE_SCAN; - ch = &sband->channels[12]; /* CH 13 */ - if (ch->flags & IEEE80211_CHAN_PASSIVE_SCAN) - ch->flags &= ~IEEE80211_CHAN_PASSIVE_SCAN; - return; - } - - /* - * If a country IE has been received check its rule for this - * channel first before enabling active scan. The passive scan - * would have been enforced by the initial processing of our - * custom regulatory domain. - */ - - ch = &sband->channels[11]; /* CH 12 */ - r = freq_reg_info(wiphy, ch->center_freq, bandwidth, ®_rule); - if (!r) { - if (!(reg_rule->flags & NL80211_RRF_PASSIVE_SCAN)) - if (ch->flags & IEEE80211_CHAN_PASSIVE_SCAN) - ch->flags &= ~IEEE80211_CHAN_PASSIVE_SCAN; - } - - ch = &sband->channels[12]; /* CH 13 */ - r = freq_reg_info(wiphy, ch->center_freq, bandwidth, ®_rule); - if (!r) { - if (!(reg_rule->flags & NL80211_RRF_PASSIVE_SCAN)) - if (ch->flags & IEEE80211_CHAN_PASSIVE_SCAN) - ch->flags &= ~IEEE80211_CHAN_PASSIVE_SCAN; - } -} -#endif - -void rtw_regd_apply_flags(struct wiphy *wiphy) -{ - struct dvobj_priv *dvobj = wiphy_to_dvobj(wiphy); - //struct rf_ctl_t *rfctl = dvobj_to_rfctl(dvobj); - //RT_CHANNEL_INFO *channel_set = rfctl->channel_set; - //u8 max_chan_nums = rfctl->max_chan_nums; - - struct ieee80211_supported_band *sband; - struct ieee80211_channel *ch; - unsigned int i, j; - u16 channel; - //u32 freq; - - /* all channels enable */ - for (i = 0; i < NUM_NL80211_BANDS; i++) { - sband = wiphy->bands[i]; - - if (sband) { - for (j = 0; j < sband->n_channels; j++) { - ch = &sband->channels[j]; - - if (ch) - ch->flags &= ~(IEEE80211_CHAN_DISABLED|IEEE80211_CHAN_NO_HT40PLUS| - IEEE80211_CHAN_NO_HT40MINUS|IEEE80211_CHAN_NO_80MHZ| - IEEE80211_CHAN_NO_160MHZ| -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0)) - IEEE80211_CHAN_NO_IBSS|IEEE80211_CHAN_PASSIVE_SCAN); -#else - IEEE80211_CHAN_NO_IR); -#endif - } - } - } - - /* channels apply by channel plans. */ - /* - for (i = 0; i < max_chan_nums; i++) { - channel = channel_set[i].ChannelNum; - freq = rtw_ch2freq(channel); - - ch = ieee80211_get_channel(wiphy, freq); - if (!ch) - continue; - - if (channel_set[i].ScanType == SCAN_PASSIVE - #if defined(CONFIG_DFS_MASTER) - && rtw_odm_dfs_domain_unknown(dvobj) - #endif - ) { - #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0)) - ch->flags = (IEEE80211_CHAN_NO_IBSS | IEEE80211_CHAN_PASSIVE_SCAN); - #else - ch->flags = IEEE80211_CHAN_NO_IR; - #endif - } else - ch->flags = 0; - - #ifdef CONFIG_DFS - if (rtw_is_dfs_ch(ch->hw_value) - #if defined(CONFIG_DFS_MASTER) - && rtw_odm_dfs_domain_unknown(dvobj) - #endif - ) { - ch->flags |= IEEE80211_CHAN_RADAR; - #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0)) - ch->flags |= (IEEE80211_CHAN_NO_IBSS | IEEE80211_CHAN_PASSIVE_SCAN); - #else - ch->flags |= IEEE80211_CHAN_NO_IR; - #endif - } - #endif CONFIG_DFS - } -*/ -} - -static const struct ieee80211_regdomain *_rtw_regdomain_select(struct - rtw_regulatory - *reg) -{ -#if 0 - switch (reg->country_code) { - case COUNTRY_CODE_USER: - default: - return &rtw_regdom_rd; - } -#else - return &rtw_regdom_rd; -#endif -} - -static void rtw_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request) -{ - switch (request->initiator) { - case NL80211_REGDOM_SET_BY_DRIVER: - RTW_INFO("%s: %s\n", __func__, "NL80211_REGDOM_SET_BY_DRIVER"); - break; - case NL80211_REGDOM_SET_BY_CORE: - RTW_INFO("%s: %s\n", __func__, "NL80211_REGDOM_SET_BY_CORE"); - break; - case NL80211_REGDOM_SET_BY_USER: - RTW_INFO("%s: %s alpha2:%c%c\n", __func__, "NL80211_REGDOM_SET_BY_USER" - , request->alpha2[0], request->alpha2[1]); - rtw_set_country(wiphy_to_adapter(wiphy), request->alpha2); - break; - case NL80211_REGDOM_SET_BY_COUNTRY_IE: - RTW_INFO("%s: %s\n", __func__, "NL80211_REGDOM_SET_BY_COUNTRY_IE"); - break; - } - - rtw_regd_apply_flags(wiphy); -} - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 9, 0)) -static int rtw_reg_notifier_return(struct wiphy *wiphy, struct regulatory_request *request) -{ - rtw_reg_notifier(wiphy, request); - return 0; -} -#endif - -static void _rtw_regd_init_wiphy(struct rtw_regulatory *reg, struct wiphy *wiphy) -{ - const struct ieee80211_regdomain *regd; - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 9, 0)) - wiphy->reg_notifier = rtw_reg_notifier_return; -#else - wiphy->reg_notifier = rtw_reg_notifier; -#endif - -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0)) - wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY; - wiphy->flags &= ~WIPHY_FLAG_STRICT_REGULATORY; - wiphy->flags &= ~WIPHY_FLAG_DISABLE_BEACON_HINTS; -#else - wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG; - wiphy->regulatory_flags &= ~REGULATORY_STRICT_REG; - wiphy->regulatory_flags &= ~REGULATORY_DISABLE_BEACON_HINTS; -#endif - -/* - * Ubuntu backported a specific upstream change to kernel 6.2 while others skipped 6.2 altogether. - * If build fails on kernel 6.2.x and you're not using Ubuntu, - * try changing the version "(6, 3, 0)" below to "(6, 2, 0)". - */ - -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(6, 1, 39)) \ - || (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 3, 0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(6, 3, 13)) \ - || (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(6, 4, 4)) - wiphy->regulatory_flags |= REGULATORY_IGNORE_STALE_KICKOFF; -#endif - - regd = _rtw_regdomain_select(reg); - wiphy_apply_custom_regulatory(wiphy, regd); - - rtw_regd_apply_flags(wiphy); -} - -static struct country_code_to_enum_rd *_rtw_regd_find_country(u16 countrycode) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(allCountries); i++) { - if (allCountries[i].countrycode == countrycode) - return &allCountries[i]; - } - return NULL; -} - -int rtw_regd_init(struct wiphy *wiphy) -{ -#if 0 - if (rtw_regd == NULL) { - rtw_regd = (struct rtw_regulatory *) - rtw_malloc(sizeof(struct rtw_regulatory)); - - rtw_regd->alpha2[0] = '9'; - rtw_regd->alpha2[1] = '9'; - - rtw_regd->country_code = COUNTRY_CODE_USER; - } - - RTW_INFO("%s: Country alpha2 being used: %c%c\n", - __func__, rtw_regd->alpha2[0], rtw_regd->alpha2[1]); -#endif - - _rtw_regd_init_wiphy(NULL, wiphy); - - return 0; -} -#endif /* CONFIG_IOCTL_CFG80211 */ diff --git a/drivers/net/wireless/realtek/rtl8812au/tools/RtkMpTool-ReadMe.txt b/drivers/net/wireless/realtek/rtl8812au/tools/RtkMpTool-ReadMe.txt deleted file mode 100644 index 82516dcd414d79..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/tools/RtkMpTool-ReadMe.txt +++ /dev/null @@ -1,18 +0,0 @@ -RtkMpTool.apk need to use "rtwpriv", -please frist to prepare build the rtwpriv and push to Android system. - -Installation steps: -1. adb push rtwpriv /system/bin/ -2. adb shell chmod 755 /system/bin/rtwpriv -3. adb push 8xxx.ko "your system wlan default module's folder"\wlan.ko (etc. /system/lib/modules/wlan.ko) -4. adb install RtkMpTool.apk -or adb install RtkWiFiTest.apk -5. a.After execute the MP tool.Frist to use the "adb shell rtwpriv wlan0 mp_start" to check this driver can support mp command. - b.The "mp_start" command must to be no show any error message. - -P.S. -1. RtkMpTool.apk only supports the MP test functions. -After installed, you will see a "Realtek MP Tool" App on the phone. - -2. RtkWiFiTest.apk supports both MP test and CTA test functions. -After installed, you will see a "WiFi Test" App on the phone. diff --git a/drivers/net/wireless/realtek/rtl8812au/tools/RtkMpTool.apk b/drivers/net/wireless/realtek/rtl8812au/tools/RtkMpTool.apk deleted file mode 100644 index c99b47a83407f4..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/tools/RtkMpTool.apk and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/tools/WiFi_Direct_User_Interface/Android.mk b/drivers/net/wireless/realtek/rtl8812au/tools/WiFi_Direct_User_Interface/Android.mk deleted file mode 100644 index 7823c1402e4576..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/tools/WiFi_Direct_User_Interface/Android.mk +++ /dev/null @@ -1,11 +0,0 @@ -ifneq ($(TARGET_SIMULATOR),true) -LOCAL_PATH:= $(call my-dir) - -include $(CLEAR_VARS) -LOCAL_SRC_FILES += p2p_api_test_linux.c p2p_ui_test_linux.c -LOCAL_SHARED_LIBRARIES := libc libcutils -LOCAL_MODULE = P2P_UI -LOCAL_MODULE_TAGS := optional -include $(BUILD_EXECUTABLE) - -endif diff --git a/drivers/net/wireless/realtek/rtl8812au/tools/WiFi_Direct_User_Interface/Start_Guide_P2P_User_Interface_Linux.pdf b/drivers/net/wireless/realtek/rtl8812au/tools/WiFi_Direct_User_Interface/Start_Guide_P2P_User_Interface_Linux.pdf deleted file mode 100644 index 299064fa2b67d7..00000000000000 Binary files a/drivers/net/wireless/realtek/rtl8812au/tools/WiFi_Direct_User_Interface/Start_Guide_P2P_User_Interface_Linux.pdf and /dev/null differ diff --git a/drivers/net/wireless/realtek/rtl8812au/tools/WiFi_Direct_User_Interface/install.sh b/drivers/net/wireless/realtek/rtl8812au/tools/WiFi_Direct_User_Interface/install.sh deleted file mode 100755 index 519b8fc69a8185..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/tools/WiFi_Direct_User_Interface/install.sh +++ /dev/null @@ -1,100 +0,0 @@ - -wpa_supplicant_hostapd=`ls -1 ../wpa_supplicant_hostapd/wpa_supplicant_hostapd-0.8_*` -echo $wpa_supplicant_hostapd - - -if [ -e $wpa_supplicant_hostapd ]; then - echo "Checking wpa_supplicant_hostatpd" -else - echo "wpa_supplicant_hostapd doesn'tt exist in corresponding folder" - exit -fi - -if [ -e ../wpa_supplicant_hostapd/p2p_hostapd.conf ]; then - echo "Checking p2p_hostapd.conf" -else - echo "p2p_hostapd.conf doesn't exist in corresponding folder" - exit -fi - -if [ -e ../wpa_supplicant_hostapd/wpa_0_8.conf ]; then - echo "Checking wpa_0_8.conf" -else - echo "wpa_0_8.conf doesn't exist in corresponding folder" - exit -fi - -#cp ../wpa_supplicant_hostapd/wpa_supplicant_hostapd-0.8_rtw_20111118.zip ./ -cp $wpa_supplicant_hostapd ./ -wpa_supplicant_hostapd=`ls -1 ./wpa_supplicant_hostapd-0.8_*` -echo " "$wpa_supplicant_hostapd -unzip $wpa_supplicant_hostapd - -cd wpa_supplicant_hostapd-0.8 -cd wpa_supplicant -make clean all - -cd .. -cd hostapd -make clean all - -cd .. -cd .. - -cp ../wpa_supplicant_hostapd/p2p_hostapd.conf ./ -cp ../wpa_supplicant_hostapd/wpa_0_8.conf ./ -cp ./wpa_supplicant_hostapd-0.8/hostapd/hostapd ./ -cp ./wpa_supplicant_hostapd-0.8/hostapd/hostapd_cli ./ -cp ./wpa_supplicant_hostapd-0.8/wpa_supplicant/wpa_supplicant ./ -cp ./wpa_supplicant_hostapd-0.8/wpa_supplicant/wpa_cli ./ - -rm -rf wpa_supplicant_hostapd-0.8 -rm -rf $wpa_supplicant_hostapd - -gcc -o P2P_UI ./p2p_api_test_linux.c ./p2p_ui_test_linux.c -lpthread - -if [ ! -e ./p2p_hostapd.conf ]; then - echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" - echo "Doesn't have p2p_hostapd.conf" - result="fail" -fi - -if [ ! -e ./wpa_0_8.conf ]; then - echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" - echo "Doesn't have wpa_0_8.conf" - result="fail" -fi - -if [ ! -e ./hostapd ]; then - echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" - echo "Doesn't have hostapd" - result="fail" -fi - -if [ ! -e ./wpa_supplicant ]; then - echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" - echo "Doesn't have hostapd_cli" - result="fail" -fi - -if [ ! -e ./wpa_cli ]; then - echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" - echo "Doesn't have p2p_hostapd.conf" - result="fail" -fi - -if [ ! -e ./P2P_UI ]; then - echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" - echo "Doesn't have P2P_UI" - result="fail" -fi - -if [ "$result" == "fail" ]; then - echo "WiFi_Direct_User_Interface install unsuccessful" - echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" - exit -fi - -echo "##################################################" -echo "WiFi_Direct_User_Interface install complete!!!!!!!" -echo "##################################################" diff --git a/drivers/net/wireless/realtek/rtl8812au/tools/WiFi_Direct_User_Interface/p2p_api_test_linux.c b/drivers/net/wireless/realtek/rtl8812au/tools/WiFi_Direct_User_Interface/p2p_api_test_linux.c deleted file mode 100644 index 4c49b64631b84b..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/tools/WiFi_Direct_User_Interface/p2p_api_test_linux.c +++ /dev/null @@ -1,1377 +0,0 @@ - -#include "p2p_test.h" - -unsigned int wps_pin_checksum(unsigned int pin) -{ - unsigned int accum = 0; - while( pin ) - { - accum += pin % 10; - pin /= 10; - accum += 3 * (pin % 10); - pin /= 10; - } - return( accum % 10 ); -} - -char lower(char s) -{ - if(('A' <= s) && (s <= 'Z')) - return ( s = 'a' + (s - 'A') ); - return s; -} - -int p2p_check_success(struct p2p *p) -{ - int ret = 0; - - if( p->status == P2P_STATE_GONEGO_OK ) - ret = 1; - - return ret; -} - -int read_all_sta(struct p2p *p) -{ - int sta_count = 0; - FILE *pf; - - memset( p->cmd, 0x00, CMD_SZ ); - sprintf( p->cmd, "%s all_sta > supp_status.txt", p->apcli_path); - system( p->cmd ); - pf = fopen( "./supp_status.txt", "r" ); - if ( pf ) - { - while( !feof( pf ) ){ - memset( p->parse, 0x00, CMD_SZ ); - fgets( p->parse, CMD_SZ, pf ); - if( strncmp( p->parse, "dot11RSNAStatsSTAAddress=", 25) == 0 ) - { - sta_count++; - if( p->no_sta_connected == sta_count ) - return _TRUE; - } - } - - fclose( pf ); - } - - return _FALSE; -} - -void do_wps(struct p2p *p) -{ - FILE *pf = NULL; - int ret = _FALSE, parsing_ok = _FALSE; - - do - { - memset( p->cmd, 0x00, CMD_SZ ); - if( p->ap_open == _TRUE ) - { - if(p->wps_info==1 || p->wps_info==2) - sprintf( p->cmd, "%s wps_pin any %d > supp_status.txt", p->apcli_path, p->pin); - else if(p->wps_info==3) - sprintf( p->cmd, "%s wps_pbc any > supp_status.txt", p->apcli_path); - } - else if(p->wpa_open == _TRUE) - { - if(p->connect_go==1) - { - if(p->wps_info==1 || p->wps_info==2) - sprintf( p->cmd, "%s wps_pin %s %d > supp_status.txt ", p->wpacli_path, p->peer_devaddr, p->pin); - else if(p->wps_info==3) - sprintf( p->cmd, "%s wps_pbc %s > supp_status.txt ", p->wpacli_path, p->peer_devaddr); - } - else if( strncmp(p->peer_ifaddr, "00:00:00:00:00:00", 17)==0 ) - { - if(p->wps_info==1 || p->wps_info==2) - sprintf( p->cmd, "%s wps_pin any %d > supp_status.txt ", p->wpacli_path, p->pin); - else if(p->wps_info==3) - sprintf( p->cmd, "%s wps_pbc any > supp_status.txt ", p->wpacli_path); - } - else - { - if(p->wps_info==1 || p->wps_info==2) - sprintf( p->cmd, "%s wps_pin %s %d > supp_status.txt ", p->wpacli_path, p->peer_ifaddr, p->pin); - else if(p->wps_info==3) - sprintf( p->cmd, "%s wps_pbc %s > supp_status.txt ", p->wpacli_path, p->peer_ifaddr); - } - } - system( p->cmd ); - - pf = fopen( "./supp_status.txt", "r" ); - if ( pf ) - { - while( !feof( pf ) ){ - memset(p->parse, 0x00, CMD_SZ); - fgets(p->parse, CMD_SZ, pf); - - if(p->ap_open == _TRUE) - { - if( (p->wps_info==1 || p->wps_info==2) && (strncmp(p->parse, "", 2) == 0) ) - parsing_ok = _TRUE; - else if( (p->wps_info==3) && (strncmp(p->parse, "OK", 2) == 0) ) - parsing_ok = _TRUE; - } - else if(p->wpa_open == _TRUE) - { - if( (p->wps_info==1 || p->wps_info==2) && (strncmp(p->parse, "Selected", 8) == 0) ) - parsing_ok = _TRUE; - else if( (p->wps_info==3) && (strncmp(p->parse, "OK", 2) == 0) ) - parsing_ok = _TRUE; - } - - if( parsing_ok == _TRUE ) - { - ret = _TRUE; - p->wpsing = _TRUE; - } - } - - fclose( pf ); - } - - if( ret == 0 ) - usleep( HOSTAPD_INIT_TIME ); - } - while( ret == 0 ); -} - -void p2p_enable(struct p2p *p) -{ - p->have_p2p_dev = 0; - p->connect_go = 0; - - if(p->enable == -1 ) - { - if(p->wpa_open == _TRUE){ - p->wpa_open = _FALSE; - system("killall wpa_supplicant"); -#ifdef DHCP - system("killall dhclient"); -#endif - } - if(p->ap_open == _TRUE){ - p->ap_open = _FALSE; - system("killall hostapd"); -#ifdef DHCP - system("killall dhcpd"); -#endif - } - - memset( p->cmd, 0x00, CMD_SZ ); - sprintf( p->cmd, "iwpriv %s p2p_set enable=0", p->ifname); - system( p->cmd ); - - return; - } - - p->p2p_get=0; - memset( p->cmd, 0x00, CMD_SZ ); - sprintf( p->cmd, "iwpriv %s p2p_set enable=%d", p->ifname, p->enable); - system( p->cmd ); - - if( p->enable == P2P_ROLE_DISABLE ) - { - p->wps_info = 0; - p->pin = 12345670; - - p2p_status(p, 0); - p2p_role(p, 0); - - if(p->res == 0) - { - p->res = 1; - } - - if(p->res_go == 0) - { - p->res_go = 1; - } - - p->wpa_open = _FALSE; - system("killall wpa_supplicant"); -#ifdef DHCP - system("killall dhclient"); -#endif - system("clear"); - p->ap_open = _FALSE; - system("killall hostapd"); -#ifdef DHCP - system("killall dhcpd"); -#endif - system("clear"); - - } - else if( p->enable == P2P_ROLE_DEVICE ) - { - char msg[5] = "NULL"; - -#ifdef P2P_AUTO - p->res = pthread_create(&p->pthread, NULL, &polling_status, (void *)p); -#endif - - if( p->res !=0 ) - { - p->p2p_get=1; - memset( p->print_line, 0x00, CMD_SZ ); - sprintf( p->print_line, "Thread creation failed" ); - } - - if(p->wpa_open == _TRUE){ - p->wpa_open = _FALSE; - system("killall wpa_supplicant"); -#ifdef DHCP - system("killall dhclient"); -#endif - } - if(p->ap_open == _TRUE){ - p->ap_open = _FALSE; - system("killall hostapd"); -#ifdef DHCP - system("killall dhcpd"); -#endif - } - - p->intent = 1; - p2p_intent(p); - - p2p_set_opch(p, NULL, 0); - usleep(50000); - p2p_softap_ssid(p, NULL, 0); - - p2p_setDN(p); - p2p_role(p, 0); - - p2p_scan(p); - - } - else if( p->enable == P2P_ROLE_CLIENT ) - { - if(p->ap_open == _TRUE){ - p->ap_open = _FALSE; - system("killall hostapd"); -#ifdef DHCP - system("killall dhcpd"); -#endif - } - - p2p_status(p, 0); - p2p_role(p, 0); - p2p_intent(p); - } - else if( p->enable == P2P_ROLE_GO ) - { - if(p->wpa_open == _TRUE){ - p->wpa_open = _FALSE; - system("killall wpa_supplicant"); -#ifdef DHCP - system("killall dhclient"); -#endif - } - - p2p_status(p, 0); - p2p_role(p, 0); - p2p_intent(p); - - p2p_set_opch(p, NULL, 0); - usleep(50000); - p2p_softap_ssid(p, NULL, 0); - - p2p_setDN(p); - - if(p->ap_open != _TRUE) - { - memset( p->cmd, 0x00, CMD_SZ ); - sprintf( p->cmd, "%s -B %s > temp.txt",p->ap_path, p->ap_conf); - system( p->cmd ); - - p->ap_open = _TRUE; - } - -#ifdef P2P_AUTO - p->res_go = pthread_create(&p->pthread_go, NULL, &polling_client, (void *)p); -#endif - - if( p->res_go != 0 ) - { - p->p2p_get=1; - memset( p->print_line, 0x00, CMD_SZ ); - sprintf( p->print_line, "Thread creation failed" ); - } - - } - -} - -void p2p_scan(struct p2p *p) -{ - p->p2p_get=0; - if( p->enable >= P2P_ROLE_DEVICE ) - { - p->have_p2p_dev=1; - memset( p->cmd, 0x00, CMD_SZ ); - sprintf( p->cmd, "iwlist %s scan > scan.txt", p->ifname ); - system( p->cmd ); - - p2p_status(p, 0); - - } - else - { - p->p2p_get=1; - memset( p->print_line, 0x00, CMD_SZ ); - sprintf( p->print_line, "%s", p->scan_msg ); - } -} - -void scan_result(struct p2p *p) -{ - FILE *pf=NULL; - int no_dev=0; - char cms[30] = { 0x00 }; - char dns[SSID_SZ] = { 0x00 }; - char parse[100] = { 0x00 }; - struct scan *pscan_pool; - - pf = fopen( "./scan.txt", "r" ); - if ( pf ) - { - p->count_line=0; - while( (!feof( pf )) && (no_dev < SCAN_POOL_NO)) - { - memset( parse, 0x00, CMD_SZ ); - fgets( parse, CMD_SZ, pf ); - - if(parse[0] == '\n' || parse[0] == '\0') - break; - if( strncmp(parse+10, "Scan completed :", 16) == 0 ) - { - printf("* NO DEVICE NAME BSSID GO CONFIG METHOD *\n"); - p->count_line++; - } - else if( strncmp(parse+20, "Address:", 8) == 0 ) - { - pscan_pool = &p->scan_pool[no_dev]; - memset( pscan_pool->addr, 0x00, sizeof(struct scan) ); - strncpy( pscan_pool->addr, parse+29, 17); - } - else if( strncmp(parse+20, "ESSID:", 6) == 0 ) - { - pscan_pool = &p->scan_pool[no_dev]; - - p2p_wps_cm(p, pscan_pool->addr, cms); - p2p_device_name(p, pscan_pool->addr, dns); - - if( strncmp(parse+26, "\"DIRECT-\"", 9) == 0 ) - { - printf("*[%02d] %-25s %s %-38s*\n",no_dev+1, dns, pscan_pool->addr, cms); - } - else - { - printf("*[%02d] %-25s %s * %-38s*\n",no_dev+1, dns, pscan_pool->addr, cms); - pscan_pool->go = 1; - } - p->count_line++; - no_dev++; - - } - } - - if( p->count_line < (SCAN_POOL_NO + 1) ) - { - for(p->count_line; p->count_line < SCAN_POOL_NO+1; p->count_line++ ) - printf("* *\n"); - } - fclose( pf ); - } - -} - -void p2p_setDN(struct p2p *p) -{ - - memset( p->cmd, 0x00, CMD_SZ ); - sprintf( p->cmd, "iwpriv %s p2p_set setDN=%s", p->ifname, p->dev_name); - system( p->cmd ); -} - -void p2p_intent(struct p2p *p) -{ - p->p2p_get=0; - memset( p->cmd, 0x00, CMD_SZ ); - sprintf( p->cmd, "iwpriv %s p2p_set intent=%d", p->ifname, p->intent); - system( p->cmd ); -} - -void p2p_wpsinfo(struct p2p *p) -{ - p->p2p_get=0; - memset( p->cmd, 0x00, CMD_SZ ); - sprintf( p->cmd, "iwpriv %s p2p_set got_wpsinfo=%d", p->ifname, p->wps_info); - system( p->cmd ); -} - -void p2p_pincode(struct p2p *p, char *ins_no, char *ins_no_again) -{ - int pin_check=0; - p->p2p_get=0; - p->show_scan_result = 1; - ui_screen(p); - printf("%s", ins_no); - scanf("%d",&pin_check); - while( wps_pin_checksum(pin_check) != 0 ) - { - p->show_scan_result = 1; - ui_screen(p); - printf("%s", ins_no_again); - scanf("%d",&pin_check); - } - p->pin = pin_check; -} - -void p2p_devaddr(struct p2p *p) -{ - int c; - struct scan *pscan_pool; - - p->p2p_get=0; - - scanf("%d", &c); - pscan_pool = &p->scan_pool[c-1]; - strncpy(p->peer_devaddr, pscan_pool->addr, 17); - - if( pscan_pool->go == 1) - p->connect_go = 1; -} - -void p2p_role(struct p2p *p, int flag) -{ - FILE *pf=NULL; - - memset( p->cmd, 0x00, CMD_SZ ); - sprintf( p->cmd, "iwpriv %s p2p_get role > status.txt", p->ifname); - system( p->cmd ); - - pf = fopen( "./status.txt", "r" ); - if ( pf ) - { - while( !feof( pf ) ){ - memset( p->parse, 0x00, CMD_SZ ); - fgets( p->parse, CMD_SZ, pf ); - if( strncmp( p->parse, "Role", 4) == 0 ) - { - p->role = atoi( &p->parse[ 5 ] ); - if(flag==1){ - p->p2p_get=1; - sprintf( p->print_line, "Role=%s", naming_role(p->role)); - } - break; - } - } - fclose( pf ); - } -} - -void p2p_status(struct p2p *p, int flag) -{ - FILE *pf=NULL; - - memset( p->cmd, 0x00, CMD_SZ ); - sprintf( p->cmd, "iwpriv %s p2p_get status > status.txt", p->ifname); - system( p->cmd ); - - pf = fopen( "./status.txt", "r" ); - if ( pf ) - { - while( !feof( pf ) ){ - memset( p->parse, 0x00, CMD_SZ ); - fgets( p->parse, CMD_SZ, pf ); - if( strncmp( p->parse, "Status", 6) == 0 ) - { - p->status = atoi( &p->parse[ 7 ] ); - if(flag==1){ - p->p2p_get=1; - sprintf( p->print_line, "Status=%s", naming_status(p->status)); - } - break; - } - } - fclose( pf ); - } -} - -void change_hostapd_op_ch(struct p2p *p, int op_ch) -{ - FILE *pfin = NULL; - FILE *pfout = NULL; - char parse[CMD_SZ] = { 0x00 }; - char cmd[CMD_SZ] = { 0x00 }; - - pfin = fopen( p->ap_conf, "r" ); - pfout = fopen( "./p2p_hostapd_temp.conf", "w" ); - - if( pfin && pfout ) - { - while( !feof( pfin ) ){ - memset( parse, 0x00, CMD_SZ ); - fgets( parse, CMD_SZ, pfin ); - - if(strncmp(parse, "channel=", 8) == 0) - { - memset(parse, 0x00, CMD_SZ); - sprintf( parse, "channel=%d\n", op_ch ); - fputs( parse, pfout ); - } - else - fputs(parse, pfout); - } - } - else - { - return; - } - - if( pfin != NULL ) - fclose( pfin ); - if( pfout != NULL ) - fclose( pfout ); - - memset( cmd, 0x00, CMD_SZ); - sprintf( cmd, "rm -rf %s", p->ap_conf ); - system( cmd ); - memset( cmd, 0x00, CMD_SZ); - sprintf( cmd, "mv ./p2p_hostapd_temp.conf %s", p->ap_conf ); - system( cmd ); - - return; -} - -void p2p_get_opch(struct p2p *p) -{ - FILE *pf=NULL; - int peer_op_ch = 0; - - memset( p->cmd, 0x00, CMD_SZ ); - sprintf( p->cmd, "iwpriv %s p2p_get op_ch > cm.txt", p->ifname); - system( p->cmd ); - - pf = fopen( "./cm.txt", "r" ); - if ( pf ) - { - while( !feof( pf ) ){ - memset( p->parse, 0x00, CMD_SZ ); - fgets( p->parse, CMD_SZ, pf ); - if( strncmp( p->parse, "Op_ch", 5) == 0 ) - { - peer_op_ch = atoi( &p->parse[ 6 ] ); - if( peer_op_ch != p->op_ch ) - { - change_hostapd_op_ch( p, peer_op_ch ); - } - break; - } - } - fclose( pf ); - } -} - -void p2p_prov_disc_no_addr(struct p2p *p, char *msg) -{ - p->p2p_get=1; - memset( p->print_line, 0x00, CMD_SZ ); - sprintf( p->print_line, "%s", msg); -} - -#ifdef P2P_AUTO -void p2p_prov_disc(struct p2p *p, char *msg, char *dis_msg, char *label_msg) -{ - int wps_cm, retry_count=0; - char prov[100] = { 0x00 }; - - p->p2p_get=0; - p->show_scan_result = 1; - ui_screen(p); - printf("%s", msg); - scanf("%d",&wps_cm); - - if(p->res == 0) - { - p->res = 1; - } - - memset( p->cmd, 0x00, CMD_SZ ); - if( wps_cm == 0 ) - sprintf( p->cmd, "iwpriv %s p2p_set prov_disc=%s_display", p->ifname, p->peer_devaddr); - else if( wps_cm == 1 ) - sprintf( p->cmd, "iwpriv %s p2p_set prov_disc=%s_keypad", p->ifname, p->peer_devaddr); - else if( wps_cm == 2 ) - sprintf( p->cmd, "iwpriv %s p2p_set prov_disc=%s_pbc", p->ifname, p->peer_devaddr); - else if( wps_cm == 3 ) - sprintf( p->cmd, "iwpriv %s p2p_set prov_disc=%s_label", p->ifname, p->peer_devaddr); - system( p->cmd ); - strcpy( prov, p->cmd ); - - usleep(500000); - p2p_status( p, 0 ); - - while( p->status != P2P_STATE_RX_PROVISION_DIS_RSP && retry_count < MAX_PROV_RETRY) - { - usleep( PROV_WAIT_TIME ); - retry_count++; - p2p_status( p, 0 ); - if( (retry_count % PROV_RETRY_INTERVAL) == 0) - system( prov ); - } - - if( p->status == P2P_STATE_RX_PROVISION_DIS_RSP ) - { - switch(wps_cm) - { - case 0: p->wps_info=1; break; - case 1: p->wps_info=2; break; - case 2: p->wps_info=3; break; - case 3: p->wps_info=1; break; - } - - if( wps_cm==1 || wps_cm==2 ) - { - p2p_wpsinfo(p); - - if(p->connect_go == 1) - p2p_client_mode(p); - else - p2p_set_nego(p); - } - else if( wps_cm==0 || wps_cm==3 ) - { - ui_screen(p); - if( wps_cm ==0 ) - printf("%s", dis_msg); - else if( wps_cm == 3 ) - printf("%s", label_msg); - scanf("%d",&p->pin); - - p2p_wpsinfo(p); - - if(p->connect_go == 1) - p2p_client_mode(p); - else - p2p_set_nego(p); - - } - } - else - { - p->p2p_get = 1; - memset( p->print_line, 0x00, CMD_SZ ); - sprintf( p->print_line, "Issue provision discovery fail" ); - ui_screen(p); - -#ifdef P2P_AUTO - pthread_create(&p->pthread, NULL, &polling_status, (void *)p); -#endif - - } - -} -#else - -// This mode is without the following procedures: -// 1.set config method -// 2.start group negotiation -// 3.start wpa_supplicant or hostapd -void p2p_prov_disc(struct p2p *p, char *msg, char *dis_msg, char *label_msg) -{ - int wps_cm; - p->p2p_get=0; - p->show_scan_result = 1; - ui_screen(p); - printf("%s", msg); - scanf("%d",&wps_cm); - memset( p->cmd, 0x00, CMD_SZ ); - - - if( wps_cm == 0 ) - sprintf( p->cmd, "iwpriv %s p2p_set prov_disc=%s_display", p->ifname, p->peer_devaddr); - else if( wps_cm == 1 ) - sprintf( p->cmd, "iwpriv %s p2p_set prov_disc=%s_keypad", p->ifname, p->peer_devaddr); - else if( wps_cm == 2 ) - sprintf( p->cmd, "iwpriv %s p2p_set prov_disc=%s_pbc", p->ifname, p->peer_devaddr); - else if( wps_cm == 3 ) - sprintf( p->cmd, "iwpriv %s p2p_set prov_disc=%s_label", p->ifname, p->peer_devaddr); - system( p->cmd ); - -} -#endif - -void p2p_set_nego(struct p2p *p) -{ - FILE *pf=NULL; - int retry_count = 0, success = 0; - int retry = NEGO_RETRY_INTERVAL, query = NEGO_QUERY_INTERVAL; - - p->p2p_get=1; - memset( p->print_line, 0x00, CMD_SZ ); - strcpy( p->print_line, p->nego_msg); - ui_screen(p); - - memset( p->cmd, 0x00, CMD_SZ ); - sprintf( p->cmd, "iwpriv %s p2p_set nego=%s ", p->ifname, p->peer_devaddr); - system( p->cmd ); - - usleep( PRE_NEGO_INTERVAL ); - - p2p_status(p, 0); - - while( !p2p_check_success(p) && (retry_count < 120 / NEGO_QUERY_INTERVAL )) - { - retry_count++; - - if( (retry_count % ( retry / query ) )==0 ) - { - memset( p->cmd, 0x00, CMD_SZ ); - sprintf( p->cmd, "iwpriv %s p2p_set nego=%s ", p->ifname, p->peer_devaddr); - system( p->cmd ); - - usleep( NEGO_QUERY_INTERVAL ); - p2p_status(p, 1); - } - else - { - ui_screen(p); - usleep( NEGO_QUERY_INTERVAL ); - p2p_status(p, 1); - } - } - - if( p2p_check_success(p) ) - { - p2p_role(p ,0); - p->p2p_get = 1; - memset( p->print_line, 0x00, CMD_SZ ); - sprintf( p->print_line, "%s", p->ok_msg ); - p2p_ifaddr(p); - ui_screen(p); - - if( p->role == P2P_ROLE_CLIENT ) - { - p2p_client_mode(p); - } - else if( p->role == P2P_ROLE_GO ) - { - p2p_get_opch(p); - p2p_go_mode(p); - } - } - else - { - p->p2p_get = 1; - p2p_status(p, 0); - memset( p->print_line, 0x00, CMD_SZ ); - sprintf( p->print_line, "Status= %d, %s", p->status, p->fail_msg ); - ui_screen(p); - -#ifdef P2P_ATUO - pthread_create(&p->pthread, NULL, &polling_status, (void *)p); -#endif - - } -} - -//After negotiation success, get peer device's interface address. -void p2p_ifaddr(struct p2p *p) -{ - FILE *pf=NULL; - char addr_12[12] = { 0x00 }; - int i; - - /* peer_ifaddr */ - memset( p->cmd, 0x00, CMD_SZ ); - sprintf( p->cmd, "iwpriv %s p2p_get peer_ifa > status.txt", p->ifname); - system( p->cmd ); - - pf = fopen( "./status.txt", "r" ); - if ( pf ) - { - while( !feof( pf ) ){ - memset( p->parse, 0x00, CMD_SZ ); - fgets( p->parse, CMD_SZ, pf ); - if( strncmp( p->parse, "MAC", 3) == 0 ) - { - strncpy( p->peer_ifaddr, p->parse+4, 17 ); - break; - } - } - fclose( pf ); - } - -} - -void p2p_client_mode(struct p2p *p) -{ - FILE *pf = NULL; - int count = 0, ret = 0; - int inactive_count = 0, inactive_restart = 0; - - if(p->wpa_open==_TRUE) - return; - else - p->wpa_open = _TRUE; - - p2p_ifaddr(p); - - memset( p->cmd, 0x00, CMD_SZ ); - sprintf( p->cmd, "%s -i %s -c %s -B ",p->wpa_path, p->ifname, p->wpa_conf); - system( p->cmd ); - - p->p2p_get=1; - memset( p->print_line, 0x00, CMD_SZ ); - strcpy( p->print_line, "Start wpa_supplicant"); - ui_screen(p); - - usleep( SUPPLICANT_INIT_TIME ); - - do_wps(p); - - usleep( SUPPLICANT_INTERVAL ); - - while( count < WPS_RETRY ) //query status - { - - memset( p->cmd, 0x00, CMD_SZ ); - sprintf( p->cmd, "%s status > supp_status.txt", p->wpacli_path); - system( p->cmd ); - - pf = fopen( "./supp_status.txt", "r" ); - if ( pf ) - { - while( !feof( pf ) ){ - memset( p->parse, 0x00, CMD_SZ ); - fgets( p->parse, CMD_SZ, pf ); - if( strncmp( p->parse, "wpa_state=", 10) == 0 ) - { - int i; - if( strncmp( p->parse, "wpa_state=COMPLETED", 19) == 0 ){ - count = WPS_RETRY; - p->wpsing = _FALSE; -#ifdef DHCP - memset( p->cmd, 0x00, CMD_SZ ); - sprintf( p->cmd, "dhclient %s", p->ifname); - system( p->cmd ); -#endif //DHCP - } - else if( strncmp( p->parse, "wpa_state=INACTIVE", 18) == 0 ){ - inactive_count++; - if( (inactive_count % 5)== 0) - { - if( p->wps_info == 2 ) - { - memset( p->cmd, 0x00, CMD_SZ ); - sprintf( p->cmd, "%s wps_pin %s %d > supp_status.txt ", p->wpacli_path, p->peer_ifaddr, p->pin); - system( p->cmd ); - - inactive_restart = 1; - } - } - } - - if( inactive_restart == 1 ) - { - inactive_restart = 0; - p->p2p_get=1; - memset(p->print_line, 0x00, CMD_SZ); - sprintf(p->print_line, "Restart WPS"); - ui_screen(p); - } - else - { - p->p2p_get=1; - memset(p->print_line, 0x00, CMD_SZ); - for(i=0; iparse[i] == '\n'){ - p->parse[i] = ' '; - } - } - sprintf(p->print_line, "%s", p->parse); - ui_screen(p); - } - - break; - } - } - - fclose( pf ); - } - - count++; - usleep( SUPPLICANT_INTERVAL ); - - } - - p->wpsing = _FALSE; -} - -void p2p_go_mode(struct p2p *p) -{ - int count = 0, i = -1; - char addr_lower[18]; - - p2p_ifaddr(p); - p->no_sta_connected++; - - p->p2p_get=1; - memset( p->print_line, 0x00, CMD_SZ ); - strcpy( p->print_line, "Start hostapd"); - ui_screen(p); - - if(p->ap_open != _TRUE) - { - memset( p->cmd, 0x00, CMD_SZ ); - sprintf( p->cmd, "%s -B %s > temp.txt",p->ap_path, p->ap_conf); - system( p->cmd ); - - usleep( HOSTAPD_INIT_TIME ); - p->ap_open = _TRUE; - } - - do_wps(p); - - usleep( HOSTAPD_INTERVAL ); - - - while( count < WPS_RETRY ) //query status - { - if( read_all_sta(p) == _TRUE ) - { - count = WPS_RETRY; - p->wpsing = _FALSE; - - p->p2p_get=1; - memset(p->print_line, 0x00, CMD_SZ); - for(i=0; iparse[i] == '\n'){ - p->parse[i] = ' '; - } - } - sprintf(p->print_line, "%s", p->parse); - ui_screen(p); -#ifdef DHCP - memset( p->cmd, 0x00, CMD_SZ ); - sprintf( p->cmd, "ifconfig %s 192.168.1.254", p->ifname); - system( p->cmd ); - - usleep(50000); - - system( "/etc/rc.d/init.d/dhcpd start" ); - system( "clear" ); -#endif //DHCP - - //After starting hostapd and doing WPS connection successful, - //We create a thread to query driver if some other p2p devices connected. - p2p_status(p, 0); - usleep(50000); - -#ifdef P2P_AUTO - p->res_go = pthread_create(&p->pthread_go, NULL, &polling_client, (void *)p); - - if( p->res_go != 0 ) - { - p->p2p_get=1; - memset( p->print_line, 0x00, CMD_SZ ); - sprintf( p->print_line, "Thread creation failed" ); - } -#endif - break; - } - else - { - if( count == WPS_RETRY) - break; - - count++; - usleep( HOSTAPD_INTERVAL ); - - p->p2p_get=1; - memset( p->print_line, 0x00, CMD_SZ ); - sprintf( p->print_line, "hostapd open, count:%d", count); - ui_screen(p); - } - } - - p->wpsing = _FALSE; -} - -void p2p_get_hostapd_conf(struct p2p *p) -{ - FILE *pf = NULL; - - pf = fopen( p->ap_conf, "r" ); - if ( pf ) - { - while( !feof( pf ) ){ - memset(p->parse, 0x00, CMD_SZ); - fgets(p->parse, CMD_SZ, pf); - if(strncmp(p->parse, "ssid=", 5) == 0) - { - strcpy( p->apd_ssid, p->parse+5 ); - } - else if(strncmp(p->parse, "channel=", 8) == 0) - { - p->op_ch = atoi( p->parse+8 ); - } - else if(strncmp(p->parse, "device_name=", 12) == 0) - { - int i; - p->dev_name[0] = '"'; - strncpy( p->dev_name+1, p->parse+12, 32 ); - for(i=31; i>0; i--) - { - if(p->dev_name[i] == '\n') - { - p->dev_name[i]='"'; - p->dev_name[i+1]=' '; - break; - } - } - } - } - - fclose( pf ); - } - -} - -void p2p_set_opch(struct p2p *p, char *msg, int print) -{ - if(print == 1) - { - p->show_scan_result = 1; - ui_screen(p); - printf("%s", msg); - scanf("%d",&p->op_ch); - } - - memset( p->cmd, 0x00, CMD_SZ ); - sprintf( p->cmd, "iwpriv %s p2p_set op_ch=%d", p->ifname, p->op_ch); - system( p->cmd ); -} - -void p2p_softap_ssid(struct p2p *p, char *msg, int print) -{ - if(print == 1) - { - p->show_scan_result = 1; - ui_screen(p); - printf("%s", msg); - scanf("%s",p->apd_ssid); - } - - memset( p->cmd, 0x00, CMD_SZ ); - sprintf( p->cmd, "iwpriv %s p2p_set ssid=%s ", p->ifname, p->apd_ssid); - system( p->cmd ); -} - -void p2p_listen_ch(struct p2p *p, char *msg) -{ - p->show_scan_result = 1; - ui_screen(p); - printf("%s", msg); - scanf("%d",&p->listen_ch); - - memset( p->cmd, 0x00, CMD_SZ ); - sprintf( p->cmd, "iwpriv %s p2p_set listen_ch=%d ", p->ifname, p->listen_ch); - system( p->cmd ); -} - -//When receive provision discovery request, -//it can show which device address that are connected. -void p2p_peer_devaddr(struct p2p *p, char *peer_devaddr) -{ - FILE *pf = NULL; - char addr_12[12] = { 0x00 }; - int i; - - memset( p->cmd, 0x00, CMD_SZ ); - sprintf( p->cmd, "iwpriv %s p2p_get peer_deva > peer.txt", p->ifname); - system( p->cmd ); - - pf = fopen( "./peer.txt", "r" ); - if ( pf ) - { - memset( p->parse, 0x00, CMD_SZ ); - fgets( p->parse, CMD_SZ, pf ); - fgets( p->parse, CMD_SZ, pf ); - strncpy(addr_12, p->parse, 12 ); - - for(i=0; i<6; i++) - { - p->peer_devaddr[3*i] = addr_12[2*i]; - p->peer_devaddr[3*i+1] = addr_12[2*i+1]; - - if(i==5) - p->peer_devaddr[3*i+2] = '\0'; - else - p->peer_devaddr[3*i+2] = ':'; - } - - fclose( pf ); - - } - -} - -//When receive provision discovery request, -//it can show which config method that want to be as WPS connection. -void p2p_peer_req_cm(struct p2p *p, char *peer_req_cm) -{ - FILE *pf = NULL; - - memset( p->cmd, 0x00, CMD_SZ ); - sprintf( p->cmd, "iwpriv %s p2p_get req_cm > peer.txt", p->ifname); - system( p->cmd ); - - pf = fopen( "./peer.txt", "r" ); - if ( pf ) - { - while( !feof( pf ) ){ - memset( p->parse, 0x00, CMD_SZ ); - fgets( p->parse, CMD_SZ, pf ); - if( strncmp( p->parse, "CM", 2) == 0 ) - { - strncpy( peer_req_cm, p->parse+3, 3 ); - break; - } - } - fclose( pf ); - } - -} - -//When be regotiated passsively and successfully, -//it will show peer device's peer device address and request config method -void p2p_peer_info(struct p2p *p, char *peer_devaddr, char *peer_req_cm) -{ - p->p2p_get=1; - - memset( p->print_line, 0x00, CMD_SZ ); - sprintf( p->print_line, "Peer address:%s, req_cm: %s ", peer_devaddr, peer_req_cm); - -} - -//After scan, it will get other devices' supported config methods. -void p2p_wps_cm(struct p2p *p, char *scan_addr, char *cms) -{ - FILE *pf = NULL; - int cm=0, i=0; - char parse[100] = {0x00}; - memset( cms, 0x00, 30 ); - - memset( p->cmd, 0x00, CMD_SZ ); - sprintf( p->cmd, "iwpriv %s p2p_get2 wpsCM=%s > cm.txt", p->ifname, scan_addr); - system( p->cmd ); - - pf = fopen( "./cm.txt", "r" ); - if ( pf ) - { - while( !feof( pf ) ){ - memset( parse, 0x00, CMD_SZ ); - fgets( parse, CMD_SZ, pf ); - if( strncmp( parse, "M=", 2 ) == 0 ) - { - cm = atoi( &parse[ 2 ] ); - - if((cm & WPS_CONFIG_METHOD_LABEL) == WPS_CONFIG_METHOD_LABEL){ - strncpy( cms+i, " LAB", 4 ); - i=i+4; - } - if((cm & WPS_CONFIG_METHOD_DISPLAY) == WPS_CONFIG_METHOD_DISPLAY){ - if((cm & WPS_CONFIG_METHOD_VDISPLAY) == WPS_CONFIG_METHOD_VDISPLAY){ - strncpy( cms+i, " VDIS", 5 ); - i=i+5; - }else if((cm & WPS_CONFIG_METHOD_PDISPLAY) == WPS_CONFIG_METHOD_PDISPLAY){ - strncpy( cms+i, " PDIS", 5 ); - i=i+5; - }else{ - strncpy( cms+i, " DIS", 4 ); - i=i+4; - } - } - if((cm & WPS_CONFIG_METHOD_E_NFC) == WPS_CONFIG_METHOD_E_NFC){ - strncpy( cms+i, " ENFC", 5 ); - i=i+5; - } - if((cm & WPS_CONFIG_METHOD_I_NFC) == WPS_CONFIG_METHOD_I_NFC){ - strncpy( cms+i, " INFC", 5 ); - i=i+5; - } - if((cm & WPS_CONFIG_METHOD_NFC) == WPS_CONFIG_METHOD_NFC){ - strncpy( cms+i, " NFC", 4 ); - i=i+4; - } - if((cm & WPS_CONFIG_METHOD_PBC) == WPS_CONFIG_METHOD_PBC){ - if((cm & WPS_CONFIG_METHOD_VPBC) == WPS_CONFIG_METHOD_VPBC){ - strncpy( cms+i, " VPBC", 5 ); - i=i+5; - }else if((cm & WPS_CONFIG_METHOD_PPBC) == WPS_CONFIG_METHOD_PPBC){ - strncpy( cms+i, " PPBC", 5 ); - i=i+5; - }else{ - strncpy( cms+i, " PBC", 4 ); - i=i+4; - } - } - if((cm & WPS_CONFIG_METHOD_KEYPAD) == WPS_CONFIG_METHOD_KEYPAD){ - strncpy( cms+i, " PAD", 4 ); - i=i+4; - } - - break; - } - } - fclose( pf ); - } - -} - -//After scan, it will get other devices' device name. -void p2p_device_name(struct p2p *p, char *scan_addr, char *dns) -{ - FILE *pf = NULL; - int i; - char parse[100] = {0x00}; - memset( dns, 0x00, 32 ); - - memset( p->cmd, 0x00, CMD_SZ ); - sprintf( p->cmd, "iwpriv %s p2p_get2 devN=%s > cm.txt", p->ifname, scan_addr); - system( p->cmd ); - - pf = fopen( "./cm.txt", "r" ); - if ( pf ) - { - while( !feof( pf ) ){ - memset( parse, 0x00, CMD_SZ ); - fgets( parse, CMD_SZ, pf ); - if( strncmp( parse, "N=", 2) == 0 ) - { - strncpy( dns, parse+2, 32); - for( i=0; i<32; i++) - { - if(*(dns+i) == '\n'){ - *(dns+i) = ' ' ; - break; - } - } - - break; - } - } - fclose( pf ); - } -} - -//Successively query local device status with interval "POLLING_INTERVAL" -//when status == P2P_STATE_RX_PROVISION_DIS_REQ, -//it require user to insert corresponding WPS config method -void *polling_status(void *arg) -{ - struct p2p *p=(struct p2p*)arg; - - while( p->res == 0 ){ - - p2p_status(p, 0); - if( (p->status == P2P_STATE_RX_PROVISION_DIS_REQ) || (p->status == P2P_STATE_GONEGO_FAIL) ) - { - p->thread_trigger = THREAD_DEVICE ; - - char peer_devaddr[18]; - char peer_req_cm[4]; - - memset( peer_devaddr, 0x00, 18); - memset( peer_req_cm, 0x00, 4); - - p2p_peer_devaddr(p, peer_devaddr); - p2p_peer_req_cm(p, peer_req_cm); - p2p_peer_info(p, p->peer_devaddr, peer_req_cm); - - ui_screen(p); - - //strncpy(p->peer_devaddr, peer_devaddr, 17); - if( (strncmp( peer_req_cm, "dis", 3) == 0) || (strncmp( peer_req_cm, "lab", 3) == 0) ) - { - printf("Here is your PIN, insert c to continue: %d\n", p->pin); - } - else if( (strncmp( peer_req_cm, "pbc", 3) == 0) ) - { - printf("Please push b to accept:\n"); - } - else if( (strncmp( peer_req_cm, "pad", 3) == 0) ) - { - printf("Please insert peer PIN code:\n"); - } - - break; - } - - usleep( POLLING_INTERVAL ); - } - - return NULL; -} - -//If p2p device becomes GO, we still polling driver status -//to check whether some other p2p devices connected -void *polling_client(void *arg) -{ - struct p2p *p=(struct p2p*)arg; - - while( p->res_go == 0 ){ - - if( p->no_sta_connected > 0 && ( p->wpsing == _FALSE ) ) - { - if( read_all_sta(p) == _FALSE ) - { - p->no_sta_connected--; - } - } - - p2p_status(p, 0); - if( p->status == P2P_STATE_RX_PROVISION_DIS_REQ || p->status == P2P_STATE_GONEGO_FAIL || p->status == P2P_STATE_GONEGO_ING ) - { - p->thread_trigger = THREAD_GO ; - - char peer_devaddr[18]; - char peer_req_cm[4]; - - memset( peer_devaddr, 0x00, 18); - memset( peer_req_cm, 0x00, 4); - - p2p_peer_devaddr(p, peer_devaddr); - p2p_peer_req_cm(p, peer_req_cm); - p2p_peer_info(p, p->peer_devaddr, peer_req_cm); - - ui_screen(p); - - //strncpy(p->peer_devaddr, peer_devaddr, 17); - if( (strncmp( peer_req_cm, "dis", 3) == 0) || (strncmp( peer_req_cm, "lab", 3) == 0) ) - { - printf("Here is your PIN, insert c to continue: %d\n", p->pin); - } - else if( (strncmp( peer_req_cm, "pbc", 3) == 0) ) - { - printf("Please push b to accept:\n", p->status); - } - else if( (strncmp( peer_req_cm, "pad", 3) == 0) ) - { - printf("Please insert peer PIN code:\n"); - } - - break; - } - - usleep( POLLING_INTERVAL ); - } - - return NULL; -} diff --git a/drivers/net/wireless/realtek/rtl8812au/tools/WiFi_Direct_User_Interface/p2p_test.h b/drivers/net/wireless/realtek/rtl8812au/tools/WiFi_Direct_User_Interface/p2p_test.h deleted file mode 100644 index 0dbae3c1da12ae..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/tools/WiFi_Direct_User_Interface/p2p_test.h +++ /dev/null @@ -1,167 +0,0 @@ -#ifndef _P2P_UI_TEST_H_ -#define _P2P_UI_TEST_H_ - -#include -#include -#include -#include -#include - -#define P2P_AUTO 1 -//#define DHCP 1 -#define CMD_SZ 100 -#define SSID_SZ 32 - -#define SEC 1000000 -#define SCAN_POOL_NO 8 -#define NEGO_RETRY_INTERVAL 10 * SEC -#define NEGO_QUERY_INTERVAL 0.5 * SEC -#define PRE_NEGO_INTERVAL 0.5 * SEC -#define MAX_PROV_RETRY 15 -#define PROV_RETRY_INTERVAL 5 -#define PROV_WAIT_TIME 1 * SEC -#define MAX_NEGO_RETRY 60 -#define NEGO_WAIT_TIME 0.5 * SEC -#define WPS_RETRY 120 -#define SUPPLICANT_INIT_TIME 1 * SEC -#define HOSTAPD_INIT_TIME 1 * SEC -#define SUPPLICANT_INTERVAL 1 * SEC -#define HOSTAPD_INTERVAL 1 * SEC -#define POLLING_INTERVAL 1 * SEC -#define _TRUE 1 -#define _FALSE 0 - -#define WPS_CONFIG_METHOD_LABEL 0x0004 -#define WPS_CONFIG_METHOD_DISPLAY 0x0008 -#define WPS_CONFIG_METHOD_E_NFC 0x0010 -#define WPS_CONFIG_METHOD_I_NFC 0x0020 -#define WPS_CONFIG_METHOD_NFC 0x0040 -#define WPS_CONFIG_METHOD_PBC 0x0080 -#define WPS_CONFIG_METHOD_KEYPAD 0x0100 -#define WPS_CONFIG_METHOD_VPBC 0x0280 -#define WPS_CONFIG_METHOD_PPBC 0x0480 -#define WPS_CONFIG_METHOD_VDISPLAY 0x2008 -#define WPS_CONFIG_METHOD_PDISPLAY 0x4008 - -enum thread_trigger{ - THREAD_NONE = 0, - THREAD_DEVICE = 1, - THREAD_GO = 2, -}; - -enum P2P_ROLE { - P2P_ROLE_DISABLE = 0, - P2P_ROLE_DEVICE = 1, - P2P_ROLE_CLIENT = 2, - P2P_ROLE_GO = 3 -}; - -enum P2P_STATE { - P2P_STATE_NONE = 0, // P2P disable - P2P_STATE_IDLE = 1, // P2P had enabled and do nothing - P2P_STATE_LISTEN = 2, // In pure listen state - P2P_STATE_SCAN = 3, // In scan phase - P2P_STATE_FIND_PHASE_LISTEN = 4, // In the listen state of find phase - P2P_STATE_FIND_PHASE_SEARCH = 5, // In the search state of find phase - P2P_STATE_TX_PROVISION_DIS_REQ = 6, // In P2P provisioning discovery - P2P_STATE_RX_PROVISION_DIS_RSP = 7, - P2P_STATE_RX_PROVISION_DIS_REQ = 8, - P2P_STATE_GONEGO_ING = 9, // Doing the group owner negoitation handshake - P2P_STATE_GONEGO_OK = 10, // finish the group negoitation handshake with success - P2P_STATE_GONEGO_FAIL = 11, // finish the group negoitation handshake with failure - P2P_STATE_RECV_INVITE_REQ = 12, // receiving the P2P Inviation request - P2P_STATE_PROVISIONING_ING = 13, // Doing the P2P WPS - P2P_STATE_PROVISIONING_DONE = 14, // Finish the P2P WPS -}; - -enum P2P_WPSINFO { - P2P_NO_WPSINFO = 0, - P2P_GOT_WPSINFO_PEER_DISPLAY_PIN = 1, - P2P_GOT_WPSINFO_SELF_DISPLAY_PIN = 2, - P2P_GOT_WPSINFO_PBC = 3, -}; - -struct scan{ - char addr[18]; - int go; -}; - -struct p2p{ - char ifname[10]; - int enable; - int status; - char dev_name[33]; - int intent; - int listen_ch; - int wps_info; - int wpsing; - unsigned int pin; - int role; - char peer_devaddr[18]; - int p2p_get; //p2p_get==1 : print messages from ioctl p2p_get - char print_line[CMD_SZ]; - int have_p2p_dev; //have_p2p_dev==1 : after scanning p2p device - int show_scan_result; - int count_line; - char peer_ifaddr[18]; - char cmd[CMD_SZ]; - char parse[CMD_SZ]; - char apd_ssid[SSID_SZ]; - int op_ch; //operation channel - int wpa_open; - int ap_open; - char ap_conf[CMD_SZ]; - char ap_path[CMD_SZ]; - char apcli_path[CMD_SZ]; - char wpa_conf[CMD_SZ]; - char wpa_path[CMD_SZ]; - char wpacli_path[CMD_SZ]; - char ok_msg[CMD_SZ]; - char redo_msg[CMD_SZ]; - char fail_msg[CMD_SZ]; - char nego_msg[CMD_SZ]; - char scan_msg[CMD_SZ]; - int thread_trigger; - pthread_t pthread; - pthread_t pthread_go; - int res; //check if thread is created; 1: disabled, 0: enabled - int res_go; //created if p2p device becomes GO - struct scan scan_pool[SCAN_POOL_NO]; - int connect_go; - int no_sta_connected; -}; - -void ui_screen(struct p2p *p); -char *naming_wpsinfo(int wps_info); -char *naming_role(int role); -char *naming_status(int status); -unsigned int wps_pin_checksum(unsigned int pin); -void p2p_enable(struct p2p *p); -void p2p_scan(struct p2p *p); -void scan_result(struct p2p *p); -void p2p_intent(struct p2p *p); -void p2p_pincode(struct p2p *p, char *ins_no, char *ins_no_again); -void p2p_devaddr(struct p2p *p); -void p2p_role(struct p2p *p, int flag); -void p2p_status(struct p2p *p, int flag); -void p2p_prov_disc_no_addr(struct p2p *p, char *msg); -void p2p_prov_disc(struct p2p *p, char *msg, char *dis_msg, char *label_msg); -void p2p_set_nego(struct p2p *p); -void p2p_ifaddr(struct p2p *p); -void p2p_client_mode(struct p2p *p); -void p2p_go_mode(struct p2p *p); -void p2p_get_hostapd_conf(struct p2p *p); -void p2p_set_opch(struct p2p *p, char *msg, int print); -void p2p_softap_ssid(struct p2p *p, char *msg, int print); -void p2p_listen_ch(struct p2p *p, char *msg); -void p2p_peer_devaddr(struct p2p *p, char *peer_devaddr); -void p2p_peer_req_cm(struct p2p *p, char *peer_req_cm); -void p2p_peer_info(struct p2p *p, char *peer_devaddr, char *peer_req_cm); -void p2p_wps_cm(struct p2p *p, char *scan_addr, char *cms); -void p2p_device_name(struct p2p *p, char *scan_addr, char *dns); -void p2p_setDN(struct p2p *p); -void *polling_status(void *arg); -void *polling_client(void *arg); -void *print_status(void *arg); - -#endif //_P2P_UI_TEST_H_ diff --git a/drivers/net/wireless/realtek/rtl8812au/tools/WiFi_Direct_User_Interface/p2p_ui_test_linux.c b/drivers/net/wireless/realtek/rtl8812au/tools/WiFi_Direct_User_Interface/p2p_ui_test_linux.c deleted file mode 100644 index ed852848c662bc..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/tools/WiFi_Direct_User_Interface/p2p_ui_test_linux.c +++ /dev/null @@ -1,536 +0,0 @@ - -#include "p2p_test.h" - -char *naming_wpsinfo(int wps_info) -{ - switch(wps_info) - { - case P2P_NO_WPSINFO: return ("P2P_NO_WPSINFO"); - case P2P_GOT_WPSINFO_PEER_DISPLAY_PIN: return ("P2P_GOT_WPSINFO_PEER_DISPLAY_PIN"); - case P2P_GOT_WPSINFO_SELF_DISPLAY_PIN: return ("P2P_GOT_WPSINFO_SELF_DISPLAY_PIN"); - case P2P_GOT_WPSINFO_PBC: return ("P2P_GOT_WPSINFO_PBC"); - default: return ("UI unknown failed"); - } -} - -char *naming_role(int role) -{ - switch(role) - { - case P2P_ROLE_DISABLE: return ("P2P_ROLE_DISABLE"); - case P2P_ROLE_DEVICE: return ("P2P_ROLE_DEVICE"); - case P2P_ROLE_CLIENT: return ("P2P_ROLE_CLIENT"); - case P2P_ROLE_GO: return ("P2P_ROLE_GO"); - default: return ("UI unknown failed"); - } -} - -char *naming_status(int status) -{ - switch(status) - { - case P2P_STATE_NONE: return ("P2P_STATE_NONE"); - case P2P_STATE_IDLE: return ("P2P_STATE_IDLE"); - case P2P_STATE_LISTEN: return ("P2P_STATE_LISTEN"); - case P2P_STATE_SCAN: return ("P2P_STATE_SCAN"); - case P2P_STATE_FIND_PHASE_LISTEN: return ("P2P_STATE_FIND_PHASE_LISTEN"); - case P2P_STATE_FIND_PHASE_SEARCH: return ("P2P_STATE_FIND_PHASE_SEARCH"); - case P2P_STATE_TX_PROVISION_DIS_REQ: return ("P2P_STATE_TX_PROVISION_DIS_REQ"); - case P2P_STATE_RX_PROVISION_DIS_RSP: return ("P2P_STATE_RX_PROVISION_DIS_RSP"); - case P2P_STATE_RX_PROVISION_DIS_REQ: return ("P2P_STATE_RX_PROVISION_DIS_REQ"); - case P2P_STATE_GONEGO_ING: return ("P2P_STATE_GONEGO_ING"); - case P2P_STATE_GONEGO_OK: return ("P2P_STATE_GONEGO_OK"); - case P2P_STATE_GONEGO_FAIL: return ("P2P_STATE_GONEGO_FAIL"); - case P2P_STATE_RECV_INVITE_REQ: return ("P2P_STATE_RECV_INVITE_REQ"); - case P2P_STATE_PROVISIONING_ING: return ("P2P_STATE_PROVISIONING_ING"); - case P2P_STATE_PROVISIONING_DONE: return ("P2P_STATE_PROVISIONING_DONE"); - default: return ("UI unknown failed"); - } -} - -char* naming_enable(int enable) -{ - switch(enable) - { - case P2P_ROLE_DISABLE: return ("[Disabled]"); - case P2P_ROLE_DEVICE: return ("[Enable/Device]"); - case P2P_ROLE_CLIENT: return ("[Enable/Client]"); - case P2P_ROLE_GO: return ("[Enable/GO]"); - default: return ("UI unknown failed"); - } -} - -void ui_screen(struct p2p *p) -{ - - system("clear"); - printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); - printf("****************************************************************************************************\n"); - printf("* P2P UI TEST v0.5 *\n"); - printf("****************************************************************************************************\n"); - printf("* Enable: %-89s*\n", naming_enable(p->enable)); - printf("* Intent: %2d *\n", p->intent); - printf("* Status: %-89s*\n", naming_status(p->status)); - printf("* Role: %-91s*\n", naming_role(p->role)); - printf("* WPS method: %-85s*\n", naming_wpsinfo(p->wps_info)); - printf("* PIN code: %08d *\n", p->pin); - - printf("* Device name: %-84s*\n", p->dev_name); - printf("* Peer device address: %-76s*\n", p->peer_devaddr); - printf("* Peer interface address: %-73s*\n", p->peer_ifaddr); - - printf("* *\n"); - printf("* e) Wi-Fi Direct Enable/Disable *\n"); - printf("* i) Intent ( The degree to be Group Owner/SoftAP ) *\n"); - printf("* a) Scan Wi-Fi Direct devices *\n"); - printf("* m) Peer device address you want to test *\n"); - printf("* p) Provision discovery *\n"); - printf("* c) Input PIN codes *\n"); - printf("* w) WPS method *\n"); - printf("* n) Group owner negotiation *\n"); - printf("* x) Start wpa_supplicant/hostapd *\n"); - printf("* h) Set operation channel | t) Set SoftAP ssid *\n"); - printf("* r) Get Current P2P Role | s) Get Current P2P Status *\n"); - printf("* d) Set device name | l) Set Listen channel *\n"); - printf("* f) Reflash Current State | q) Quit *\n"); - printf("****************************************************************************************************\n"); - - - if(p->p2p_get==0) - { - printf("* *\n"); - } - else if(p->p2p_get==1) - { - printf("*%-98s*\n", p->print_line); - } - - printf("****************************************************************************************************\n"); - - if( ( p->show_scan_result == 1 ) && ( p->have_p2p_dev == 1 ) ) - //if( (p->have_p2p_dev == 1) && (p->enable >= P2P_ROLE_DEVICE) && ( p->wpsing == 0 ) && (p->status >= P2P_STATE_LISTEN && p->status <= P2P_STATE_FIND_PHASE_SEARCH) ) - { - scan_result(p); - } - else - { - int i=0; - for(i = 0; i < SCAN_POOL_NO + 1; i++ ) - printf("* *\n"); - } - - printf("****************************************************************************************************\n"); - - p->show_scan_result = 0; -} - -void init_p2p(struct p2p *p) -{ - strcpy( p->ifname, "wlan0" ); - p->enable = P2P_ROLE_DISABLE; - p->res = 1; - p->res_go = 1; - p->status = P2P_STATE_NONE; - p->intent = 1; - p->wps_info = 0; - p->wpsing = 0; - p->pin = 12345670; - p->role = P2P_ROLE_DISABLE; - p->listen_ch = 11; - strcpy( p->peer_devaddr, "00:00:00:00:00:00" ); - p->p2p_get = 0; - memset( p->print_line, 0x00, CMD_SZ); - p->have_p2p_dev = 0; - p->count_line = 0; - strcpy( p->peer_ifaddr, "00:00:00:00:00:00" ); - memset( p->cmd, 0x00, CMD_SZ); - p->wpa_open=0; - p->ap_open=0; - strcpy(p->ok_msg, "WiFi Direct handshake done" ); - strcpy(p->redo_msg, "Re-do GO handshake" ); - strcpy(p->fail_msg, "GO handshake unsuccessful" ); - strcpy(p->nego_msg, "Start P2P negotiation" ); - strcpy(p->wpa_conf, "./wpa_0_8.conf" ); - strcpy(p->wpa_path, "./wpa_supplicant" ); - strcpy(p->wpacli_path, "./wpa_cli" ); - strcpy(p->ap_conf, "./p2p_hostapd.conf" ); - strcpy(p->ap_path, "./hostapd" ); - strcpy(p->apcli_path, "./hostapd_cli" ); - strcpy(p->scan_msg, "Device haven't enable p2p functionalities" ); - -} - -void rename_intf(struct p2p *p) -{ - FILE *pfin = NULL; - FILE *pfout = NULL; - - pfin = fopen( p->ap_conf, "r" ); - pfout = fopen( "./p2p_hostapd_temp.conf", "w" ); - - if ( pfin ) - { - while( !feof( pfin ) ){ - memset(p->parse, 0x00, CMD_SZ); - fgets(p->parse, CMD_SZ, pfin); - - if(strncmp(p->parse, "interface=", 10) == 0) - { - memset(p->parse, 0x00, CMD_SZ); - sprintf( p->parse, "interface=%s\n", p->ifname ); - fputs( p->parse, pfout ); - } - else - fputs(p->parse, pfout); - } - } - - fclose( pfout ); - - system( "rm -rf ./p2p_hostapd.conf" ); - system( "mv ./p2p_hostapd_temp.conf ./p2p_hostapd.conf" ); - - return; -} - - -//int main() -int main(int argc, char **argv) -{ - char peerifa[40] = { 0x00 }; - char scan[CMD_SZ]; - struct p2p p2pstruct; - struct p2p *p=NULL; - - p = &p2pstruct; - if( p != NULL) - { - memset(p, 0x00, sizeof(struct p2p)); - init_p2p(p); - } - - strcpy(p->ifname, argv[1] ); - - /* Disable P2P functionalities at first*/ - p->enable=P2P_ROLE_DISABLE; - p2p_enable(p); - p2p_get_hostapd_conf(p); - usleep(50000); - - rename_intf(p); - - do - { - ui_screen(p); - - printf("*insert cmd:"); - memset( scan, 0x00, CMD_SZ ); - scanf("%s", scan); - - if( p->thread_trigger == THREAD_NONE ) //Active mode for user interface - { - - if( strncmp(scan, "e", 1) == 0 ) //Enable - { - p->show_scan_result = 1; - ui_screen(p); - printf("Please insert enable mode;[0]Disable, [1]Device, [2]Client, [3]GO:"); - scanf("%d",&p->enable); - - p2p_enable(p); - p->show_scan_result = 1; - } - else if( strncmp(scan, "a", 1) == 0 ) // Scan P2P device - { - p2p_scan(p); - p->show_scan_result = 1; - } - else if( strncmp(scan, "d", 1) == 0 ) // Set device name - { - p->p2p_get = 0; - printf("Please insert device name :"); - scanf("\n%[^\n]", p->dev_name); - p2p_setDN(p); - p->show_scan_result = 1; - } - else if( strncmp(scan, "i", 1) == 0 ) // Intent - { - p->show_scan_result = 1; - ui_screen(p); - printf("Please insert intent from [0~15(must be softap)] :"); - scanf("%d",&p->intent); - p2p_intent(p); - p->show_scan_result = 1; - } - else if( strncmp(scan, "w", 1) == 0 ) // WPS_info - { - p->show_scan_result = 1; - ui_screen(p); - printf("Please insert WPS method\n"); - printf("[0]None, [1]Peer Display PIN, [2]Self Display Pin, [3]PBC :"); - scanf("%d",&p->wps_info); - p2p_wpsinfo(p); - p->show_scan_result = 1; - } - else if( strncmp(scan, "c", 1) == 0 ) // PIN_code - { - char ins_no[CMD_SZ], ins_no_again[CMD_SZ]; - memset(ins_no, 0x00, CMD_SZ); - strcpy(ins_no, "Please insert 8-digit number, eg:12345670 :" ); - memset(ins_no_again, 0x00, CMD_SZ); - strcpy(ins_no_again, "Invalid number, insert again, eg:12345670 :" ); - - p2p_pincode(p, ins_no, ins_no_again); - p->show_scan_result = 1; - } - else if( strncmp(scan, "m", 1) == 0 ) // Set peer device address - { - p->show_scan_result = 1; - ui_screen(p); - printf("Please insert number in scan list:"); - p2p_devaddr(p); - p->show_scan_result = 1; - } - else if( strncmp(scan, "r", 1) == 0 ) // Get role - { - p2p_role(p,1); - p->show_scan_result = 1; - } - else if( strncmp(scan, "s", 1) == 0 ) // Get status - { - p2p_status(p, 1); - p->show_scan_result = 1; - } - else if( strncmp(scan, "p", 1) == 0 ) // Provision discovery - { - char msg[CMD_SZ]; - memset( msg, 0x00, CMD_SZ ); - char dis_msg[CMD_SZ]; - memset( dis_msg, 0x00, CMD_SZ ); - char label_msg[CMD_SZ]; - memset( label_msg, 0x00, CMD_SZ ); - - - if(strncmp(p->peer_devaddr, "00:00:00:00:00:00", 17) == 0) - { - strcpy( msg, "Please insert peer P2P device at first" ); - - p2p_prov_disc_no_addr(p, msg); - p->show_scan_result = 1; - } - else - { - strcpy( msg, "Please insert WPS configuration method ;[0]display, [1]keypad, [2]pbc, [3]label:\n" ); - strcpy( dis_msg, "Please insert PIN code displays on peer device screen:" ); - strcpy( label_msg, "Please insert PIN code displays on peer label:" ); - - p2p_prov_disc(p, msg, dis_msg, label_msg); - } - } - else if( strncmp(scan, "n", 1) == 0 ) // Set negotiation - { - p2p_set_nego(p); - } - else if( strncmp(scan, "f", 1) == 0 ) // Reflash current state - { - p->show_scan_result = 1; - p2p_status(p, 0); - p2p_role(p, 0); - p2p_ifaddr(p); - - if( p->status == P2P_STATE_RX_PROVISION_DIS_REQ ) - { - char peer_devaddr[18]; - char peer_req_cm[4]; - - memset( peer_devaddr, 0x00, 18); - memset( peer_req_cm, 0x00, 4); - - p2p_peer_devaddr(p, peer_devaddr); - p2p_peer_req_cm(p, peer_req_cm); - p2p_peer_info(p, p->peer_devaddr, peer_req_cm); - } -#ifndef P2P_AUTO - else - { - if( p->role == P2P_ROLE_CLIENT ) - { - p2p_client_mode(p); - } - else if( p->role == P2P_ROLE_GO ) - { - p2p_go_mode(p); - } - } -#endif //P2P_AUTO - - } - else if( strncmp(scan, "x", 1) == 0 ) // Start wpa_supplicant/hostapd - { - if( p->role == P2P_ROLE_CLIENT ) - { - p2p_client_mode(p); - } - else if( p->role == P2P_ROLE_GO ) - { - p2p_go_mode(p); - } - } - else if( strncmp(scan, "h", 1) == 0 ) // Set operation channel - { - char msg[CMD_SZ]; - memset( msg, 0x00, CMD_SZ ); - strcpy( msg, "Please insert desired operation channel:" ); - - p2p_set_opch(p, msg, 1); - p->show_scan_result = 1; - } - else if( strncmp(scan, "t", 1) == 0 ) // Set SoftAP ssid - { - char msg[CMD_SZ]; - memset( msg, 0x00, CMD_SZ ); - strcpy( msg, "Please insert desired SoftAP ssid:" ); - - p2p_softap_ssid(p, msg, 1); - p->show_scan_result = 1; - } - else if( strncmp(scan, "l", 1) == 0 ) // Set Listen channel - { - char msg[CMD_SZ]; - memset( msg, 0x00, CMD_SZ ); - strcpy( msg, "Please insert desired Listen channel, only ch.1.6.11 are available:" ); - - p2p_listen_ch(p, msg); - p->show_scan_result = 1; - } - else if( strncmp(scan, "q", 1) == 0 ) // Quit - { - if( p->res == 0 ) - p->res = 1; - if( p->res_go == 0 ) - p->res_go = 1; - break; - } - else // Insert wrong commamd - { - p->p2p_get=1; - p->show_scan_result = 1; - memset( p->print_line, 0x00, CMD_SZ ); - sprintf( p->print_line, " BAD argument"); - } - - } - else if( p->thread_trigger == THREAD_DEVICE ) //Passive mode for user interface - { - - p->thread_trigger = THREAD_NONE ; - - if( strncmp(scan, "b", 1) == 0 ) - { - p->wps_info=3; - p2p_wpsinfo(p); - - p2p_status(p, 0); - - if(p->status != P2P_STATE_GONEGO_OK) - { - p2p_set_nego(p); - } - else - { - p2p_role(p,0); - - if( p->role == P2P_ROLE_CLIENT ) - { - p2p_client_mode(p); - } - else if( p->role == P2P_ROLE_GO ) - { - p2p_go_mode(p); - } - } - } - else if( strncmp(scan, "c", 1) == 0 ) - { - p->wps_info=2; - p2p_wpsinfo(p); - - p2p_status(p, 0); - - if(p->status != P2P_STATE_GONEGO_OK) - { - p2p_set_nego(p); - } - else - { - p2p_role(p,0); - p2p_ifaddr(p); - - if( p->role == P2P_ROLE_CLIENT ) - { - p2p_client_mode(p); - } - else if( p->role == P2P_ROLE_GO ) - { - p2p_go_mode(p); - } - } - } - else if( ('0' <= *scan ) && ( *scan <= '9') ) - { - printf("In passive pin code\n"); - - p->pin = atoi(scan); - - p->wps_info=1; - p2p_wpsinfo(p); - - p2p_set_nego(p); - } - } - else if( p->thread_trigger == THREAD_GO ) //Passive mode for user interface - { - - p->thread_trigger = THREAD_NONE ; - - if( strncmp(scan, "b", 1) == 0 ) - { - p->wps_info=3; - p2p_wpsinfo(p); - - } - else if( strncmp(scan, "c", 1) == 0 ) - { - p->wps_info=2; - p2p_wpsinfo(p); - } - else if( ('0' <= *scan ) && ( *scan <= '9') ) - { - printf("In passive pin code\n"); - - p->pin = atoi(scan); - - p->wps_info=1; - p2p_wpsinfo(p); - } - - p2p_go_mode(p); - - } - } - while( 1 ); - - /* Disable P2P functionalities when exits*/ - p->enable= -1 ; - p2p_enable(p); - - system( "rm -f ./supp_status.txt" ); - system( "rm -f ./temp.txt" ); - system( "rm -f ./scan.txt" ); - system( "rm -f ./peer.txt" ); - system( "rm -f ./status.txt" ); - system( "rm -f ./cm.txt" ); - - return 0; - -} diff --git a/drivers/net/wireless/realtek/rtl8812au/tools/analyze_suspend.py b/drivers/net/wireless/realtek/rtl8812au/tools/analyze_suspend.py deleted file mode 100755 index e5b7c3824de7f9..00000000000000 --- a/drivers/net/wireless/realtek/rtl8812au/tools/analyze_suspend.py +++ /dev/null @@ -1,3441 +0,0 @@ -#!/usr/bin/python -# -# Tool for analyzing suspend/resume timing -# Copyright (c) 2013, Intel Corporation. -# -# This program is free software; you can redistribute it and/or modify it -# under the terms and conditions of the GNU General Public License, -# version 2, as published by the Free Software Foundation. -# -# This program is distributed in the hope 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., -# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. -# -# Authors: -# Todd Brandt -# -# Description: -# This tool is designed to assist kernel and OS developers in optimizing -# their linux stack's suspend/resume time. Using a kernel image built -# with a few extra options enabled, the tool will execute a suspend and -# will capture dmesg and ftrace data until resume is complete. This data -# is transformed into a device timeline and a callgraph to give a quick -# and detailed view of which devices and callbacks are taking the most -# time in suspend/resume. The output is a single html file which can be -# viewed in firefox or chrome. -# -# The following kernel build options are required: -# CONFIG_PM_DEBUG=y -# CONFIG_PM_SLEEP_DEBUG=y -# CONFIG_FTRACE=y -# CONFIG_FUNCTION_TRACER=y -# CONFIG_FUNCTION_GRAPH_TRACER=y -# -# For kernel versions older than 3.15: -# The following additional kernel parameters are required: -# (e.g. in file /etc/default/grub) -# GRUB_CMDLINE_LINUX_DEFAULT="... initcall_debug log_buf_len=16M ..." -# -# ----------------- LIBRARIES -------------------- -import sys -import time -import os -import string -import re -import platform -from datetime import datetime -import struct -# ----------------- CLASSES -------------------- -# Class: SystemValues -# Description: -# A global, single-instance container used to -# store system values and test parameters -class SystemValues: - version = 3.0 - verbose = False - testdir = '.' - tpath = '/sys/kernel/debug/tracing/' - fpdtpath = '/sys/firmware/acpi/tables/FPDT' - epath = '/sys/kernel/debug/tracing/events/power/' - traceevents = [ - 'suspend_resume', - 'device_pm_callback_end', - 'device_pm_callback_start' - ] - modename = { - 'freeze': 'Suspend-To-Idle (S0)', - 'standby': 'Power-On Suspend (S1)', - 'mem': 'Suspend-to-RAM (S3)', - 'disk': 'Suspend-to-disk (S4)' - } - mempath = '/dev/mem' - powerfile = '/sys/power/state' - suspendmode = 'mem' - hostname = 'localhost' - prefix = 'test' - teststamp = '' - dmesgfile = '' - ftracefile = '' - htmlfile = '' - rtcwake = False - rtcwaketime = 10 - rtcpath = '' - android = False - adb = 'adb' - devicefilter = [] - stamp = 0 - execcount = 1 - x2delay = 0 - usecallgraph = False - usetraceevents = False - usetraceeventsonly = False - notestrun = False - altdevname = dict() - postresumetime = 0 - tracertypefmt = '# tracer: (?P.*)' - firmwarefmt = '# fwsuspend (?P[0-9]*) fwresume (?P[0-9]*)$' - postresumefmt = '# post resume time (?P[0-9]*)$' - stampfmt = '# suspend-(?P[0-9]{2})(?P[0-9]{2})(?P[0-9]{2})-'+\ - '(?P[0-9]{2})(?P[0-9]{2})(?P[0-9]{2})'+\ - ' (?P.*) (?P.*) (?P.*)$' - def __init__(self): - self.hostname = platform.node() - if(self.hostname == ''): - self.hostname = 'localhost' - rtc = "rtc0" - if os.path.exists('/dev/rtc'): - rtc = os.readlink('/dev/rtc') - rtc = '/sys/class/rtc/'+rtc - if os.path.exists(rtc) and os.path.exists(rtc+'/date') and \ - os.path.exists(rtc+'/time') and os.path.exists(rtc+'/wakealarm'): - self.rtcpath = rtc - def setOutputFile(self): - if((self.htmlfile == '') and (self.dmesgfile != '')): - m = re.match('(?P.*)_dmesg\.txt$', self.dmesgfile) - if(m): - self.htmlfile = m.group('name')+'.html' - if((self.htmlfile == '') and (self.ftracefile != '')): - m = re.match('(?P.*)_ftrace\.txt$', self.ftracefile) - if(m): - self.htmlfile = m.group('name')+'.html' - if(self.htmlfile == ''): - self.htmlfile = 'output.html' - def initTestOutput(self, subdir): - if(not self.android): - self.prefix = self.hostname - v = open('/proc/version', 'r').read().strip() - kver = string.split(v)[2] - else: - self.prefix = 'android' - v = os.popen(self.adb+' shell cat /proc/version').read().strip() - kver = string.split(v)[2] - testtime = datetime.now().strftime('suspend-%m%d%y-%H%M%S') - if(subdir != "."): - self.testdir = subdir+"/"+testtime - else: - self.testdir = testtime - self.teststamp = \ - '# '+testtime+' '+self.prefix+' '+self.suspendmode+' '+kver - self.dmesgfile = \ - self.testdir+'/'+self.prefix+'_'+self.suspendmode+'_dmesg.txt' - self.ftracefile = \ - self.testdir+'/'+self.prefix+'_'+self.suspendmode+'_ftrace.txt' - self.htmlfile = \ - self.testdir+'/'+self.prefix+'_'+self.suspendmode+'.html' - os.mkdir(self.testdir) - def setDeviceFilter(self, devnames): - self.devicefilter = string.split(devnames) - def rtcWakeAlarm(self): - os.system('echo 0 > '+self.rtcpath+'/wakealarm') - outD = open(self.rtcpath+'/date', 'r').read().strip() - outT = open(self.rtcpath+'/time', 'r').read().strip() - mD = re.match('^(?P[0-9]*)-(?P[0-9]*)-(?P[0-9]*)', outD) - mT = re.match('^(?P[0-9]*):(?P[0-9]*):(?P[0-9]*)', outT) - if(mD and mT): - # get the current time from hardware - utcoffset = int((datetime.now() - datetime.utcnow()).total_seconds()) - dt = datetime(\ - int(mD.group('y')), int(mD.group('m')), int(mD.group('d')), - int(mT.group('h')), int(mT.group('m')), int(mT.group('s'))) - nowtime = int(dt.strftime('%s')) + utcoffset - else: - # if hardware time fails, use the software time - nowtime = int(datetime.now().strftime('%s')) - alarm = nowtime + self.rtcwaketime - os.system('echo %d > %s/wakealarm' % (alarm, self.rtcpath)) -sysvals = SystemValues() -# Class: DeviceNode -# Description: -# A container used to create a device hierachy, with a single root node -# and a tree of child nodes. Used by Data.deviceTopology() -class DeviceNode: - name = '' - children = 0 - depth = 0 - def __init__(self, nodename, nodedepth): - self.name = nodename - self.children = [] - self.depth = nodedepth -# Class: Data -# Description: -# The primary container for suspend/resume test data. There is one for -# each test run. The data is organized into a cronological hierarchy: -# Data.dmesg { -# root structure, started as dmesg & ftrace, but now only ftrace -# contents: times for suspend start/end, resume start/end, fwdata -# phases { -# 10 sequential, non-overlapping phases of S/R -# contents: times for phase start/end, order/color data for html -# devlist { -# device callback or action list for this phase -# device { -# a single device callback or generic action -# contents: start/stop times, pid/cpu/driver info -# parents/children, html id for timeline/callgraph -# optionally includes an ftrace callgraph -# optionally includes intradev trace events -# } -# } -# } -# } -# -class Data: - dmesg = {} # root data structure - phases = [] # ordered list of phases - start = 0.0 # test start - end = 0.0 # test end - tSuspended = 0.0 # low-level suspend start - tResumed = 0.0 # low-level resume start - tLow = 0.0 # time spent in low-level suspend (standby/freeze) - fwValid = False # is firmware data available - fwSuspend = 0 # time spent in firmware suspend - fwResume = 0 # time spent in firmware resume - dmesgtext = [] # dmesg text file in memory - testnumber = 0 - idstr = '' - html_device_id = 0 - stamp = 0 - outfile = '' - def __init__(self, num): - idchar = 'abcdefghijklmnopqrstuvwxyz' - self.testnumber = num - self.idstr = idchar[num] - self.dmesgtext = [] - self.phases = [] - self.dmesg = { # fixed list of 10 phases - 'suspend_prepare': {'list': dict(), 'start': -1.0, 'end': -1.0, - 'row': 0, 'color': '#CCFFCC', 'order': 0}, - 'suspend': {'list': dict(), 'start': -1.0, 'end': -1.0, - 'row': 0, 'color': '#88FF88', 'order': 1}, - 'suspend_late': {'list': dict(), 'start': -1.0, 'end': -1.0, - 'row': 0, 'color': '#00AA00', 'order': 2}, - 'suspend_noirq': {'list': dict(), 'start': -1.0, 'end': -1.0, - 'row': 0, 'color': '#008888', 'order': 3}, - 'suspend_machine': {'list': dict(), 'start': -1.0, 'end': -1.0, - 'row': 0, 'color': '#0000FF', 'order': 4}, - 'resume_machine': {'list': dict(), 'start': -1.0, 'end': -1.0, - 'row': 0, 'color': '#FF0000', 'order': 5}, - 'resume_noirq': {'list': dict(), 'start': -1.0, 'end': -1.0, - 'row': 0, 'color': '#FF9900', 'order': 6}, - 'resume_early': {'list': dict(), 'start': -1.0, 'end': -1.0, - 'row': 0, 'color': '#FFCC00', 'order': 7}, - 'resume': {'list': dict(), 'start': -1.0, 'end': -1.0, - 'row': 0, 'color': '#FFFF88', 'order': 8}, - 'resume_complete': {'list': dict(), 'start': -1.0, 'end': -1.0, - 'row': 0, 'color': '#FFFFCC', 'order': 9} - } - self.phases = self.sortedPhases() - def getStart(self): - return self.dmesg[self.phases[0]]['start'] - def setStart(self, time): - self.start = time - self.dmesg[self.phases[0]]['start'] = time - def getEnd(self): - return self.dmesg[self.phases[-1]]['end'] - def setEnd(self, time): - self.end = time - self.dmesg[self.phases[-1]]['end'] = time - def isTraceEventOutsideDeviceCalls(self, pid, time): - for phase in self.phases: - list = self.dmesg[phase]['list'] - for dev in list: - d = list[dev] - if(d['pid'] == pid and time >= d['start'] and - time <= d['end']): - return False - return True - def addIntraDevTraceEvent(self, action, name, pid, time): - if(action == 'mutex_lock_try'): - color = 'red' - elif(action == 'mutex_lock_pass'): - color = 'green' - elif(action == 'mutex_unlock'): - color = 'blue' - else: - # create separate colors based on the name - v1 = len(name)*10 % 256 - v2 = string.count(name, 'e')*100 % 256 - v3 = ord(name[0])*20 % 256 - color = '#%06X' % ((v1*0x10000) + (v2*0x100) + v3) - for phase in self.phases: - list = self.dmesg[phase]['list'] - for dev in list: - d = list[dev] - if(d['pid'] == pid and time >= d['start'] and - time <= d['end']): - e = TraceEvent(action, name, color, time) - if('traceevents' not in d): - d['traceevents'] = [] - d['traceevents'].append(e) - return d - break - return 0 - def capIntraDevTraceEvent(self, action, name, pid, time): - for phase in self.phases: - list = self.dmesg[phase]['list'] - for dev in list: - d = list[dev] - if(d['pid'] == pid and time >= d['start'] and - time <= d['end']): - if('traceevents' not in d): - return - for e in d['traceevents']: - if(e.action == action and - e.name == name and not e.ready): - e.length = time - e.time - e.ready = True - break - return - def trimTimeVal(self, t, t0, dT, left): - if left: - if(t > t0): - if(t - dT < t0): - return t0 - return t - dT - else: - return t - else: - if(t < t0 + dT): - if(t > t0): - return t0 + dT - return t + dT - else: - return t - def trimTime(self, t0, dT, left): - self.tSuspended = self.trimTimeVal(self.tSuspended, t0, dT, left) - self.tResumed = self.trimTimeVal(self.tResumed, t0, dT, left) - self.start = self.trimTimeVal(self.start, t0, dT, left) - self.end = self.trimTimeVal(self.end, t0, dT, left) - for phase in self.phases: - p = self.dmesg[phase] - p['start'] = self.trimTimeVal(p['start'], t0, dT, left) - p['end'] = self.trimTimeVal(p['end'], t0, dT, left) - list = p['list'] - for name in list: - d = list[name] - d['start'] = self.trimTimeVal(d['start'], t0, dT, left) - d['end'] = self.trimTimeVal(d['end'], t0, dT, left) - if('ftrace' in d): - cg = d['ftrace'] - cg.start = self.trimTimeVal(cg.start, t0, dT, left) - cg.end = self.trimTimeVal(cg.end, t0, dT, left) - for line in cg.list: - line.time = self.trimTimeVal(line.time, t0, dT, left) - if('traceevents' in d): - for e in d['traceevents']: - e.time = self.trimTimeVal(e.time, t0, dT, left) - def normalizeTime(self, tZero): - # first trim out any standby or freeze clock time - if(self.tSuspended != self.tResumed): - if(self.tResumed > tZero): - self.trimTime(self.tSuspended, \ - self.tResumed-self.tSuspended, True) - else: - self.trimTime(self.tSuspended, \ - self.tResumed-self.tSuspended, False) - # shift the timeline so that tZero is the new 0 - self.tSuspended -= tZero - self.tResumed -= tZero - self.start -= tZero - self.end -= tZero - for phase in self.phases: - p = self.dmesg[phase] - p['start'] -= tZero - p['end'] -= tZero - list = p['list'] - for name in list: - d = list[name] - d['start'] -= tZero - d['end'] -= tZero - if('ftrace' in d): - cg = d['ftrace'] - cg.start -= tZero - cg.end -= tZero - for line in cg.list: - line.time -= tZero - if('traceevents' in d): - for e in d['traceevents']: - e.time -= tZero - def newPhaseWithSingleAction(self, phasename, devname, start, end, color): - for phase in self.phases: - self.dmesg[phase]['order'] += 1 - self.html_device_id += 1 - devid = '%s%d' % (self.idstr, self.html_device_id) - list = dict() - list[devname] = \ - {'start': start, 'end': end, 'pid': 0, 'par': '', - 'length': (end-start), 'row': 0, 'id': devid, 'drv': '' }; - self.dmesg[phasename] = \ - {'list': list, 'start': start, 'end': end, - 'row': 0, 'color': color, 'order': 0} - self.phases = self.sortedPhases() - def newPhase(self, phasename, start, end, color, order): - if(order < 0): - order = len(self.phases) - for phase in self.phases[order:]: - self.dmesg[phase]['order'] += 1 - if(order > 0): - p = self.phases[order-1] - self.dmesg[p]['end'] = start - if(order < len(self.phases)): - p = self.phases[order] - self.dmesg[p]['start'] = end - list = dict() - self.dmesg[phasename] = \ - {'list': list, 'start': start, 'end': end, - 'row': 0, 'color': color, 'order': order} - self.phases = self.sortedPhases() - def setPhase(self, phase, ktime, isbegin): - if(isbegin): - self.dmesg[phase]['start'] = ktime - else: - self.dmesg[phase]['end'] = ktime - def dmesgSortVal(self, phase): - return self.dmesg[phase]['order'] - def sortedPhases(self): - return sorted(self.dmesg, key=self.dmesgSortVal) - def sortedDevices(self, phase): - list = self.dmesg[phase]['list'] - slist = [] - tmp = dict() - for devname in list: - dev = list[devname] - tmp[dev['start']] = devname - for t in sorted(tmp): - slist.append(tmp[t]) - return slist - def fixupInitcalls(self, phase, end): - # if any calls never returned, clip them at system resume end - phaselist = self.dmesg[phase]['list'] - for devname in phaselist: - dev = phaselist[devname] - if(dev['end'] < 0): - dev['end'] = end - vprint('%s (%s): callback didnt return' % (devname, phase)) - def deviceFilter(self, devicefilter): - # remove all by the relatives of the filter devnames - filter = [] - for phase in self.phases: - list = self.dmesg[phase]['list'] - for name in devicefilter: - dev = name - while(dev in list): - if(dev not in filter): - filter.append(dev) - dev = list[dev]['par'] - children = self.deviceDescendants(name, phase) - for dev in children: - if(dev not in filter): - filter.append(dev) - for phase in self.phases: - list = self.dmesg[phase]['list'] - rmlist = [] - for name in list: - pid = list[name]['pid'] - if(name not in filter and pid >= 0): - rmlist.append(name) - for name in rmlist: - del list[name] - def fixupInitcallsThatDidntReturn(self): - # if any calls never returned, clip them at system resume end - for phase in self.phases: - self.fixupInitcalls(phase, self.getEnd()) - def newActionGlobal(self, name, start, end): - # which phase is this device callback or action "in" - targetphase = "none" - overlap = 0.0 - for phase in self.phases: - pstart = self.dmesg[phase]['start'] - pend = self.dmesg[phase]['end'] - o = max(0, min(end, pend) - max(start, pstart)) - if(o > overlap): - targetphase = phase - overlap = o - if targetphase in self.phases: - self.newAction(targetphase, name, -1, '', start, end, '') - return True - return False - def newAction(self, phase, name, pid, parent, start, end, drv): - # new device callback for a specific phase - self.html_device_id += 1 - devid = '%s%d' % (self.idstr, self.html_device_id) - list = self.dmesg[phase]['list'] - length = -1.0 - if(start >= 0 and end >= 0): - length = end - start - list[name] = {'start': start, 'end': end, 'pid': pid, 'par': parent, - 'length': length, 'row': 0, 'id': devid, 'drv': drv } - def deviceIDs(self, devlist, phase): - idlist = [] - list = self.dmesg[phase]['list'] - for devname in list: - if devname in devlist: - idlist.append(list[devname]['id']) - return idlist - def deviceParentID(self, devname, phase): - pdev = '' - pdevid = '' - list = self.dmesg[phase]['list'] - if devname in list: - pdev = list[devname]['par'] - if pdev in list: - return list[pdev]['id'] - return pdev - def deviceChildren(self, devname, phase): - devlist = [] - list = self.dmesg[phase]['list'] - for child in list: - if(list[child]['par'] == devname): - devlist.append(child) - return devlist - def deviceDescendants(self, devname, phase): - children = self.deviceChildren(devname, phase) - family = children - for child in children: - family += self.deviceDescendants(child, phase) - return family - def deviceChildrenIDs(self, devname, phase): - devlist = self.deviceChildren(devname, phase) - return self.deviceIDs(devlist, phase) - def printDetails(self): - vprint(' test start: %f' % self.start) - for phase in self.phases: - dc = len(self.dmesg[phase]['list']) - vprint(' %16s: %f - %f (%d devices)' % (phase, \ - self.dmesg[phase]['start'], self.dmesg[phase]['end'], dc)) - vprint(' test end: %f' % self.end) - def masterTopology(self, name, list, depth): - node = DeviceNode(name, depth) - for cname in list: - clist = self.deviceChildren(cname, 'resume') - cnode = self.masterTopology(cname, clist, depth+1) - node.children.append(cnode) - return node - def printTopology(self, node): - html = '' - if node.name: - info = '' - drv = '' - for phase in self.phases: - list = self.dmesg[phase]['list'] - if node.name in list: - s = list[node.name]['start'] - e = list[node.name]['end'] - if list[node.name]['drv']: - drv = ' {'+list[node.name]['drv']+'}' - info += ('
  • %s: %.3fms
  • ' % (phase, (e-s)*1000)) - html += '
  • '+node.name+drv+'' - if info: - html += '
      '+info+'
    ' - html += '
  • ' - if len(node.children) > 0: - html += '
      ' - for cnode in node.children: - html += self.printTopology(cnode) - html += '
    ' - return html - def rootDeviceList(self): - # list of devices graphed - real = [] - for phase in self.dmesg: - list = self.dmesg[phase]['list'] - for dev in list: - if list[dev]['pid'] >= 0 and dev not in real: - real.append(dev) - # list of top-most root devices - rootlist = [] - for phase in self.dmesg: - list = self.dmesg[phase]['list'] - for dev in list: - pdev = list[dev]['par'] - if(re.match('[0-9]*-[0-9]*\.[0-9]*[\.0-9]*\:[\.0-9]*$', pdev)): - continue - if pdev and pdev not in real and pdev not in rootlist: - rootlist.append(pdev) - return rootlist - def deviceTopology(self): - rootlist = self.rootDeviceList() - master = self.masterTopology('', rootlist, 0) - return self.printTopology(master) -# Class: TraceEvent -# Description: -# A container for trace event data found in the ftrace file -class TraceEvent: - ready = False - name = '' - time = 0.0 - color = '#FFFFFF' - length = 0.0 - action = '' - def __init__(self, a, n, c, t): - self.action = a - self.name = n - self.color = c - self.time = t -# Class: FTraceLine -# Description: -# A container for a single line of ftrace data. There are six basic types: -# callgraph line: -# call: " dpm_run_callback() {" -# return: " }" -# leaf: " dpm_run_callback();" -# trace event: -# tracing_mark_write: SUSPEND START or RESUME COMPLETE -# suspend_resume: phase or custom exec block data -# device_pm_callback: device callback info -class FTraceLine: - time = 0.0 - length = 0.0 - fcall = False - freturn = False - fevent = False - depth = 0 - name = '' - type = '' - def __init__(self, t, m, d): - self.time = float(t) - # is this a trace event - if(d == 'traceevent' or re.match('^ *\/\* *(?P.*) \*\/ *$', m)): - if(d == 'traceevent'): - # nop format trace event - msg = m - else: - # function_graph format trace event - em = re.match('^ *\/\* *(?P.*) \*\/ *$', m) - msg = em.group('msg') - emm = re.match('^(?P.*?): (?P.*)', msg) - if(emm): - self.name = emm.group('msg') - self.type = emm.group('call') - else: - self.name = msg - self.fevent = True - return - # convert the duration to seconds - if(d): - self.length = float(d)/1000000 - # the indentation determines the depth - match = re.match('^(?P *)(?P.*)$', m) - if(not match): - return - self.depth = self.getDepth(match.group('d')) - m = match.group('o') - # function return - if(m[0] == '}'): - self.freturn = True - if(len(m) > 1): - # includes comment with function name - match = re.match('^} *\/\* *(?P.*) *\*\/$', m) - if(match): - self.name = match.group('n') - # function call - else: - self.fcall = True - # function call with children - if(m[-1] == '{'): - match = re.match('^(?P.*) *\(.*', m) - if(match): - self.name = match.group('n') - # function call with no children (leaf) - elif(m[-1] == ';'): - self.freturn = True - match = re.match('^(?P.*) *\(.*', m) - if(match): - self.name = match.group('n') - # something else (possibly a trace marker) - else: - self.name = m - def getDepth(self, str): - return len(str)/2 - def debugPrint(self, dev): - if(self.freturn and self.fcall): - print('%s -- %f (%02d): %s(); (%.3f us)' % (dev, self.time, \ - self.depth, self.name, self.length*1000000)) - elif(self.freturn): - print('%s -- %f (%02d): %s} (%.3f us)' % (dev, self.time, \ - self.depth, self.name, self.length*1000000)) - else: - print('%s -- %f (%02d): %s() { (%.3f us)' % (dev, self.time, \ - self.depth, self.name, self.length*1000000)) -# Class: FTraceCallGraph -# Description: -# A container for the ftrace callgraph of a single recursive function. -# This can be a dpm_run_callback, dpm_prepare, or dpm_complete callgraph -# Each instance is tied to a single device in a single phase, and is -# comprised of an ordered list of FTraceLine objects -class FTraceCallGraph: - start = -1.0 - end = -1.0 - list = [] - invalid = False - depth = 0 - def __init__(self): - self.start = -1.0 - self.end = -1.0 - self.list = [] - self.depth = 0 - def setDepth(self, line): - if(line.fcall and not line.freturn): - line.depth = self.depth - self.depth += 1 - elif(line.freturn and not line.fcall): - self.depth -= 1 - line.depth = self.depth - else: - line.depth = self.depth - def addLine(self, line, match): - if(not self.invalid): - self.setDepth(line) - if(line.depth == 0 and line.freturn): - if(self.start < 0): - self.start = line.time - self.end = line.time - self.list.append(line) - return True - if(self.invalid): - return False - if(len(self.list) >= 1000000 or self.depth < 0): - if(len(self.list) > 0): - first = self.list[0] - self.list = [] - self.list.append(first) - self.invalid = True - if(not match): - return False - id = 'task %s cpu %s' % (match.group('pid'), match.group('cpu')) - window = '(%f - %f)' % (self.start, line.time) - if(self.depth < 0): - print('Too much data for '+id+\ - ' (buffer overflow), ignoring this callback') - else: - print('Too much data for '+id+\ - ' '+window+', ignoring this callback') - return False - self.list.append(line) - if(self.start < 0): - self.start = line.time - return False - def slice(self, t0, tN): - minicg = FTraceCallGraph() - count = -1 - firstdepth = 0 - for l in self.list: - if(l.time < t0 or l.time > tN): - continue - if(count < 0): - if(not l.fcall or l.name == 'dev_driver_string'): - continue - firstdepth = l.depth - count = 0 - l.depth -= firstdepth - minicg.addLine(l, 0) - if((count == 0 and l.freturn and l.fcall) or - (count > 0 and l.depth <= 0)): - break - count += 1 - return minicg - def sanityCheck(self): - stack = dict() - cnt = 0 - for l in self.list: - if(l.fcall and not l.freturn): - stack[l.depth] = l - cnt += 1 - elif(l.freturn and not l.fcall): - if(l.depth not in stack): - return False - stack[l.depth].length = l.length - stack[l.depth] = 0 - l.length = 0 - cnt -= 1 - if(cnt == 0): - return True - return False - def debugPrint(self, filename): - if(filename == 'stdout'): - print('[%f - %f]') % (self.start, self.end) - for l in self.list: - if(l.freturn and l.fcall): - print('%f (%02d): %s(); (%.3f us)' % (l.time, \ - l.depth, l.name, l.length*1000000)) - elif(l.freturn): - print('%f (%02d): %s} (%.3f us)' % (l.time, \ - l.depth, l.name, l.length*1000000)) - else: - print('%f (%02d): %s() { (%.3f us)' % (l.time, \ - l.depth, l.name, l.length*1000000)) - print(' ') - else: - fp = open(filename, 'w') - print(filename) - for l in self.list: - if(l.freturn and l.fcall): - fp.write('%f (%02d): %s(); (%.3f us)\n' % (l.time, \ - l.depth, l.name, l.length*1000000)) - elif(l.freturn): - fp.write('%f (%02d): %s} (%.3f us)\n' % (l.time, \ - l.depth, l.name, l.length*1000000)) - else: - fp.write('%f (%02d): %s() { (%.3f us)\n' % (l.time, \ - l.depth, l.name, l.length*1000000)) - fp.close() -# Class: Timeline -# Description: -# A container for a suspend/resume html timeline. In older versions -# of the script there were multiple timelines, but in the latest -# there is only one. -class Timeline: - html = {} - scaleH = 0.0 # height of the row as a percent of the timeline height - rowH = 0.0 # height of each row in percent of the timeline height - row_height_pixels = 30 - maxrows = 0 - height = 0 - def __init__(self): - self.html = { - 'timeline': '', - 'legend': '', - 'scale': '' - } - def setRows(self, rows): - self.maxrows = int(rows) - self.scaleH = 100.0/float(self.maxrows) - self.height = self.maxrows*self.row_height_pixels - r = float(self.maxrows - 1) - if(r < 1.0): - r = 1.0 - self.rowH = (100.0 - self.scaleH)/r -# Class: TestRun -# Description: -# A container for a suspend/resume test run. This is necessary as -# there could be more than one, and they need to be separate. -class TestRun: - ftrace_line_fmt_fg = \ - '^ *(?P